前言
作者在编写一个简单的程序时想试试sanitizer的功能,但是屡次遇到问题,这里记录下解决过程
环境
- Windows11 25H2
- clang+llvm-22.1.8-x86_64-pc-windows-msvc
- msvc 14.44.35207
- CLion 2026.2.0.1
ASan对/MDd的支持问题
clang-cl中,/fsanitizer不支持和/MDd参数同时出现,需要手动指定使用非调试版runtime库:
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")
sanitizer库连接问题
我在CMakeLists.txt中添加了这样一行去开启ASanitizer功能:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address /Oy- /O1")
编译结果是连接失败,查证资料需要手动连接库:
target_link_directories(main PRIVATE "clang+llvm-22.1.8-x86_64-pc-windows-msvc/lib/clang/22/lib/windows")
target_link_libraries(main PRIVATE
clang_rt.asan_dynamic-x86_64
clang_rt.asan_dynamic_runtime_thunk-x86_64
)
程序运行问题
库连接完毕了,用CLion运行程序出现:
D:\CLionProjects\untitled\cmake-build-debug\main.exe
Process finished with exit code -1073741511 (0xC0000139)
结果是DLL存在入口点问题。
以Debug模式启动程序会出现找不到过程入口点??2@YAPEAX_K@Z的信息。
经过查证,发现是clang/22/lib/windows不位于PATH中,且MSVC目录下存在一个同名DLL:MSVC\14.44.35207\bin\Hostx64\x64\clang_rt.asan_dynamic-x86_64.dll。
在CLion中以run的方式启动程序时会带上msvc的path,如果单独运行程序,错误码是-1073741515,即0xC0000135,找不到DLL。
问题就在这里,编译时链接的是clang目录下的dll,运行时采用的是msvc下的dll。
到这里解决方案就很简单了,直接把clang下的dll拷贝过来就行了:
add_custom_command(TARGET main POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"clang+llvm-22.1.8-x86_64-pc-windows-msvc/lib/clang/22/lib/windows/clang_rt.asan_dynamic-x86_64.dll"
"$<TARGET_FILE_DIR:main>")
santizier报告和CLion的santizier窗口问题
到这里还没有完全解决问题,我的主函数中有一个极其明显的泄露:
int main()
{
auto p = new int{1};
return 0;
}
这里没有报告——答案是windows平台上的fsanitizer暂时不支持leak检查。
好吧,那我们就使用其他功能,但是如果我们只是单纯地运行程序,只能在命令行得到报告,CLion界面倒是一片祥和:
与Jetbrains官方文档中呈现的效果不太一样:
我目前是没有找到什么解决方案,等到找到解决方案了再来更新吧(2026-10-16)
总结
老老实实用WSL,别整这些有的没的,fsanitizer何valgrind都能正常用。
一定要用MSVC就别几把惦记CLion了,Visual Studio (Code)一把梭得了。

