【问题标题】:Self compiled Clang crashed with ThreadSafeRefCountedBase when using a clang plugin with ast matcher使用带有 ast 匹配器的 clang 插件时,自编译的 Clang 与 ThreadSafeRefCountedBase 崩溃
【发布时间】:2020-10-02 19:16:37
【问题描述】:

对于同一个 LLVM 提交(ea12216fad6e34c4638fcac8a9202c2eada0f95a),clang 的快照版本(来自https://apt.llvm.org)并没有崩溃,而我自己编译的那一个崩溃并出现错误:

clang-11: /tmp/llvm-project/virtualroot/include/llvm/ADT/IntrusiveRefCntPtr.h:98: void llvm::ThreadSafeRefCountedBase<clang::ast_matchers::internal::DynMatcherInterface>::Release() const [Derived = clang::ast_matchers::internal::DynMatcherInterface]: Assertion `NewRefCount >= 0 && "Reference count was already zero."' failed.
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace, preprocessed source, and associated run script.
corrupted double-linked list
Aborted (core dumped)

我正在运行 Ubuntu 18.04。我的构建步骤很简单:

cd /tmp
export CC='gcc-10 -w -static-libgcc'
export CXX='g++-10 -w -static-libstdc++ -static-libgcc'
export TARGET_SHA=ea12216fad6e34c4638fcac8a9202c2eada0f95a
echo $TARGET_SHA
git clone https://github.com/llvm/llvm-project.git
cd llvm-project
git checkout $TARGET_SHA
mkdir build&&cd build
cmake -DLLVM_ENABLE_PROJECTS="clang;compiler-rt" -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD=X86 -G "Unix Makefiles" ../llvm
make

cd /tmp/llvm-project
mkdir virtualroot
pushd build
cmake -DCMAKE_INSTALL_PREFIX=/tmp/llvm-project/virtualroot/ -P cmake_install.cmake

之后,设置环境变量:

export LLVM_VIRT=/tmp/llvm-project/virtualroot
export PATH=$LLVM_VIRT/bin:$PATH
export LD_LIBRARY_PATH=$LLVM_VIRT/lib:$LD_LIBRARY_PATH

我的 clang 前端插件使用了 StatementMatcher,很抱歉我没有想出一种方法来轻松地将它从现有项目中剥离出来。使用-v编译时,输出为:

clang-11 -v -static-libstdc++ -static-libgcc -w -O2 -std=c++20 -g -fPIC -isystem../include -isystem/tmp/llvm-project/virtualroot/include -shared my-plugin.cpp -o my-plugin.so -L/tmp/llvm-project/virtualroot/lib -lclangToolingCore -lclangTooling -lclangFrontendTool -lclangFrontend -lclangDriver -lclangSerialization -lclangCodeGen -lclangParse -lclangSema -lclangStaticAnalyzerFrontend -lclangStaticAnalyzerCheckers -lclangStaticAnalyzerCore -lclangAnalysis -lclangARCMigrate -lclangRewrite -lclangRewriteFrontend -lclangEdit -lclangAST -lclangLex -lclangBasic -lclangASTMatchers -fno-rtti  -lstdc++ -lm
clang version 11.0.0 (https://github.com/llvm/llvm-project.git ea12216fad6e34c4638fcac8a9202c2eada0f95a)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /tmp/llvm-project/virtualroot/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/10
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.5.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/10
Candidate multilib: .;@m64
Selected multilib: .;@m64
 "/home/ubuntu/Desktop/llvm-project/virtualroot/bin/clang-11" -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -disable-free -disable-llvm-verifier -discard-value-names -main-file-name my-plugin.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=none -fmath-errno -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -fno-split-dwarf-inlining -debug-info-kind=limited -dwarf-version=4 -debugger-tuning=gdb -v -resource-dir /home/ubuntu/Desktop/llvm-project/virtualroot/lib/clang/11.0.0 -isystem ../include -isystem /tmp/llvm-project/virtualroot/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/backward -internal-isystem /usr/local/include -internal-isystem /home/ubuntu/Desktop/llvm-project/virtualroot/lib/clang/11.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -w -std=c++20 -fdeprecated-macro -fdebug-compilation-dir /home/ubuntu/plwork/PL-working/my-plugin -ferror-limit 19 -fno-rtti -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -fcolor-diagnostics -vectorize-loops -vectorize-slp -faddrsig -o /tmp/my-plugin-e3f54f.o -x c++ my-plugin.cpp
clang -cc1 version 11.0.0 based upon LLVM 11.0.0git default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/include"
ignoring duplicate directory "/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10"
#include "..." search starts here:
#include <...> search starts here:
 ../include
 /tmp/llvm-project/virtualroot/include
 /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10
 /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10
 /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/backward
 /usr/local/include
 /home/ubuntu/Desktop/llvm-project/virtualroot/lib/clang/11.0.0/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
 "/usr/bin/ld" -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -shared -o my-plugin.so /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/10/crtbeginS.o -L/tmp/llvm-project/virtualroot/lib -L/usr/lib/gcc/x86_64-linux-gnu/10 -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/10/../../.. -L/home/ubuntu/Desktop/llvm-project/virtualroot/bin/../lib -L/lib -L/usr/lib /tmp/my-plugin-e3f54f.o -lclangToolingCore -lclangTooling -lclangFrontendTool -lclangFrontend -lclangDriver -lclangSerialization -lclangCodeGen -lclangParse -lclangSema -lclangStaticAnalyzerFrontend -lclangStaticAnalyzerCheckers -lclangStaticAnalyzerCore -lclangAnalysis -lclangARCMigrate -lclangRewrite -lclangRewriteFrontend -lclangEdit -lclangAST -lclangLex -lclangBasic -lclangASTMatchers -lstdc++ -lm -lgcc -lgcc_eh -lc -lgcc -lgcc_eh /usr/lib/gcc/x86_64-linux-gnu/10/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crtn.o

我猜这个问题很可能是由于系统设置不当造成的。

【问题讨论】:

    标签: clang llvm


    【解决方案1】:

    使用 clang-11 编译 clang 后解决。看来clang和clang插件需要用同一个编译器编译。 (至少主要版本,就我而言,snapshot clang 编译了 git clang,git clang 编译了我的插件)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-03
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 2013-01-31
      • 2019-11-03
      相关资源
      最近更新 更多