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