C ++: ¿es seguro usar longjmp y setjmp?

¿Es seguro usar longjmp y setjmp en C ++ en linux / gcc con respecto a lo siguiente?

  1. Manejo de excepciones (no estoy implementando el manejo de excepciones usando longjmp / setjmp. Quiero saber qué efectos secundarios tendrá longjmp / setjmp en el manejo de excepciones estándar)
  2. *this puntero
  3. Señales
  4. Punteros inteligentes (punteros compartidos e intrusivos de boost)
  5. Cualquier otra cosa que puedas pensar

setjmp() / longjmp() anula por completo el desenrollado de la stack y, por lo tanto, el manejo de excepciones, así como RAII (destructores en general).

Desde 18.7 / 4 “Otros soporte de tiempo de ejecución” en el estándar:

Si cualquier objeto automático sería destruido por una excepción lanzada transfiriendo control a otro punto (destino) en el progtwig, entonces una llamada a longjmp(jbuf, val) en el punto de lanzamiento que transfiere el control al mismo punto (destino) tiene un comportamiento indefinido .

Entonces, la conclusión es que setjmp() / longjmp() no funcionan bien en C ++.

No es específico de Linux o gcc; setjmp / longjmp y C ++ no funcionan demasiado bien si está usando longjmp para dejar un contexto donde hay variables automáticas con destructores.

Los destructores no se ejecutarán, lo que puede provocar una pérdida de memoria u otro comportamiento incorrecto.

Solo he aprendido sobre esos comandos, y nunca los he visto en acción en aplicaciones reales.

En mi humilde opinión, es seguro decir que no es seguro usarlos: los desarrolladores no entenderán lo que hacen esas API “impopulares”.