在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
这是摆脱错误的正确方法,还是有更强大的解决方案?
答案 0 :(得分:2)
这是known problem(另见this)。 Libgcc(默认情况下clang链接)不提供清理128位类型的必要符号,因此您需要让clang使用compiler-rt运行库来代替。