Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

371
Views
¿Es posible detectar una excepción de desbordamiento de enteros en C (POSIX/Linux) a través de SIGFPE FPE_INTOVF?

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:

Contexto (lo que probablemente ya sepa): excepciones 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 .

El problema: ¿qué pasa con 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).

La pregunta:

¿ 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.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

TL;RD:

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 .

No es una respuesta a mi pregunta, pero vale la pena señalar:

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.

Créditos

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!