首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使clang的内存消毒剂报告统一使用变量,而不决定分支

使clang的内存消毒剂报告统一使用变量,而不决定分支
EN

Stack Overflow用户
提问于 2018-07-04 16:17:02
回答 1查看 1.1K关注 0票数 1

我正在试验Clang6.0的内存消毒剂(MSan)。代码是用

代码语言:javascript
复制
clang++ memsans.cpp -std=c++14 -o memsans -g -fsanitize=memory -fno-omit-frame-pointer -Weverything

在Ubuntu 18.04。根据MSan 文档

它将允许未初始化内存的复制,以及简单的逻辑和算术操作。通常,MemorySanitizer静默地跟踪未初始化数据在内存中的传播,并根据未初始化的值报告代码分支被取(或不取)时的警告。

因此,下面的代码不会生成任何错误

代码语言:javascript
复制
#include <iostream>

class Test {
public:
    int x;
};

int main() {
    Test t;
    std::cout << t.x;
    std::cout << std::endl;
    return 0;
}

但这会

代码语言:javascript
复制
#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报告这类错误?

EN

回答 1

Stack Overflow用户

发布于 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中使用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51177708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档