首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何抑制来自UBsan的一些无符号整数溢出错误?

如何抑制来自UBsan的一些无符号整数溢出错误?
EN

Stack Overflow用户
提问于 2015-10-26 17:27:04
回答 2查看 4.5K关注 0票数 7

我的大多数-fsanitize=unsigned-integer-overflow错误都是错误,但有时我会显式地按预期使用它,这会导致UBSan产生假阳性。

是否有一种方法可以关闭特定表达式的UBSan无符号整数溢出检查?

作为对Shafik评论的响应,下面是一个示例:

代码语言:javascript
复制
unsigned a = 0;
unsigned b = a - 1; // error: unsigned integer overflow

大多数情况下,这是一个错误,有时不是。使用UBSan,人们可以找到每次发生的错误,修复错误,但我还没有找到一种方法来压制假阳性。

编辑2:要启用检查,需要通过-fsanitize=integer (启用所有整数检查)或fsanitize=unsigned-integer-overflow。从下面的评论来看,这张支票似乎只有clang,而不是GCC的版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-26 17:43:09

如果要将操作包装在一个函数中,可以使用类似于so ( __attribute__((no_sanitize("integer"))) )的http://melpon.org/wandbox/permlink/AjzimH2LjwsPy4P8

代码语言:javascript
复制
__attribute__((no_sanitize("integer")))
unsigned calc( unsigned a )
{
    return a - 1 ;
}

我是通过错误报告/特性请求对UbSAN的抑制支持发现的。

clang 属性文档没有指示任何应用于此的方法,只适用于一个函数:

使用函数声明上的no_sanitize属性来指定不应该对该函数应用特定的工具或仪器集。该属性接受字符串文本列表,其含义与-fno-sanitize=标志所接受的值相同。(例如,attribute((no_sanitize("address",“线程”))指定不应将AddressSanitizer和ThreadSanitizer应用于该函数。

票数 12
EN

Stack Overflow用户

发布于 2015-10-26 17:38:47

使用按位的NOT操作符似乎可以修复所谓的运行时错误。

代码语言:javascript
复制
auto b = ~a;
auto c = ~a - 5;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33351891

复制
相关文章

相似问题

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