division entière -> SIGFPE, UB ?

division entière -> SIGFPE, UB ? - C - Programmation

Marsh Posté le 13-07-2005 à 20:16:43    

Ceci est un MP à Emmanuel Delahaye :
 

#include <stdlib.h>
#include <stdio.h>
 
int main(int argc, char **argv)
{
        unsigned long long x, y;
 
        if(argc != 3)
                return 1;
 
        x = strtoull(argv[1], NULL, 10);
        y = strtoull(argv[2], NULL, 10);
 
        printf("%llu / %llu == %llu\n", x, y, x / y);
 
        return 0;
}


 
Sur certaines architectures, dont i386, ./a.out 42 0 déclenche un SIGFPE. Sur i386, la division entière est simulée par mon compilateur (gcc -> __udivdi3). Je trouve pas de référence, mais ça me paraît bizarre de me prendre un SIGFPE en faisant du calcul entier : est-ce qu'avec des entiers, la / est UB si le diviseur est nul ?

Reply

Marsh Posté le 13-07-2005 à 20:16:43   

Reply

Marsh Posté le 13-07-2005 à 20:21:46    

merde, c'est un UB ... je suis dans le caca jusqu'au coup ...
 
l'UB, c'est pas de la blague quand on dit que ça peut faire n'importe quoi, flamber la machine, envoyer des mails coquins à tout le carnet d'adresses ...

Reply

Marsh Posté le 13-07-2005 à 20:23:10    

et même pas en fait ... la définition de SIGFPE ANSI parle d'erreur arithmétique sans distinction flottant/entier ...

Reply

Marsh Posté le 13-07-2005 à 20:50:17    

Taz a écrit :

Sur certaines architectures, dont i386, ./a.out 42 0 déclenche un SIGFPE. Sur i386, la division entière est simulée par mon compilateur (gcc -> __udivdi3). Je trouve pas de référence, mais ça me paraît bizarre de me prendre un SIGFPE en faisant du calcul entier : est-ce qu'avec des entiers, la / est UB si le diviseur est nul ?


Avec 1 0 :


PROJET1 a causé une erreur de division dans le module PROJET1.EXE à 017f:00403cbd.
Registres :
EAX=00000001 CS=017f EIP=00403cbd EFLGS=00010246
EBX=00000000 SS=0187 ESP=0073fd10 EBP=0073fd48
ECX=00000001 DS=0187 ESI=00000000 FS=6bbf
EDX=00000000 ES=0187 EDI=00000000 GS=0000
Octets à CS : EIP :
f7 f6 89 c6 89 f8 8b 55 dc f7 f6 89 45 d0 8b 45  
État de la pile :
00000039 00000000 bff7b9c5 81dccf2c 00000001 00000000 00000000 00000000 00000000 00000000 780251ca 00000000 00000000 00860540 0073fd78 00403c0d



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed