默认情况下检查签名溢出,但选择退出

时间:2018-03-11 20:48:19

标签: c++ gcc clang

当使用clang和/或gcc时,有没有办法可以让编译器默认执行有符号整数溢出检查(例如,如果检测到则中止) - 但同时选择检查特定变量或操作?

1 个答案:

答案 0 :(得分:0)

我可以推荐你KINT。例:() enter image description here

动态检查:

使用clang++使用-fsanitize=undefined标记编译和链接您的程序。确保使用clang++(不是ld)作为链接器,以便可执行文件与正确的UBSan运行时库链接。如果您正在编译/链接C代码,则可以使用clang代替clang++

% cat test.cc
int main(int argc, char **argv) {
  int k = 0x7fffffff;
  k += argc;
  return 0;
}
% clang++ -fsanitize=undefined test.cc
% ./a.out
test.cc:3:5: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int'

为每种检查定义所需的行为:

  • fsanitize=...:打印详细的错误报告并继续执行(默认);
  • fno-sanitize-recover=...:打印详细的错误报告并退出程序;
  • fsanitize-trap=...:执行陷阱指令(不需要UBSan运行时支持)。

详细信息: