clang: -fsanitize=undefined with 128 integer operations (undefined reference to `__muloti4')
clang: -fsanitize=undefined with 128 integer operations (undefined reference to `__muloti4')
在 clang 中,当程序使用 128 位整数时,如果 Undefined Behavior Sanitizer (-fsanitize=undefined
),我会 运行 进入 linking 错误。 linking 错误抱怨 __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
我是通过反复试验找到的,但是对某些gcc库使用clang和link感觉不对。根据 documentation.
也没有必要明确 link 反对 ubsan
这是消除错误的正确方法,还是有更可靠的解决方案?
这是一个 known problem (also see this)。 Libgcc(默认情况下 clang 链接)不提供必要的符号来清理 128 位类型,因此您需要让 clang 改用 compiler-rt 运行时库。
在 clang 中,当程序使用 128 位整数时,如果 Undefined Behavior Sanitizer (-fsanitize=undefined
),我会 运行 进入 linking 错误。 linking 错误抱怨 __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
我是通过反复试验找到的,但是对某些gcc库使用clang和link感觉不对。根据 documentation.
也没有必要明确 link 反对ubsan
这是消除错误的正确方法,还是有更可靠的解决方案?
这是一个 known problem (also see this)。 Libgcc(默认情况下 clang 链接)不提供必要的符号来清理 128 位类型,因此您需要让 clang 改用 compiler-rt 运行时库。