Clang++ 6.0 内存清理器未报告返回值指示条件分支的函数中的未初始化局部变量



以下代码(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 是位精确的:它可以跟踪 位域。它将容忍复制未初始化的内存,并且 简单的逻辑和算术运算。通常 内存清理器静默地跟踪未初始化数据的传播 内存,并在使用代码分支(或不采用代码分支(时报告警告 采取(,取决于未初始化的值。

这显然符合这个用例,因为if分支将根据sum的初始值来获取。但是,运行此代码时不显示任何错误/警告

clang++ -fsanitize=memory -fsanitize-memory-track-origins -O0 -std=c++14 src.cpp -o src

Clang 6.0 用于 Linux x86_64。

sum不是未初始化的,因为下一条指令是sum变量的赋值。 此代码与以下内容相同:

int sum = x + y;

这就是它被初始化的原因。

最新更新