clang:-fsanitize =未定义128个整数运算(未定义引用`__muloti4')

时间:2018-04-12 10:00:06

标签: c clang linker-errors sanitizer ubsan

在clang中,如果Undefined Behavior Sanitizer-fsanitize=undefined)程序使用128位整数时,我会遇到链接错误。链接错误引发__muloti4

$ cat example.c
__int128_t a;
int main (void) {
  a = a * a;
  return 0;
}

$ clang -fsanitize=undefined example.c 
/tmp/example-df4873.o: In function `main':
example.c:(.text+0x4c): undefined reference to `__muloti4'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

(使用clang 4.0.1在Ubuntu 17.10上测试过。)

使用gcc,它开箱即用(gcc -fsanitize=undefined example.c)。

与clang合作的是以下调用,但我完全不理解它(--rtlib=compiler-rt),对我来说也不是这样:

clang -lgcc_s -lubsan --rtlib=compiler-rt -fsanitize=undefined /tmp/example.c

我通过反复试验找到了它,但是使用clang和链接某个gcc库感觉不对。根据{{​​3}}。

,也无需明确链接ubsan

这是摆脱错误的正确方法,还是有更强大的解决方案?

1 个答案:

答案 0 :(得分:2)

这是known problem(另见this)。 Libgcc(默认情况下clang链接)不提供清理128位类型的必要符号,因此您需要让clang使用compiler-rt运行库来代替。