ich reproduzieren das Problem durch diese einfache Demo:g ++ Fehler? (Bool_val 0: 1) gibt weder 0 noch 1
// bool_test_func.cpp
#include <stdio.h>
void func(bool* b) {
int a = (*b ? 0 : 1);
printf("%d\n", a); // EXPECT ether 0 or 1 here
}
// bool_test.cpp
void func(bool* b);
int main() {
int n = 128;
func((bool*)&n);
return 0;
}
-O0 kompilieren und ausführen:
g++ -g -O0 -Wall -o bool_test bool_test.cpp bool_test_func.cpp
[email protected]:~/testing/c++$ ./bool_test
0
-O1 Kompilieren und Ausführen (unerwartet Ergebnis):
g++ -g -O1 -Wall -o bool_test bool_test.cpp bool_test_func.cpp
[email protected]:~/testing/c++$ ./bool_test
129
Wenn ich den -O2 ASM-Code überprüfen, ich denke, es ist ein g ++ Fehler ist, g ++ 's optimzation Code denken immer, der Boolesche Wert Ether 1 oder 0:
00000000004005e6 : 4005e6: 48 83 ec 08 sub $0x8,%rsp 4005ea: 0f b6 37 movzbl (%rdi),%esi 4005ed: 83 f6 01 xor $0x1,%esi #just XOR the bool val 4005f0: 40 0f b6 f6 movzbl %sil,%esi 4005f4: bf 94 06 40 00 mov $0x400694,%edi 4005f9: b8 00 00 00 00 mov $0x0,%eax 4005fe: e8 9d fe ff ff callq 4004a0 400603: 48 83 c4 08 add $0x8,%rsp 400607: c3 retq 400608: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 40060f: 00
gcc Version 4.9.2 (Debian 4.9.2-10)
Ist das g ++ Verhalten von Design? Wie kann ich diese falsche Optimierung deaktivieren? Danke ~
gcc Version 4.9.2 (Debian 4.9.2-10) – mikewei
Interessantes '# include'. – erip
Die Optimierung ist nicht falsch: Ein Bool kann nur 0 oder 1 enthalten. Was du eingibst, ist ein "int" -Typ, der als "bool" markiert wird, undefiniertes Verhalten folgt. – Quentin