मैं इस सरल डेमो द्वारा समस्या को पुन:जी ++ बग? (Bool_val 0: 1) रिटर्न न 0 और न ही 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 संकलन और चलाएँ:
g++ -g -O0 -Wall -o bool_test bool_test.cpp bool_test_func.cpp
[email protected]:~/testing/c++$ ./bool_test
0
-O1 संकलन और चलाने (अप्रत्याशित परिणाम):
g++ -g -O1 -Wall -o bool_test bool_test.cpp bool_test_func.cpp
[email protected]:~/testing/c++$ ./bool_test
129
जब मैं -O2 एएसएम कोड की जांच, मुझे लगता है कि यह एक छ ++ बग, है जी ++ के optimzation कोड हमेशा लगता है bool मूल्य ईथर 1 या 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
जीसीसी संस्करण 4.9.2 (Debian 4.9.2-10)
इस छ ++ डिजाइन द्वारा व्यवहार है? मैं इस गलत अनुकूलन को कैसे अक्षम कर सकता हूं? धन्यवाद ~
जीसीसी संस्करण 4.9.2 (डेबियन 4.9.2-10) – mikewei
दिलचस्प '# शामिल'। – erip
अनुकूलन गलत नहीं है: एक बूल में केवल 0 या 1 हो सकता है। आप जो भी गुजर रहे हैं वह 'int' टाइप-दंड 'बूल' के रूप में दंडित है, अपरिभाषित व्यवहार ensues। – Quentin