Odpovídáte na názor ke článku SEH v Linuxu (C++).
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).
Intenzivně se zabývám programováním zejména v jazyce C++. Vyvíjím vlastní knihovny, vzory, techniky, používám šablony, to vše proto, aby se mi usnadnil život při návrhu aplikací. Pracoval jsem jako programátor ve společnosti Seznam.cz. Nyní jsem se usadil v jednom startupu, kde vyvíjím serverové komponenty a informační systémy v C++
Přečteno 57 608×
Přečteno 27 722×
Přečteno 26 403×
Přečteno 24 367×
Přečteno 22 864×