gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:32:14 26 4
gpt4 key购买 nike

以下代码(在 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 is bit-exact: it can track uninitialized bits in a bitfield. It will tolerate copying of uninitialized memory, and also simple logic and arithmetic operations with it. In general, MemorySanitizer silently tracks the spread of uninitialized data in memory, and reports a warning when a code branch is taken (or not taken) depending on an uninitialized value.

这显然符合此用例,因为 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;

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

关于c++ - Clang++ 6.0 Memory Sanitizer 不报告返回值指示条件分支的函数中未初始化的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51027959/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com