gnz*_*lbg 6 c++ undefined-behavior ubsan
我的大多数-fsanitize=unsigned-integer-overflow错误都是错误,但有时我会明确地按预期使用它,这会导致UBSan产生误报.
有没有办法为特定表达式转换UBSan无符号整数溢出检查?
编辑回应Shafik评论,这是一个例子:
unsigned a = 0;
unsigned b = a - 1; // error: unsigned integer overflow
Run Code Online (Sandbox Code Playgroud)
大多数时候这是一个错误,有时它不是.使用UBSan,每次发生时都可以找到,修复错误,但我还没有找到一种方法来消除误报.
编辑2:启用检查需要通过-fsanitize=integer(以启用所有整数检查)或fsanitize=unsigned-integer-overflow.从下面的评论看来,支票只能在clang中使用,而不是在GCC中.
Sha*_*our 10
如果你想将操作包装在一个函数中,你可以__attribute__((no_sanitize("integer")))像这样使用它(实时看到它):
__attribute__((no_sanitize("integer")))
unsigned calc( unsigned a )
{
return a - 1 ;
}
Run Code Online (Sandbox Code Playgroud)
我通过错误报告/功能请求找到了这个UbSAN的抑制支持.
关于属性的clang 文档并未指出除函数之外的任何应用方法:
使用函数声明中的no_sanitize属性指定不应将特定检测或一组检测应用于该函数.该属性采用字符串文字列表,其含义与-fno-sanitize = flag接受的值相同.例如,attribute((no_sanitize("address","thread")))指定不应将AddressSanitizer和ThreadSanitizer应用于该函数.