Siento que esta es una pregunta estúpida, pero no he encontrado información sobre el tema (ni aquí ni en ningún lado), así que aquí está la pregunta:
SIGFPE
y campo si_code
En POSIX/Linux tenemos un tipo particular de señal llamada SIGFPE
(que a pesar de su nombre, se usa tanto para errores aritméticos de coma flotante como de enteros). Cuando registramos un controlador de señal para SIGFPE
usando sigaction()
, nuestro controlador también recibe un campo llamado si_code
que explica por qué se generó la excepción SIGFPE
particular. Uno de los posibles valores de si_code
es, por ejemplo, FPE_INTDIV
y puede probarlo rápidamente dividiendo un int
por 0
.
FPE_INTOVF
? Mi pregunta es sobre un si_code
en particular, que es FPE_INTOVF
. Este código se describe como Value signalling integer overflow in case of SIGFPE signal
.
El problema es que nunca he encontrado un ejemplo de esta señal, ni encontré una manera de hacer que el sistema operativo emita este tipo de señal: cuando hago un desbordamiento de enteros en C, no se lanza ninguna excepción SIGFPE
. Pero el valor FPE_INTOVF
para SIGFPE
es una especie de pista de que tal vez sea posible hacer que el host lance en caso de desbordamientos de enteros (como ya lo hace para la división de enteros por cero).
¿ FPE_INTOVF
es inutilizable? ¿Es solo un marcador de posición para un tipo de señal que ningún sistema operativo compatible con POSIX ha implementado alguna vez? ¿O es posible indicarle al sistema operativo que envíe este tipo de señal en caso de desbordamiento de enteros?
Estoy realmente interesado en capturar señales FPE_INTOVF
de un programa C usando sigaction()
.
PD: reconozco que el desbordamiento de enteros sin signo no es técnicamente un error en C (no existe en absoluto en C, ya que toda la aritmética de enteros sin signo tiene un comportamiento de "envoltura"), pero el desbordamiento de enteros con signo es de hecho un comportamiento indefinido, así que espero que FPE_INTOVF
maneja este último.
Las excepciones de tipo SIGFPE FPE_INTOVF
parecen lanzarse solo cuando el hardware subyacente es compatible con ellas. Por ejemplo, en Linux, estos son los arcos que pueden FPE_INTOVF
: alpha
, ia64
, m68k
, mips
, parisc
, s390
y superh
.
Mi pregunta era sobre FPE_INTOVF
en particular, pero si uno solo quiere verificar el desbordamiento de enteros en general, vale la pena señalar que hay formas alternativas de hacerlo: funciones específicas del compilador como __builtin_sadd_overflow()
( lea más aquí ) o específicas del compilador indicadores como -ftrapv
en GCC. Consulte también esta y estas preguntas relacionadas en SO.
Me gustaría agradecer a los usuarios KamilCuk , Steve Summit y Nate Eldredge por sus contribuciones a esta respuesta a través de sus comentarios.
PD: en caso de que alguien más quiera agregar otra información sobre FPE_INTOVF
, puede publicar otra respuesta a esta pregunta, o puede escribir un comentario a esta misma respuesta, y editaré la respuesta para agregar la información adicional.