ASAN - 抑制外部库中的报告(LLVM 13,Windows)
Posted
技术标签:
【中文标题】ASAN - 抑制外部库中的报告(LLVM 13,Windows)【英文标题】:ASAN - Suppressing Reports in External Libraries (LLVM 13, Windows) 【发布时间】:2022-01-02 19:01:46 【问题描述】:我正在尝试抑制外部库中的 ASAN 问题,因此我关注 llvm-asan-suppressing-reports-in-external-libraries,文档说:
如果您在外部库中遇到问题,我们建议您立即向库维护者报告,以便得到解决 块引用
更新:这里是问题的链接,Issue 45842: AddressSanitizer: bad-free - hello world c extension - Python tracker
ASAN 跟踪
==6968==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x01e7aceb3be0 in thread T0
#0 0x7ffec9a97f31 (D:\a\min_reprex_python_c_extension_asan\min_reprex_python_c_extension_asan\llvm\lib\clang\13.0.0\lib\windows\clang_rt.asan_dynamic-x86_64.dll+0x180037f31)
#1 0x7ffeca696030 (C:\hostedtoolcache\windows\Python\3.10.0\x64\python310.dll+0x180026030)
#2 0x7ffeca67aaaf (C:\hostedtoolcache\windows\Python\3.10.0\x64\python310.dll+0x18000aaaf)
...
#114 0x7ff72208122f (C:\hostedtoolcache\windows\Python\3.10.0\x64\python.exe+0x14000122f)
#115 0x7ffefee17973 (C:\Windows\System32\KERNEL32.DLL+0x180017973)
#116 0x7fff0071a2f0 (C:\Windows\SYSTEM32\ntdll.dll+0x18005a2f0)
Address 0x01e7aceb3be0 is a wild pointer inside of access range of size 0x000000000001.
SUMMARY: AddressSanitizer: bad-free (D:\a\min_reprex_python_c_extension_asan\min_reprex_python_c_extension_asan\llvm\lib\clang\13.0.0\lib\windows\clang_rt.asan_dynamic-x86_64.dll+0x180037f31)
==6968==ABORTING
Here 指向完整 ASAN 跟踪的链接。
到目前为止我做了什么
我创建了一个my_asan.supp
并按照文档中的建议使用ASAN_OPTIONS=suppressions=my_asan.supp
加载它,内容如下:
interceptor_via_fun:_PyObject_Realloc
interceptor_via_fun:realloc
interceptor_via_lib:C:/Python39/python3.dll
interceptor_via_lib:C:/s/eklang/DevOps/clang/bin/LLVM-13.0.0-win64/lib/clang/13.0.0/lib/windows/clang_rt.asan_dynamic-x86_64.dll
interceptor_via_lib:C:/Windows/System32/KERNEL32.DLL
interceptor_via_lib:C:/Windows/SYSTEM32/ntdll.dll
interceptor_via_lib:C:\Python39\python3.dll
interceptor_via_lib:C:\s\eklang\DevOps\clang\bin\LLVM-13.0.0-win64\lib\clang\13.0.0\lib\windows\clang_rt.asan_dynamic-x86_64.dll
interceptor_via_lib:C:\Windows\System32\KERNEL32.DLL
interceptor_via_lib:C:\Windows\SYSTEM32\ntdll.dll
interceptor_via_lib:clang_rt.asan_dynamic-x86_64.dll
interceptor_via_lib:ntdll
interceptor_via_lib:ntdll.dll
interceptor_via_lib:python3
interceptor_via_lib:python3.dll
interceptor_via_lib:KERNEL32
interceptor_via_lib:KERNEL32.dll
这些似乎都不起作用,我做错了什么?我尝试了全路径、正斜杠、反斜杠、dll 名称...
信息
LLVM 13、Windows 10
【问题讨论】:
您在顶部引用了一个大横幅,告诉您该做什么。你有没有朝那个方向调查?是否已经有现有报告,甚至可能有可用的升级或补丁?还是在您的代码中?在这种情况下,首先提取minimal reproducible example。如果到那时错误还不明显,您可以在此处将其添加到您的问题中。 截至今天,llvm 13 是latest release,这是我正在使用的。关于横幅,请参阅AddressSanitizer: bad-free - hello world c extension 我已经在上面发布的链接是您要求的minimal reproducible example。我在这里并不孤单。见sumatrapdf commit 对此感到抱歉,只是该信息预计将内联在问题中。总之,在 hello.c 中有一个函数hello_system()
没有返回类型,然后默认为 int
。我相信它会返回一个指针。至少,这表明您没有在启用警告的情况下进行编译。我错了吗?
没问题,我很高兴有人回复:)。你是对的,我正在编译没有警告,但我确信这不是产生问题的原因,这只是一个代表,在一个真实的项目中,我们在加载一个用 asan-rt 编译的 dll 时看到这个(那个 dll 是在这种情况下不是交流扩展名)。
在reprex中我没有测试my_asan.supp,这是我在本地做的事情,reprex只是为了展示来自asan的跟踪
【参考方案1】:
当一个不是用 asan 编译的可执行文件(在这种情况下是python.exe
)加载一个用 i 编译的 dll。
需要确保首先加载 asan 运行时 以使其发挥神奇作用并正确拦截 malloc
和 free
,在 linux 下这很简单,可以使用 LD_PRELOAD
(那里互联网上有很多关于如何做到这一点的例子)。
虽然在 Windows 中,这似乎是不可能的,因此一种解决方法似乎是制作一个带有 clang_rt.asan-preinit-x86_64.lib
和 clang_rt.asan-x86_64.lib
链接的可执行包装器并从那里调用 python,稍后将加载需要编译的 dll clang_rt.asan_dll_thunk-x86_64.lib
.
整个事情听起来很复杂,但到目前为止似乎有效。 This article? 帮助了我。
【讨论】:
以上是关于ASAN - 抑制外部库中的报告(LLVM 13,Windows)的主要内容,如果未能解决你的问题,请参考以下文章
WebApi.Owin 中的 SuppressDefaultHostAuthentication 也抑制 webapi 外部的身份验证