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 运行时 以使其发挥神奇作用并正确拦截 mallocfree,在 linux 下这很简单,可以使用 LD_PRELOAD(那里互联网上有很多关于如何做到这一点的例子)。

虽然在 Windows 中,这似乎是不可能的,因此一种解决方法似乎是制作一个带有 clang_rt.asan-preinit-x86_64.libclang_rt.asan-x86_64.lib 链接的可执行包装器并从那里调用 python,稍后将加载需要编译的 dll clang_rt.asan_dll_thunk-x86_64.lib.

整个事情听起来很复杂,但到目前为止似乎有效。 This article? 帮助了我。

【讨论】:

以上是关于ASAN - 抑制外部库中的报告(LLVM 13,Windows)的主要内容,如果未能解决你的问题,请参考以下文章

asan的使用

如何抑制 LLVM 自动合成警告?

WebApi.Owin 中的 SuppressDefaultHostAuthentication 也抑制 webapi 外部的身份验证

检测到错误后,Can Address Sanitizer会立即中止吗?

如何抑制 s-s-rS 2008 中的空子报表

根据稍后确定的公式字段抑制标题中的徽标