Clang ++ LSAN和UBSAN导致对`__ubsan_handle_add_overflow'的未定义引用

问题描述

当我在使用编译器清理程序时,clang++上仅启用LSAN和ubsan链接错误使我感到困惑。

请注意,当我删除-fsanitize=leak或将以下标记一起添加-fsanitize=leak -fsanitize-trap=undefined时,链接问题消失了。

还请注意,这种奇怪的链接错误似乎仅在使用clang++时发生。 g++在下面显示的所有情况下都能很好地工作。

$ clang++-11 -fsanitize=undefined ../main.cpp && ./a.out
../main.cpp:17:5: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior ../main.cpp:17:5 in

$ clang++-11 -fsanitize=undefined -fsanitize=leak ../main.cpp && ./a.out
/usr/bin/ld: /tmp/main-920ee1.o: in function `main':
main.cpp:(.text+0x6a): undefined reference to `__ubsan_handle_add_overflow'
clang: error: linker command Failed with exit code 1 (use -v to see invocation)

$ clang++-11 -fsanitize=undefined -fsanitize=leak -fsanitize-trap=undefined ../main.cpp && ./a.out
Illegal instruction

$ clang++-11 -v
Debian clang version 11.0.0-2
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/10
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/10
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/10
Candidate multilib: .;@m64
Selected multilib: .;@m64

任何线索都可能有所帮助。谢谢。

如果您需要main.cpp的源代码(您可能永远都不需要):

int main(int argc,char **argv) {
  int k = 0x7fffffff;
  k += argc;
  return 0;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)