首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么gcc-multilib输出对位操作不正确?

为什么gcc-multilib输出对位操作不正确?
EN

Stack Overflow用户
提问于 2021-02-24 22:50:44
回答 2查看 62关注 0票数 4

bug.c

代码语言:javascript
复制
#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进行编译,输出如下:

代码语言:javascript
复制
7fffffff
80000000
0
0

它应该输出

代码语言:javascript
复制
7fffffff
80000000
0
1

我在Ubuntu 20.04上使用gcc 9.3和gcc-multilib。我还对gcc8和gcc10进行了测试。当我使用clang时,输出是正确的。有人知道为什么会这样吗?

EN

回答 2

Stack Overflow用户

发布于 2021-02-25 03:37:23

使用-Wall -Wextra -pedantic -fanalyzer -fsanitize=undefined选项启用所有警告和未定义的行为清除器,您将看到gcc输出此错误

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 
票数 4
EN

Stack Overflow用户

发布于 2021-02-24 23:20:23

这是有符号整数溢出,这在技术上是UB,虽然我很惊讶有人成功地观察到它的比特攻击。通常这是奇怪的循环边界行为。如果您想让奇怪的位操作工作,请使用未签名的int,这是指定的包装。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66359945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档