Bonjour
Ma configuration est : Windows 10 + Code::Blocks + TDM64 (gcc 64 bits).
D’un part, on peut dire qu’un programme qui plante est un programme mal conçu, peu importe la nature du plantage. Mais d’autre part, il est rare qu’un programme soit correct du premier coup et lors de la mise au point les messages du compilo sont bien utiles. Ma question se situe dans ce cadre.
Le problème est le suivant (il peut être constaté avec le petit programme donné à la fin) :
- en cas de division par zéro, le programme plante (normal !) mais le CPU ne plante pas : il stoppe le programme et envoi le message d’erreur
ce qui donne en clair : EXCEPTION_INT_DIVIDE_BY_ZEROProcess returned -1073741676 (0xC0000094)- en cas d’overflow le programme peut éventuellement poursuivre (et donnera alors des résultats faux) mais, en cas de plantage, je m’attendais à un comportement identique : un truc du genre
qui en clair correspondrait à EXCEPTION_INT_OVERFLOWProcess returned -1*?????? (0xC00*????)
Mais là, non seulement le programme plante mais le CPU aussi : même au bout de 60 secondes, pas d’interruption, pas de message d’erreur, il semble perdu dans une boucle infinie …
Mes questions : ne serait-il pas préférable de faire apparaître un message d’erreur dans les deux cas ? Que le CPU plante (je ne parle pas du programme), trouvez-vous cela « normal » ou même « banal » ? Sinon, est-ce dû à ma configuration, à un défaut de conception du CPU ou du compilo ? Bref j’aimerais connaître vos avis (éclairés) sur le sujet.
Merci d’avance
--------- Programme -------------------
Pour tester div_test() et div_bug_test(), décommenter la ligne concernée.
PS : dans le cas de la division par zéro, il semble que le compilo court-circuite la partie try/catch. Si c’est dû au fait que cette partie est mal conçue, merci de m’indiquer la bonne manière.
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 #include <iostream> using namespace std; int divise(int x, int n); int divise_bug(int x, int n); void div_test(int x, int y); void div_bug_test(int x, int y); //////////////////////// int main() { int x = 1503 ; div_test(x,5); // div_test(x,0); // division par zéro // div_bug_test(x,5); // overflow (mais pas de division par zéro) return 0; } ///////////////////////// int divise(int x, int n) { int z; __asm__ __volatile__( " mov $0, %%rdx ;" " div %[n] ;" : "=a" (z) : [x] "a" (x), [n] "r" (n) : "cc", "%rdx" ); return(z); } int divise_bug(int x, int n) { int z; __asm__ __volatile__( // " mov $0, %%rdx ;" // rdx contient une valeur inconnue " div %[n] ;" // qui, en général, va causer un overflow : "=a" (z) : [x] "a" (x), [n] "r" (n) : "cc", "%rdx" ); return(z); } void div_test(int x, int y) { int z; cout<<"\n x = "<<x<<"; y = "<<y; try { z = divise(x,y); cout << "; x/y = " << z << endl; } catch (std::exception const & exception) { cout << "Erreur : " << exception.what() << endl; } } void div_bug_test(int x, int y) { int z; cout<<"\n x = "<<x<<"; y = "<<y; try { z = divise_bug(x,y); cout << "; x/y = " << z << endl; } catch (std::exception const & exception) { cout << "Erreur : " << exception.what() << endl; } }
Partager