我曾经使用Linux/gcc/clang,现在更多地使用Windows/Visual Studio,但我非常想念地址清单(检查范围、泄漏、使用后释放等)。
我做了一些研究并尝试了一些方法,但都没有找到功能完整且可靠的替代品。例如,我尝试过Dr. Memory,但发现它不能用于基于Qt的程序(至少在Windows 10上不能)。
那么,在Windows/MSVC上,如何获得类似于地址清单的功能呢?
我曾经使用Linux/gcc/clang,现在更多地使用Windows/Visual Studio,但我非常想念地址清单(检查范围、泄漏、使用后释放等)。
我做了一些研究并尝试了一些方法,但都没有找到功能完整且可靠的替代品。例如,我尝试过Dr. Memory,但发现它不能用于基于Qt的程序(至少在Windows 10上不能)。
那么,在Windows/MSVC上,如何获得类似于地址清单的功能呢?
至少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这样的跨平台工具包时是如此(正如您所提到的)。
Windows项目的地址无害化器也可在Visual Studio 2019版本16.4中使用。
我们很高兴地宣布MSVC工具集支持AddressSanitizer (ASan)。ASan是一种快速内存错误检测器,可以发现运行时内存问题,例如使用后释放和执行越界检查。对于卫生器的支持是我们在开发人员社区中最受欢迎的建议之一,我们现在可以说我们有了一个在Windows上的ASan体验,除了我们现有的对Linux项目的支持。
最新版本16.7 支持x86和x64 (最初版本仅支持x86)。
https://devblogs.microsoft.com/cppblog/msvc-the-best-choice-for-windows/
另请参见。