【发布时间】:2018-03-11 20:48:18
【问题描述】:
当使用 clang 和/或 gcc 时,有没有一种方法可以让编译器默认执行有符号整数溢出检查(例如,如果检测到,则中止) - 但同时 选择退出对特定变量或操作的检查?
【问题讨论】:
当使用 clang 和/或 gcc 时,有没有一种方法可以让编译器默认执行有符号整数溢出检查(例如,如果检测到,则中止) - 但同时 选择退出对特定变量或操作的检查?
【问题讨论】:
我可以推荐你KINT。例子:()
动态检查:
使用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 运行时支持)。详细信息:
【讨论】:
add rax, rbx; jo overflow_handler 之类的东西将是为签名添加发出),并且只能选择退出“热路径”检查。