c - ¿Por qué la división de enteros por cero no bloquea el programa compilado con gcc?

CorePress2024-01-25  10

La división de enteros por cero no está definida y debería resultar en una excepción de punto flotante y esto es lo que sucede por qué escribo el siguiente código

 int j = 0 ;
 int x = 1 / j;

En este caso el programa simplemente falla con FPE, pero si no uso la variable y usaré valores literales como este int x = 1 / 0; ¡El programa no falla, simplemente asigna algún valor aleatorio a x! Intenté detectar si int x = 1/0; realmente causa un bloqueo al agregar un controlador SIGFPE personalizado, pero como pensé, nunca se invoca durante la división literal por cero, pero sí cuando almaceno 0 en una variable primero. Entonces, parece que la división literal por cero nunca bloquea el programa (me refiero a que la división en sí nunca ocurre), al igual que el compilador (GCC en mi caso) realiza algún truco (por ejemplo, sustituyendo 0 por un número aleatorio).ber) en este caso? ¿O entendí mal algo?

3

Utilice flotante, la división de enteros por cero es UB, por lo que el compilador no está obligado a generar ninguna señal

-tstanisl

28 de marzo de 2021 a las 9:53

1 / 0 podría no realizarse en tiempo de ejecución sino por el compilador. Su valor no está definido.

Veleta

28/03/2021 a las 10:08

1

MS Visual C emite un error de compilación: divide o modifica por cero.

Veleta

28/03/2021 a las 10:11

3

No, lo indefinido es lo indefinido.

Veleta

28/03/2021 a las 10:12

1

¿En qué se diferencia este comportamiento indefinido de todos los demás comportamientos indefinidos?

- n. metro. podría ser una IA

28/03/2021 a las 10:49



------------------------------------

¿Por qué la división de enteros por cero no bloquea el programa compilado con gcc?

Nosotrosll, creo que la respuesta sería: porque puede. Puede estrellarse. No puede fallar.

¿O entendí mal algo?

De C11 6.5.5p5 (el énfasis es mío :p):

El resultado del operador / es el cociente de la división del primer operando por el segundo; el resultado del operador % es el resto. En ambas operaciones, si el valor del segundo operando es cero, el comportamiento no está definido.

El comportamiento no está definido. No está definido qué debe pasar. Puede "estrellarse". No puede estrellarse. Puede generar demonios nasales. El programa puede hacer cualquier cosa.

Deberías escribir sólo programas que sepas cómo se comportarán. Si desea que su programa "falle", llame a abort().

el compilador (GCC en mi caso) también realiza algún truco (por ejemplo, sustitucióning 0 con número aleatorio) en este caso?

La única forma de saberlo es inspeccionar el código ensamblador generado. Podrías usar https://godbolt.org/

1

Buen trabajo con las citas.

- David C. Rankin

28/03/2021 a las 10:17



------------------------------------

Dado que la expresión contiene una constante de división por cero, gcc podría manejar el problema en el momento de la compilación.

SiAl dividir por la variable con valor 0, el compilador le dará la responsabilidad al controlador de excepciones porque la evaluación es impredecible.

Compartir mejorar esta respuesta Seguir Respondido

28 de marzo de 2021 a las 10:19

Beber vino

Beber vino

1

1

1 insignia de bronce

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare