Odpověď na názor

Odpovídáte na názor ke článku SEH v Linuxu (C++).

  • 6. 9. 2012 15:14

    ezdiy (neregistrovaný)

    Proboha novacisko, hlavne je neuc takovy kraviny :)

    sigsetjmp() je uberprasacke reseni.

    GCC na vetsine unixu si umi poradit daleko lepe.

    1. nastavit globalni sigsegv signal handler
    2. v handleru si pripravit throw exception info frame
    3. obnovit stack context a zavolat obsluhu throw

    Vyjimky na x86/x86-64 v dnesni dobe totiz pouzivaji itanium abi (DWARF tabulky), veskere try bloky jsou zero-cost. Tj kdyz nekdo provede throw (ci se to takto pres signal ochcije), teprv v tu chvili se pouziji lookup tabulky a podle EIP a popisu stack slotu se unwinduje. O vse se stara soucast C++ runtime, libunwind.

    Pointou je samozrejme to ze vse je v nativni exception handling implementaci, takze nehrozi velmi podivne kolize.

    Konkretni implementaci lze nalezt zde:

    https://github.com/mirrors/gcc/blob/master/libjava/prims.cc#L177

    Vykuchavat to do example pro zvidaveho ctenare nebudu, protoze je to zahravani si s ohnem. Tato implementace se pouziva *pouze* pro NULL dereference. Cokoliv salsiho si rika o velky pruser, protoze je to jenom naplast ve chvili kdy je neco velmi spatne (typicky dangling pointer).