clang++ - 叮当内存 sanitizer ;如何让它打印源行号

标签 clang++ msan

我正在用 clang++ -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -g -O0 编译我的程序当我运行它时,输出是:

matiu@matiu-laptop:~/projects/json++11/build$ ./tests 
.......==10534== WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x7fe7602d4a51 (/home/matiu/projects/json++11/build/tests+0x106a51)
    #1 0x7fe7602dfca6 (/home/matiu/projects/json++11/build/tests+0x111ca6)
    ...
    #31 0x7fe75edbaec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4)
    #32 0x7fe7602808dc (/home/matiu/projects/json++11/build/tests+0xb28dc)

  Uninitialized value was created by a heap allocation
    #0 0x7fe76026e7b3 (/home/matiu/projects/json++11/build/tests+0xa07b3)
    #1 0x7fe7602ee7da (/home/matiu/projects/json++11/build/tests+0x1207da)
    ...
    #18 0x7fe7602c1c4c (/home/matiu/projects/json++11/build/tests+0xf3c4c)
    #19 0x7fe7602873fa (/home/matiu/projects/json++11/build/tests+0xb93fa)

SUMMARY: MemorySanitizer: use-of-uninitialized-value ??:0 ??
Exiting

我怎样才能让它像漂亮的例子一样显示行号:http://clang.llvm.org/docs/MemorySanitizer.html

我怀疑这可能是不可能的,因为我的程序是一大堆嵌套的 lambda 表达式:https://github.com/matiu2/json--11/blob/master/tests.cpp

最佳答案

使用地址清理器时,我注意到我需要定义这些环境变量:

  • ASAN_OPTIONS=symbolize=1 (仅在使用 GCC > 4.8 编译时才需要)和
  • ASAN_SYMBOLIZER_PATH=$(which llvm-symbolizer)我认为符号就是你要找的。它将符号转换为带有行号和列的文件名。

  • 关于 memory sanitizer project website它写道:

    Symbolization

    Set MSAN_SYMBOLIZER_PATH environment variable to the path to llvm-symbolizer binary (normally built with LLVM). MemorySanitizer will use it to symbolize reports on-the-fly.



    所以你需要MSAN_SYMBOLIZER_PATH设置类似于 ASAN_SYMBOLIZER_PATH .

    关于clang++ - 叮当内存 sanitizer ;如何让它打印源行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24399485/

    相关文章:

    c++ - Clang LLVM C++ `std::optional<std::optional<int>>` 令人惊讶的比较行为

    c++ - clang:没有外线的虚拟方法定义(纯抽象 C++ 类)

    c++ - 内存 sanitizer

    c++ - move 构造函数(错误 : call to implicitly-deleted copy constructor)

    c++ - 代入失败有时是错误?

    使用 -O1 编译时 C++ regex_search 中断

    linux - clang memory sanitizer (linux) 不报错

    c++ - 在带有 libstdc++ 的 Linux 上使用 -fsanitize=memory 和 clang

    c++ - 内存清理程序报告全局对象构造中未初始化值的使用