如何从UBsan中抑制一些无符号整数溢出错误?

时间:2015-10-26 17:27:04

标签: c++ undefined-behavior ubsan

我的大多数-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中。

2 个答案:

答案 0 :(得分:9)

如果您想将操作包装在一个函数中,可以像{em> see it live 那样使用__attribute__((no_sanitize("integer")))

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

我是通过错误报告/功能请求Suppression support for UbSAN找到的。

clang documentation on attributes除了表示函数外没有任何表示方法:

  

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

答案 1 :(得分:0)

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

auto b = ~a;
auto c = ~a - 5;