Llvm 建筑libc++;由于MemorySinitizer警告,使用MemorySinitizer检测失败

Llvm 建筑libc++;由于MemorySinitizer警告,使用MemorySinitizer检测失败,llvm,llvm-clang,libc++,msan,Llvm,Llvm Clang,Libc++,Msan,我正在尝试使用MemorySanitizer工具构建libc++,这样我就可以使用MemorySanitizer构建我自己的项目。我正在Ubuntu 16.04上使用Clang8.01 我按照给出的说明进行了操作,但构建最初由于链接器错误而失败。我通过使用lld而不是默认链接器更正了链接器错误。但是,由于MemorySInitiatizer警告,生成随后失败: [ 0%] Built target LLVMDemangle [ 4%] Built target LLVMSupport [

我正在尝试使用MemorySanitizer工具构建libc++,这样我就可以使用MemorySanitizer构建我自己的项目。我正在Ubuntu 16.04上使用Clang8.01

我按照给出的说明进行了操作,但构建最初由于链接器错误而失败。我通过使用lld而不是默认链接器更正了链接器错误。但是,由于MemorySInitiatizer警告,生成随后失败:

[  0%] Built target LLVMDemangle
[  4%] Built target LLVMSupport
[  4%] Built target LLVMTableGen
[  5%] Built target obj.llvm-tblgen
[  5%] Built target llvm-tblgen
[  5%] Building AttributesCompatFunc.inc...
==6384==WARNING: MemorySanitizer: use-of-uninitialized-value
    #0 0x51ee14 in _M_lower_bound /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_tree.h:1940:7
    #1 0x51ee14 in find /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_tree.h:2566
    #2 0x51ee14 in find /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_map.h:1194
    #3 0x51ee14 in llvm::RecordKeeper::getClass(llvm::StringRef) const /opt/llvm/llvm-801/include/llvm/TableGen/Record.h:1612
    #4 0xa2ff5c in llvm::TGParser::ParseClass() /opt/llvm/llvm-801/lib/TableGen/TGParser.cpp:2648:28
    #5 0xa2fceb in llvm::TGParser::ParseObject(llvm::MultiClass*) /opt/llvm/llvm-801/lib/TableGen/TGParser.cpp:3010:12
    #6 0xa37c9a in ParseObjectList /opt/llvm/llvm-801/lib/TableGen/TGParser.cpp:3022:9
    #7 0xa37c9a in llvm::TGParser::ParseFile() /opt/llvm/llvm-801/lib/TableGen/TGParser.cpp:3030
    #8 0x99fa00 in llvm::TableGenMain(char*, bool (*)(llvm::raw_ostream&, llvm::RecordKeeper&)) /opt/llvm/llvm-801/lib/TableGen/Main.cpp:100:14
    #9 0x8aa738 in main /opt/llvm/llvm-801/utils/TableGen/TableGen.cpp:253:10
    #10 0x7f11477df82f in __libc_start_main /build/glibc-LK5gWL/glibc-2.23/csu/../csu/libc-start.c:291
    #11 0x297028 in _start (/opt/llvm/llvm-801-msan/bin/llvm-tblgen+0x297028)

SUMMARY: MemorySanitizer: use-of-uninitialized-value /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_tree.h:1940:7 in _M_lower_bound
Exiting
lib/IR/CMakeFiles/AttributeCompatFuncTableGen.dir/build.make:93: recipe for target 'lib/IR/AttributesCompatFunc.inc' failed
make[2]: *** [lib/IR/AttributesCompatFunc.inc] Error 77
CMakeFiles/Makefile2:1628: recipe for target 'lib/IR/CMakeFiles/AttributeCompatFuncTableGen.dir/all' failed
make[1]: *** [lib/IR/CMakeFiles/AttributeCompatFuncTableGen.dir/all] Error 2
Makefile:151: recipe for target 'all' failed
make: *** [all] Error 2
由于说明建议构建主干,我尝试构建最新的发布标签(8.01),但这会生成完全相同的警告。问题似乎出在GCC的头文件中,所以也许我需要针对不同的标准库头文件进行编译


我也尝试了以下基本步骤,但出现了相同的错误。

include/c++/9/bits/stl_tree.h
是一个libstdc++文件,而不是libc++文件。我遇到了OP描述的相同问题。找到了解决方案吗?我尝试了这个命令
cmake../llvm-DCMAKE\u BUILD\u TYPE=Release-DLLVM\u USE\u SANITIZER=Memory-DCMAKE\u C\u COMPILER=clang-DCMAKE\u CXX\u COMPILER=clang++-DCMAKE\u CXX\u FLAGS=“-stdlib=libc++”-DCMAKE\u EXE\u LINKER\u FLAGS=“-lc abi-G“Ninja”
,并且在llvm::StringRef::split中的
0 0x55572803724中出现了内存清理错误(llvm::SmallVectorImpl&,char,int,bool)const/home/antonin/llvm-project-llvmorg-8.0.0/llvm/lib/Support/StringRef.cpp:349:3
您正在使用msan仪器构建llvm-tblgen,它会出现误报。您需要使用未使用
的llvm-tblgen-DLLVM\u-use\u-SANITIZER=Memory
。假设它是按照/my-build/bin/llvm-tblgan构建的,通过
-DLLVM\u TABLEGEN=“/my build/bin/llvm tblgan”
发送给cmake。如果有人仍然存在这些问题,请参阅我在帖子()中最初提到的链接中的构建说明已经更新,现在可以工作了!问题似乎是给出的原始指令解释了如何在MSAN指令插入打开的情况下构建所有LLVM,但实际上,我们只需要构建libc++,指令现在就是这样做的。