【发布时间】:2021-10-05 03:26:14
【问题描述】:
我有以下代码,我有信心从垃圾内存中读取,但 clang sanitizers 不会抱怨。
我可以做些什么来让它们触发,或者我应该接受这是限制/错误?
#include <algorithm>
#include <iostream>
#include <vector>
struct B{
int x;
};
struct D : public B{
short y;
D& operator = (const D& other) {
y = other.y;
return *this;
}
};
int main() {
D var1{4,7},var2;
var2=var1;
std::cout << var2.x << " " << var2.y << std::endl;
}
我曾尝试设置 O0,因为这有时会有所帮助,但这次没有。
我也愿意使用 gcc,但我认为 gcc 没有内存清理器,只有 asan。
【问题讨论】:
-
Visual Studio 中 clang-cl 的静态分析器给出了以下信息:警告 GDEC5F24A:第一个函数调用参数是一个未初始化的值 [clang-analyzer-core.CallAndMessage]。不确定最后一点是否有帮助?
-
gcc with -Wall 和 -O 或更高版本表示“警告:'var2.D::
.B::x' 未初始化”。 -
@MarcGlisse 很有趣,我不知道 GCC 警告取决于优化级别... + gcc 静态分析的怪异比 sanitizer 更好... :)
-
@AdrianMole 很有趣,是否有一个 clang 标志可以做到这一点,或者我需要为此使用 scan-build?
-
clang 的内存清理器在它认为的用途方面似乎非常严格,它不会对
int x;volatile int y=x+1;发出警告(它只会传播 y 未初始化的信息),但对int x; volatile int y=x?x:x;会发出警告...使用 iostream,实际使用可能无论如何都在(未检测的)库中。
标签: c++ clang sanitizer memory-sanitizer