c-为什么gcc multilib输出不适合按位操作



错误.c

#include <stdio.h>
int main()
{
int x = 0x7fffffff;
printf("%xn", x);
printf("%xn", ~x);
printf("%xn", ~x + ~x);
printf("%xn", !(~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时,输出是正确的。有人知道为什么会发生这种事吗?

使用-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 

这是有符号整数溢出,从技术上讲是UB,尽管我很惊讶有人能用比特攻击观察到它。通常这是奇怪的循环边界行为。如果你想让奇怪的位运算工作,可以使用unsigned int,它被指定为换行。

最新更新