bug.c
#include <stdio.h>
int main()
{
int x = 0x7fffffff;
printf("%x\n", x);
printf("%x\n", ~x);
printf("%x\n", ~x + ~x);
printf("%x\n", !(~x + ~x));
}我使用gcc -m32 bug.c -o bug进行编译,输出如下:
7fffffff
80000000
0
0它应该输出
7fffffff
80000000
0
1我在Ubuntu 20.04上使用gcc 9.3和gcc-multilib。我还对gcc8和gcc10进行了测试。当我使用clang时,输出是正确的。有人知道为什么会这样吗?
发布于 2021-02-25 03:37:23
使用-Wall -Wextra -pedantic -fanalyzer -fsanitize=undefined选项启用所有警告和未定义的行为清除器,您将看到gcc输出此错误
example.cpp:8:11: runtime error: signed integer overflow: -2147483648 * 2 cannot be represented in type 'int'您还可以指定更多的杀菌剂,比如这个-fsanitize=signed-integer-overflow,leak,undefined,address。
参见编译器资源管理器上的演示。请注意,Clang还报告了UB:
example.cpp:8:23: runtime error: signed integer overflow: -2147483648 + -2147483648 cannot be represented in type 'int'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior example.cpp:8:23 in
example.cpp:9:25: runtime error: signed integer overflow: -2147483648 + -2147483648 cannot be represented in type 'int'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior example.cpp:9:25 in 发布于 2021-02-24 23:20:23
这是有符号整数溢出,这在技术上是UB,虽然我很惊讶有人成功地观察到它的比特攻击。通常这是奇怪的循环边界行为。如果您想让奇怪的位操作工作,请使用未签名的int,这是指定的包装。
https://stackoverflow.com/questions/66359945
复制相似问题