7

我的大多数-fsanitize=unsigned-integer-overflow错误都是错误,但有时我会按预期明确使用它,这会导致 UBSan 产生误报。

有没有办法为特定表达式关闭 UBSan 无符号整数溢出检查?

编辑以回应 Shafik 评论,这里是一个例子:

unsigned a = 0;
unsigned b = a - 1; // error: unsigned integer overflow

大多数时候这是一个错误,有时不是。使用 UBSan,每次发生这种情况时都可以找到并修复错误,但我还没有找到一种方法来消除误报。

编辑 2:启用检查需要通过-fsanitize=integer(启用所有整数检查)或fsanitize=unsigned-integer-overflow. 从下面的评论看来,该检查仅在 clang 中可用,而在 GCC 中尚不可用。

4

2 回答 2

11

如果您想将操作包装在一个函数中,您可以__attribute__((no_sanitize("integer")))像这样使用(现场查看):

__attribute__((no_sanitize("integer")))
unsigned calc( unsigned a )
{
    return a - 1 ;
}

我通过对 UbSAN 的错误报告/功能请求抑制支持发现了这一点。

关于属性的 clang文档没有说明将其应用于函数的任何方式:

在函数声明中使用 no_sanitize 属性来指定不应将特定检测或一组检测应用于该函数。该属性采用字符串文字列表,其含义与 -fno-sanitize= 标志接受的值相同。例如,属性((no_sanitize("address", "thread"))) 指定不应将 AddressSanitizer 和 ThreadSanitizer 应用于函数。

于 2015-10-26T17:43:09.447 回答
0

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

auto b = ~a;
auto c = ~a - 5;
于 2015-10-26T17:38:47.350 回答