Clang ++ 6.0 Memory Sanitizer在其返回值指示条件分支的函数中未报告未初始化的局部变量

时间:2018-06-25 16:23:55

标签: c++ clang llvm clang++

下面的代码(在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。

1 个答案:

答案 0 :(得分:2)

sum 尚未初始化,因为下一条指令是sum变量的赋值。 这段代码与:

int sum = x + y;

这就是为什么要初始化它。