【发布时间】:2018-06-25 16:23:55
【问题描述】:
以下代码(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
Clang 6.0 用于 Linux x86_64。
【问题讨论】: