g++错误?(bool_val ?0: 1)既不返回0也不返回1

g++ bug? (bool_val ? 0 : 1) returns neither 0 nor 1

本文关键字:返回 错误 val g++ bool      更新时间:2023-10-16

我用这个简单的演示重现了这个问题:

// 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/0true/1),则xor input, 1完全

然而,因为你给它128, xor的结果是129