MSVC上类似于地址无害化工具的功能

17

我曾经使用Linux/gcc/clang,现在更多地使用Windows/Visual Studio,但我非常想念地址清单(检查范围、泄漏、使用后释放等)。

我做了一些研究并尝试了一些方法,但都没有找到功能完整且可靠的替代品。例如,我尝试过Dr. Memory,但发现它不能用于基于Qt的程序(至少在Windows 10上不能)。

那么,在Windows/MSVC上,如何获得类似于地址清单的功能呢?


如果 MSVC 不是必需品,那么应该在 Linux 上开发和检查,然后使用 gcc 和 MXE/mingw 进行交叉编译。如果你得到了一个使用 MSVC 编译的闭源库,那么 Valgrind 在 Linux+wine 上仍然可以使用。 - Velkan
2
谢谢您的回复,但我特别想在MSVS上实现我在问题中概述的功能。 - Frank Meerkötter
2个回答

18

至少ASan和Ubsan从clang在Windows上应该可以工作,但有一些限制。使用clang-cl作为cl.exe的替代品,可以将它们与msvc工具链一起使用-google似乎正在处理这个问题,mozilla 也是如此

我知道的问题(这些问题让我到现在还没有使用它):

  • 链接所需库不是自动完成的。它们有两个版本,取决于CRT在应用程序中的链接方式(/MT表示静态CRT,/MD表示动态CRT,后者通常在Qt中使用)。要查找所需的链接器参数,请打开Visual Studio命令提示符,将clang bin文件夹添加到路径中,并使用clang-cl以此编译一个简单的main.cpp文件(空main函数),并带上详细选项: clang-cl -v /MD -fsanitize=address main.cpp 所需的link.exe命令在详细输出的末尾,从中提取所需的库进行链接。

  • 仅支持Windows上的发布版本。

  • Windows不支持异常(请参见this问题)。

  • 似乎对于Windows端口没有更多的工作,例如wiki非常过时(上次更改是2015年),因此我怀疑有很少人正在生产性地使用这个产品。因此,在线寻求其他用户的帮助可能会非常困难...

谈到Windows上的其他替代方法,有:

在Linux上,Sanitizers和Valgrind比这些工具更先进和/或性能更好,因此保持应用程序在Linux上构建似乎是最好的选择,至少在使用像Qt这样的跨平台工具包时是如此(正如您所提到的)。


3
这个回答里的内容很不错。另外需要注意的是,MSVC的运行库中有相当不错的堆内存跟踪功能,但你需要手动开启它们。https://learn.microsoft.com/en-us/visualstudio/debugger/crt-debug-heap-details - Adrian McCarthy
1
Appverifier的链接已经失效。这是最新链接:https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/application-verifier - Andreas
@Andreas 已修复。 - FourtyTwo

16
微软已将地址无害化器(Address Sanitizer)集成到Visual Studio 2019版本16.1预览版3及更高版本中。不幸的是,目前仅支持Linux构建。但至少你仍然可以使用你喜欢的IDE并在WSL中调试应用程序。

更新:

Windows项目的地址无害化器也可在Visual Studio 2019版本16.4中使用。

我们很高兴地宣布MSVC工具集支持AddressSanitizer (ASan)。ASan是一种快速内存错误检测器,可以发现运行时内存问题,例如使用后释放和执行越界检查。对于卫生器的支持是我们在开发人员社区中最受欢迎的建议之一,我们现在可以说我们有了一个在Windows上的ASan体验,除了我们现有的对Linux项目的支持。

使用MSVC的Windows地址无害化器(ASan)

最新版本16.7 支持x86和x64 (最初版本仅支持x86)。


在Visual Studio 2019版本16.1预览3中,我们将AddressSanitizer(ASan)集成到了适用于Linux项目的Visual Studio中。ASan是C/C++的运行时内存错误检测器,可捕获以下错误: - 使用已释放内存(悬空指针引用) - 堆缓冲区溢出 - 栈缓冲区溢出 - 返回后使用 - 超出作用域后使用 - 初始化顺序错误 ASAN error example ASAN option Visual Studio 2019中的Linux工作负载的AddressSanitizer(ASan)
请注意,MSVC本身已经有各种调试内存问题的工具,例如Adrian McCarthy上面提到的CRT Debug HeapControl Flow Guard
许多工具尝试使您的代码从外部安全起来:Valgrind和地址/线程消毒剂是流行的示例。在Windows上也有许多此类工具,来自Microsoft和其他公司。但是MSVC编译器内置了强大的技术,将安全性与您的代码集成在一起。例如,Control Flow Guard是高度优化的安全功能,可解决许多内存破坏漏洞。我们无法公开讨论当前的安全研究,但我们始终致力于使您的代码(以及我们的代码!)免受日益复杂的攻击者的攻击。

https://devblogs.microsoft.com/cppblog/msvc-the-best-choice-for-windows/

另请参见。

1
MSVS 是你最喜欢的 C++ 集成开发环境吗?:0 - Marek R
7
@MarekR这与此无关。问题是关于MSVC的。无论如何,自2017年以来,MSVC是一个比许多其他IDE更好的IDE。 - phuclv
1
你可以添加一个提示,即目前(16.4)使用MSVC的地址检查器仅适用于x86而不是x64。我花了一些时间才意识到,为什么在尝试使用它时会出现链接器/编译器错误。 - MikeMB
2
截至16.7.7版本,地址消毒剂已经支持x64和x86。@MikeMB - Contango

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接