我正在试验Clang6.0的内存消毒剂(MSan)。代码是用
clang++ memsans.cpp -std=c++14 -o memsans -g -fsanitize=memory -fno-omit-frame-pointer -Weverything在Ubuntu 18.04。根据MSan 文档
它将允许未初始化内存的复制,以及简单的逻辑和算术操作。通常,MemorySanitizer静默地跟踪未初始化数据在内存中的传播,并根据未初始化的值报告代码分支被取(或不取)时的警告。
因此,下面的代码不会生成任何错误
#include <iostream>
class Test {
public:
int x;
};
int main() {
Test t;
std::cout << t.x;
std::cout << std::endl;
return 0;
}但这会
#include <iostream>
class Test {
public:
int x;
};
int main() {
Test t;
if(t.x) {
std::cout << t.x;
}
std::cout << std::endl;
return 0;
}理想情况下,我们希望这两个代码样本都生成某种错误,因为它们都在“使用”一个未初始化的变量,即第一个正在打印它。这段代码是一个小测试代码,因此第一个代码中的错误是显而易见的,但是如果它是一个具有类似错误的大型代码库,MSan将完全忽略这一点。是否有任何黑客可以强迫MSan报告这类错误?
发布于 2018-10-06 03:14:32
听起来你的C++库不是用MSan构建的。与ASan和UBSan不同,MSan要求整个程序是在启用msan的情况下构建的。想一想有一个不同的ABI,你不应该连接两个程序建立在不同的msan设置。一个例外是libc,msan为其添加了“拦截器”以使其工作。
如果您编写了自己的代码,希望通过报告msan通常不会出现的错误与msan集成(例如,在创建副本但需要初始化数据的函数中),那么您可以从__msan_check_mem_is_initialized文件:interface.h中使用
https://stackoverflow.com/questions/51177708
复制相似问题