下面的代码(在src.cpp
中)用于测试Clang的Memory Sanitizer(MSan)
#include <iostream>
#include <vector>
int add(int x, int y) {
int sum;
sum = x + y;
return sum;
}
int main() {
if(add(10, 20) > 0) {
std::cout << "Greater";
}
std::cout << std::endl;
return 0;
}
我们可以清楚地看到sum
是统一的,并且会引起不确定的行为。按照MSan Github Wiki
MemorySanitizer精确到位:它可以跟踪内存中未初始化的位 位域。它将允许复制未初始化的内存,并且 简单的逻辑和算术运算。一般来说, MemorySanitizer静默跟踪未初始化数据的传播 内存,并在采取代码分支(或不采取代码分支)时报告警告 取值)。
这显然符合此用例,因为if
分支将基于sum
的初始值进行。但是,运行用
clang++ -fsanitize=memory -fsanitize-memory-track-origins -O0 -std=c++14 src.cpp -o src
在Linux x86_64上使用Clang 6.0。
答案 0 :(得分:2)
sum 尚未初始化,因为下一条指令是sum变量的赋值。 这段代码与:
int sum = x + y;
这就是为什么要初始化它。