2009-09-03 6 views
32

Czy można bezpiecznie używać longjmp i setjmp w C++ na linux/gcc w odniesieniu do poniższych?C++: Bezpieczne korzystanie z longjmp i setjmp?

  1. obsługa wyjątków (nie jestem wdrożenia obsługi wyjątków za pomocą longjmp/setjmp. Chcę wiedzieć, jakie skutki uboczne longjmp/setjmp będą miały na standardowej obsługi wyjątków)
  2. *this wskaźnik
  3. Sygnały
  4. Inteligentne wskaźniki (wspólne i natarczywe wskazówki doładowania)
  5. Cokolwiek jeszcze możesz wymyślić.

Odpowiedz

54

setjmp()/longjmp() całkowicie podważyć stos odwijania i dlatego obsługę wyjątków, jak RAII (destruktory w ogóle).

Od 18,7/4 „Inne wsparcie wykonawczego” w standardzie:

Jeśli jakieś automatyczne obiekty zostaną zniszczone przez rzucony wyjątek przekazującego kontrolę do innego (przeznaczenia) punktu w programie, a następnie połączenia do longjmp(jbuf, val) w punkcie rzutu, który przekazuje sterowanie do tego samego punktu (punktu docelowego) ma niezdefiniowane zachowanie.

Więc dolnej linii jest to, że setjmp()/longjmp() nie dobrze grać w C++.

+0

Czy możesz wyjaśnić, w jaki sposób longjmp miesza się z jawnym usuwaniem pamięci i destruktorami? – jameszhao00

+12

Ogólnie, gdy istnieje jakiś sposób na opuszczenie zakresu w C++ (return, throw, lub cokolwiek innego), kompilator umieści instrukcje wywołania dtors dla wszelkich zmiennych automatycznych, które muszą zostać zniszczone w wyniku opuszczenia tego bloku. 'longjmp()' po prostu przeskakuje do nowej lokalizacji w kodzie, więc nie daje żadnej szansy na wywołanie dtorsów. Norma jest w rzeczywistości mniej szczegółowa - standard nie mówi, że lekarze nie będą wzywani - mówi, że wszystkie zakłady są wyłączone. Nie można polegać na żadnym szczególnym zachowaniu w tym przypadku. –

+0

Nie jestem zbyt zaznajomiony z inteligentnymi wskaźnikami. Jeśli mam inteligentny wskaźnik na stosie, kiedy robię longjmp, czy oznacza to, że inteligentny wskaźnik nie usunie refcount? Ponadto, czy jestem bezpieczny, jeśli wyłączę wyjątki i piszę kod, który nie zwariuje z longjmp? – jameszhao00

-8

Dowiedziałem się tylko o tych poleceniach i nigdy nie widziałem ich w akcji w prawdziwych aplikacjach.

IMHO, można bezpiecznie powiedzieć, że nie jest bezpieczne korzystanie z nich: programiści nie zrozumieją, co robią te "niepopularne" interfejsy API.

+3

To jest dla implementacji coroutines (które wymagają losowego przeskakiwania) – jameszhao00

+11

Doświadczeni programiści będą absolutnie wiedzieć, co robią te "niepopularne" interfejsy API. Od dziesięcioleci są częścią standardowej biblioteki C. – Novelocrat

+23

Doświadczeni programiści będą absolutnie wiedzieć, co robią te funkcje. Będą również wiedzieć, że są to trudne rzeczy do użycia w C (choć czasem konieczne) i wyjątkowo niebezpieczne w C++. –

5

Nie dotyczy to systemu Linux ani gcc; setjmp/longjmp i C++ nie działają zbyt dobrze razem, jeśli używasz longjmp do opuszczenia kontekstu, w którym znajdują się automatyczne zmienne z destruktorami.

Destruktory nie będą działać, co może spowodować wyciek pamięci lub inne złe zachowanie.

Powiązane problemy