You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Sanitizer编译极简C程序触发‘未处理指令’错误求助

问题:Address Sanitizer编译后程序启动崩溃?

代码示例

#include <stdio.h>

int main() {
    printf("Hello");
    return 0;
}

编译与运行情况

  • 带Address Sanitizer的编译命令:
    clang -fsanitize=address main.c
    
  • 不添加ASan编译时,程序可正常输出Hello;但运行ASan编译生成的a.exe时,触发如下错误:
    .\a.exe
    ==11224==interception_win: unhandled instruction at 0x7ff7d86bffd3: 4c 8d 15 26 00 f5 ff 49
    AddressSanitizer: CHECK failed: sanitizer_common_interceptors_memintrinsics.inc:239 "((__interception::real_memcpy)) != (0)" (0x0, 0x0) (tid=8888)
        <empty stack>
    

环境信息

Windows 11系统,通过choco安装的LLVM版本:

$ clang --version
clang version 17.0.5
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin

问题核心

是否操作有误?这类极简程序搭配ASan本应正常运行才对?


解答

你没有操作错误,这是Clang 17在Windows平台搭配Address Sanitizer的已知兼容性问题——当前安装的Clang默认使用posix线程模型,而Windows上ASan对该线程模型的支持存在缺陷,导致程序启动时无法正确拦截memcpy函数,触发初始化崩溃。

解决办法是编译时指定使用LLD链接器,并切换线程模型为win32,修改后的编译命令如下:

clang -fsanitize=address -fuse-ld=lld -mthread-model=win32 main.c

重新编译后,运行生成的程序即可正常输出Hello,同时ASan也能正常工作。

内容的提问来源于stack exchange,提问作者Rodrigo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:49:51