在MSVC上解决类似Sanitizer的功能

时间:2017-12-08 09:34:58

标签: c++ visual-studio qt address-sanitizer

来自Linux / gcc / clang我发现自己在Windows / Visual Studio上的工作越来越多。

我真正缺少的是地址消毒剂(边界检查,泄漏,免费后使用,......)。我做了一些研究,并尝试了一些事情,但没有找到一个完整的(功能明智的)替代品。我已经尝试过Memory博士,但是他知道它不适用于基于Qt的程序(至少在Windows 10上不行)。

那么如何在Windows / MSVC上获得类似地址清理程序的功能呢?

2 个答案:

答案 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上讨论其他替代方案,有:

  • Appverifier(随Windows SDK一起提供)
  • Dr Memory(目前在其问题跟踪器上根据some comments未在Windows上维护,这意味着它对于Qt以及使用SSE 4.2指令的所有人来说都是完全无法使用的,请参阅here和{{ 3}})
  • here(商业)。

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

答案 1 :(得分:0)

Microsoft已将Address Sanitizer集成到Visual Studio 2019 version 16.1 Preview 3中。不幸的是,目前仅支持Linux构建。但是至少您仍然可以使用自己喜欢的IDE并在WSL中调试应用程序

  

ASAN error example

     

ASAN option

     

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/

另请参见