使用 -fsanitize=address 在 FreeBSD(clang9 和 clang11)上编译时,Openssl 卡在 SSL_library_init()
Posted
技术标签:
【中文标题】使用 -fsanitize=address 在 FreeBSD(clang9 和 clang11)上编译时,Openssl 卡在 SSL_library_init()【英文标题】:Openssl stucks on SSL_library_init() when compiled on FreeBSD (clang9 and clang11) when using -fsanitize=address 【发布时间】:2022-01-23 21:21:37 【问题描述】:在 -fsanitize=address 中使用 -fsanitize=address 在 FreeBSD 13(OpenSSL 1.1.1k-freebsd 2021 年 3 月 25 日)上启动 Openssl 时,我的软件卡住了clang11,clang9也会出现同样的问题。
这个问题隐隐约约地发生在:
OpenSSL_add_all_algorithms(); SSL_library_init() SSL_load_error_strings();重现问题:
#include <openssl/ssl.h>
int main(int argc, char *argv[])
SSL_library_init();
return EXIT_SUCCESS;
然后编译执行:
clang -lssl -lcrypto -fsanitize=address -o test test.c && ./test
编译正常,但程序卡在 SSL_library_init() 使用 100% 的 CPU。一旦 -fsanitize=address 被删除,一切都会按预期工作。
【问题讨论】:
您遇到了这个错误:reviews.llvm.org/D84509 - ssl 正在调用 qsort,在使用地址清理程序运行时会损坏。我没有 search-fu 知道它什么时候得到修复。 这么长时间以来没有人意识到 LLVM9-LLVM11 和 SSL 存在问题吗?到目前为止,世界上没有人使用 sanitize 编译吗?我有那么幸运吗? 我可以确认问题也发生在 LLVM12 中。 @Petesh 您报告的错误似乎已于 2020 年 9 月 1 日修复(github.com/llvm/llvm-project/issues/46176)所以我不确定我们是否指向同一个错误。 LLVM12 于 2021 年 7 月 8 日发布,问题也发生在 LLVM12 上。另一方面,该行为与该错误中描述的完全一样。 【参考方案1】:将 OP 的解决方案移至答案区域。
我回溯了该错误,这不是 OpenSSL 错误,我已确认这是 cmets 中指出的 LLVM 错误:
(gdb) bt
#0 0x000000000027ffa7 in wrapped_qsort_compar (a=0x80087ed60, b=0x80087eef0)
at /usr/src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc:9741
#1 0x0000000800d6e974 in qsort () from /lib/libc.so.7
#2 0x0000000000280083 in __interceptor_qsort (base=<optimized out>, nmemb=44, size=80,
compar=<optimized out>)
at /usr/src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc:9761
#3 0x0000000800d6f846 in qsort () from /lib/libc.so.7
#4 0x0000000000280083 in __interceptor_qsort (base=<optimized out>, nmemb=164, size=80,
compar=<optimized out>)
at /usr/src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc:9761
#5 0x000000080082b6af in ?? () from /usr/lib/libssl.so.111
#6 0x000000080083120e in ?? () from /usr/lib/libssl.so.111
#7 0x0000000800835f39 in ?? () from /usr/lib/libssl.so.111
#8 0x0000000800b8fe23 in pthread_once () from /lib/libthr.so.3
#9 0x00000008009a1019 in CRYPTO_THREAD_run_once () from /lib/libcrypto.so.111
#10 0x0000000800835ce2 in OPENSSL_init_ssl () from /usr/lib/libssl.so.111
#11 0x00000000002b37a9 in main ()
(gdb)
```
【讨论】:
以上是关于使用 -fsanitize=address 在 FreeBSD(clang9 和 clang11)上编译时,Openssl 卡在 SSL_library_init()的主要内容,如果未能解决你的问题,请参考以下文章