【问题标题】:Clang++ 6.0 Memory Sanitizer not reporting uninitialised local variable in a function whose return value dictates a conditional branchClang ++ 6.0 Memory Sanitizer 未在返回值指示条件分支的函数中报告未初始化的局部变量
【发布时间】: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。

【问题讨论】:

    标签: c++ clang llvm clang++


    【解决方案1】:

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

    int sum = x + y;

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

    【讨论】:

    • 糟糕!我完全忽略了这一点,我的错。
    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    相关资源
    最近更新 更多