g++错误?(bool_val ?0: 1)既不返回0也不返回1
g++ bug? (bool_val ? 0 : 1) returns neither 0 nor 1
我用这个简单的演示重现了这个问题:
// bool_test_func.cpp
#include <stdio.h>
void func(bool* b) {
int a = (*b ? 0 : 1);
printf("%dn", a); // EXPECT ether 0 or 1 here
}
// bool_test.cpp
void func(bool* b);
int main() {
int n = 128;
func((bool*)&n);
return 0;
}
- 0编译并运行
g++ -g -O0 -Wall -o bool_test bool_test.cpp bool_test_func.cpp
mikewei@maclinux:~/testing/c++$ ./bool_test
0
- 01编译并运行(意外结果):
g++ -g -O1 -Wall -o bool_test bool_test.cpp bool_test_func.cpp
mikewei@maclinux:~/testing/c++$ ./bool_test
129
当我检查-O2 ASM代码时,我认为这是一个g++的错误,g++的优化代码总是认为bool值是1或0:
<>之前00000000004005 e6:4005e6: 48 83 ec 08 sub $0x8,%rsp4005ea: 0fb637movzbl (%rdi),%esi4005ed: 83 f6 01 xor $0x1,%esi #只是xor bool值4005f0: 40000f6f6movzbl %sil,%esi4005f4: bf 94 06 4000 mov $0x400694,%edi4005f9: b8 00 00 00 00 00 mov $0x0,%eax4005fe: e8 9d fe ff ff callq 4004a0400603: 48 83 c4 08添加$0x8,%rsp400607: c3返回400608: 0f 1f 84 000 000 000 000 nopl 0x0(%rax,%rax,1)40060 f: 00之前gcc version 4.9.2 (Debian 4.9.2-10)
这是c++的设计行为吗?如何禁用这个错误的优化?谢谢~
我认为这是一个c++的bug。
我必须恭敬地表示不同意见。
如何禁用这个错误的优化?
即使是可能的,实际上也不是错:-)
你正在传递一个非bool指针作为bool指针(底层项目不是bool类型),我很确定这(称为类型双关)调用未定义的行为。
因此,代码可以自由地做任何它想做的事情。
你可以把原型void func(bool* b)
想象成一个合约,你同意只传递指向bool
值的指针。如果你违反了那份合同,一切就都完了。在本例中,您的代码:
int a = (*b ? 0 : 1);
告诉它将false转换为1,将true转换为0。如果您要提供有效的输入(false/0
或true/1
),则xor input, 1
将完全。
然而,因为你给它128
, xor
的结果是129
。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- glad 导致 glfwSwapBuffers 返回错误消息
- 我的模板类方法返回错误类型?
- 共享内存:MapViewOfFile 返回错误 5
- 使用 std::forward_list 返回错误的队列实现
- FFMPEG:sws_scale返回错误:切片参数 0, 2160 无效
- __int64 CString 返回错误的值 - C++ MFC
- C++ OpenGL 中,绘制形状返回错误
- Python os.system() 返回错误值
- 函数从指针 c++ 中获取错误的值并返回错误的答案
- LibClang clang_getArgType() 返回错误的类型
- 除法函数返回错误的值
- 当命令失败时,gzip 会在 C++ 中返回错误代码吗?
- 矩阵逆变器返回错误的反转
- openCL-创建子缓冲区返回错误代码13
- Qt SQL LIKE语句返回错误
- GetLastError()从FtpPutFile()返回错误6
- PfCreateInterface返回错误120(未实现)
- 为什么 Pa_GetStreamTime() 返回错误?
- G++ 在尝试使用 G++ 使用 openCV 进行编译后返回错误