来自Linux / gcc / clang我发现自己在Windows / Visual Studio上的工作越来越多。
我真正缺少的是地址消毒剂(边界检查,泄漏,免费后使用,......)。我做了一些研究,并尝试了一些事情,但没有找到一个完整的(功能明智的)替代品。我已经尝试过Memory博士,但是他知道它不适用于基于Qt的程序(至少在Windows 10上不行)。
那么如何在Windows / MSVC上获得类似地址清理程序的功能呢?
答案 0 :(得分:11)
至少来自clang的ASan和Ubsan应该在Windows上运行,但有一些限制。这些可以与msvc工具链一起使用,使用clang-cl作为cl.exe的替代品 - 谷歌似乎是working on this,mozilla too。
我所知道的问题(并且让我自己一直使用它直到现在):
与所需库的链接不是自动的。它们有两个版本,具体取决于CRT在应用程序中的链接方式(/ MT表示静态CRT,/ MD表示动态CRT,后者通常用于Qt)。要查找所需的链接器参数,请打开Visual Studio命令提示符,将clang bin文件夹添加到路径中,然后使用带有clang-cl的详细选项编译一个简单的main.cpp(空主函数),如下所示:
clang-cl -v /MD -fsanitize=address main.cpp
所需的link.exe命令在详细输出的末尾,从那里提取所需的libs以进行链接。
Windows上仅支持发布版本
不支持Windows上的例外(请参阅this问题)
Windows端口似乎没有太多进一步的工作,wiki例如非常过时(2015年的最后一次变化),所以我怀疑很多人都在高效地使用它。因此,在线获取其他用户的帮助可能会非常困难......
在Windows上讨论其他替代方案,有:
Linux上的Sanitizers和Valgrind IMO比这些工具更先进和/或具有更好的性能,因此保持Linux上的应用程序构建似乎是最好的主意,至少在使用像Qt这样的跨平台工具包时(如你提到的。)
答案 1 :(得分:0)
Microsoft已将Address Sanitizer集成到Visual Studio 2019 version 16.1 Preview 3中。不幸的是,目前仅支持Linux构建。但是至少您仍然可以使用自己喜欢的IDE并在WSL中调试应用程序
AddressSanitizer (ASan) for the Linux Workload in Visual Studio 2019
请注意,MSVC本身已经拥有各种工具来调试内存问题,例如Adrian McCarthy或CRT Debug Heap
所提到的Control Flow Guard。有许多工具可以使您的代码安全无虞:Valgrind和地址/线程清除程序是流行的示例。 Windows上也有许多这些工具,它们来自Microsoft和其他公司。但是MSVC在编译器内部具有强大的技术,这些技术将安全性与代码集成在一起。例如,Control Flow Guard是经过高度优化的安全功能,可解决许多内存损坏漏洞。我们无法公开谈论当前的安全研究,但我们一直在努力使您的代码(以及我们的代码)免受日益复杂的攻击者的侵害。
https://devblogs.microsoft.com/cppblog/msvc-the-best-choice-for-windows/
另请参见