【问题标题】:Address Sanitizer-like functionality on MSVC解决 MSVC 上类似 Sanitizer 的功能
【发布时间】:2018-05-22 12:34:57
【问题描述】:

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

我真正缺少的是地址清理程序(边界检查、泄漏、释放后使用……)。我做了一些研究,也尝试了一些东西,但还没有找到一个完整(功能方面)以及可靠的替代品。例如,我尝试过 Dr. Memory,但了解到它不适用于基于 Qt 的程序(至少不适用于 Windows 10)。

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

【问题讨论】:

  • 如果 msvc 不是硬性要求,那么在 Linux 上进行开发和检查,然后使用 gcc 和 MXE/mingw 等进行交叉编译。如果你得到一个使用 msvc 编译的闭源库那么 valgrind 仍然可以与 Linux+wine 一起使用。
  • 感谢您的回复,但我对在 msvs 上的问题中概述的功能特别感兴趣。

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


【解决方案1】:

至少来自 clang 的 ASan 和 Ubsan 应该可以在 Windows 上运行,但有一些限制。这些可以与 msvc 工具链一起使用,使用 clang-cl 作为 cl.exe 的替代品 - google 似乎是 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 命令位于详细输出的末尾,从那里提取链接所需的库。

  • Windows 仅支持发布版本

  • 不支持 Windows 上的异常(请参阅this 问题)

  • 在 Windows 端口上似乎没有更多的工作,wiki 例如非常过时(2015 年的最后一次更改),所以我怀疑很多人是否有效地使用它。所以从其他在线用户那里获得帮助可能会非常困难......

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

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

【讨论】:

【解决方案2】:

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

更新:

Windows 项目的地址清理器也可用since Visual Studio 2019 version 16.4

我们很高兴地宣布 AddressSanitizer (ASan) 支持 MSVC 工具集。 ASan 是一种快速内存错误检测器,可以发现运行时内存问题,例如释放后使用并执行越界检查。对消毒剂的支持一直是我们在开发者社区中更受欢迎的建议之一,现在我们可以说,除了我们现有的对 Linux 项目的支持之外,我们还有在 Windows 上使用 ASan 的经验。

AddressSanitizer (ASan) for Windows with MSVC

最新版本 16.7 supports both x86 and x64(初始版本仅支持 x86)。


在 Visual Studio 2019 版本 16.1 Preview 3 中,我们已将 AddressSanitizer (ASan) 集成到 Visual Studio for Linux 项目中。 ASan 是用于 C/C++ 的运行时内存错误检测器,可捕获以下错误:

  • 释放后使用(悬空指针引用)
  • 堆缓冲区溢出
  • 堆栈缓冲区溢出
  • 退货后使用
  • 在作用域之后使用
  • 初始化顺序错误

AddressSanitizer (ASan) for the Linux Workload in Visual Studio 2019


请注意,MSVC 本身已经有各种用于调试内存问题的工具,例如 Adrian McCarthy 或 Control Flow Guard 上面提到的 CRT Debug Heap

有许多工具可以尝试让您的代码在开箱即用的情况下保持安全:Valgrind 和地址/线程清理程序是流行的示例。在 Windows 上也有许多此类工具,来自 Microsoft 和其他公司。但是 MSVC 在编译器中具有强大的技术,可以将安全性与您的代码集成在一起。例如,Control Flow Guard 是一种高度优化的安全功能,可以对抗许多内存损坏漏洞。我们不能公开谈论我们当前的安全研究,但我们一直在努力使您的代码(以及我们的代码!)免受日益老练的攻击者的攻击。

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

另见

【讨论】:

  • MSVS 是你最喜欢的 C++ IDE? :0
  • @MarekR 这无关紧要。问题是关于 MSVC。无论如何,与许多其他 IDE 相比,自 2017 年及以后的 MSVC 是一个很棒的 IDE
  • 您现在可以添加带有 msvc 的 (16.4) 地址清理程序仅适用于 x86 而不是 x64。我花了一些时间才意识到,为什么在尝试使用它时会出现链接器/编译器错误。
  • @MikeMB 从 16.7.7 开始,地址清理程序适用于 x64 和 x86。
猜你喜欢
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 2012-05-20
  • 1970-01-01
相关资源
最近更新 更多