将内存清理程序与libstdc ++一起使用

soa*_*dos 28 c++ libstdc++ clang++ msan memory-sanitizer

我希望使用-fsanitize=memoryclang中的标志来分析如下的程序:

#include <string>
#include <iostream>
#include <fstream>
using namespace std;

void writeToFile(){
    ofstream o;
    o.open("dum");
    o<<"test"<<endl; //The error is here.
                     //It does not matter if the file is opened this way,
                     //or with o("dum");
    o.close();
}
int main(){
    writeToFile();
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这个程序是正确的,但是当我使用clang++ san.cpp -fsanitize=memory它时失败(在运行时):

UMR in __interceptor_write at offset 0 inside [0x64800000e000, +5)  
==9685== WARNING: MemorySanitizer: use-of-uninitialized-value  
    #0 0x7f48d0899ae5 (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0x7bae5)  
    #1 0x7f48d08d1787 (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0xb3787)  
    #2 0x7f48d08d21e2 (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0xb41e2)  
    #3 0x7f48d08cfd1e (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0xb1d1e)  
    #4 0x7f48d08b1f2d (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0x93f2d)  
    #5 0x7f48d16d60f5 in writeToFile() /home/daniel/programming/test/santest.cpp:10  
    #6 0x7f48d16d61f4 in main /home/daniel/programming/test/santest.cpp:15  
    #7 0x7f48d0261de4 (/lib/x86_64-linux-gnu/libc.so.6+0x21de4)  
    #8 0x7f48d16d5e42 in _start (/home/daniel/programming/test/a.out+0x61e42)  

SUMMARY: MemorySanitizer: use-of-uninitialized-value ??:0 ??
Run Code Online (Sandbox Code Playgroud)

我怎样才能正常工作?

Clang版本3.5,stdlibc ++版本6

use*_*280 16

代码很好,当然但是许多类似的错误是由clang的内存消毒工具的以下要求引起的:

MemorySanitizer(没有动态组件)要求对包括库(在某种程度上除了libc/libm/libpthread)之外的整个程序代码进行检测.

从这里

您使用libstdc ++的cplusplus运行时是未经检测的并导致错误.遗憾的是,您必须遵循该链接中描述的有点繁琐的过程来重建已检测的libstdc ++或切换到libc ++(更简单的方法)


eug*_*nis 5

目前最简单的方法是使用memorysanitizer构建libc ++,然后将程序链接到它.

这是我前一段时间做的,未能处理libc ++构建系统:https: //code.google.com/p/memory-sanitizer/source/browse/bootstrap/build_libcxx.sh

我听说libc ++方面有了改进,也许可以像往常一样构建它(比如CC =/path/to/clang CFLAGS = -fsanitize = memory).