【问题标题】:How to use msvc asan with visual studio如何在 Visual Studio 中使用 msvc asan
【发布时间】:2021-02-14 12:48:26
【问题描述】:

我尝试在 project->properties->c/C++->Enable Address Sanitizer (Experimental) 中启用 asan:是 (/fsanitize=address)。

然后我可以构建我的项目,但是在运行时它会中断 extern "C" void __cdecl _initterm(blah blah) initterm.cpp 和 Exception thrown at 0x00007FFFCD3B2EB8 (ntdll.dll) in gnomes.exe: 0xC0000005: Access violation writing location 0x0000053747340000

其他人告诉我这是会发生的事情,我应该继续完成它。然后它移动到 ntdll.dll 或其他窗口 api 文件中某处的大约 50 个其他异常,然后最终到达我的程序,它在 main 的第一行出错:GTApplication *app = new GTApplication();(我的 main 的第一行) Access violation writing location blah.

所以我不确定如何解释这些信息。我的计算机上的基础 Windows API 层有问题吗?或者这只是不可避免的(如果奇怪的话)行为。 这是否意味着我应该将程序的第一行解释为使用 asan 的一个怪癖?还是我的应用对象分配有问题?

我是否错误地使用了 asan?

【问题讨论】:

  • 现有资料恐怕无法解决问题。如果您能提供更多相关信息,将有助于解决问题。
  • _initterm 在 CRT 初始化期间运行。它的主要目的是初始化具有静态存储持续时间的对象(例如,其类型具有非平凡 c'tors 的全局变量)。您的代码是否具有全局变量,其初始化依赖于具有静态存储持续时间的其他对象?
  • 我在尝试使用 64 位构建的 asan 时看到了类似的问题。但在同一源的 32 位版本中没问题。
  • developercommunity.visualstudio.com/t/…;微软似乎认为这不是一个错误。我个人认为这是一个错误(鸭子测试) - 如果您必须忽略调试器中出现的 99% 的消息,那么调试会变得更加困难。 ——
  • 如果您同意这值得修复,我建议投票 developercommunity.visualstudio.com/t/…> 或直接请求 MSFT 以其他方式修复此问题。

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


【解决方案1】:

在使用 VS 16.8.3 构建 64 位应用程序时(查看消息中列出的指针大小,您的情况也是如此),我也面临同样的问题。即使对于一个应用程序,它实际上什么也不做(返回 0)。

如果可能,请考虑构建 32 位版本的应用程序并检查问题是否仍然存在。 ASan 不会为我报告 32 位二进制文​​件的此类问题。

VS 中的 Address Sanitizer 仍处于试验阶段,对 x86-64 的支持甚至不如 32 位 x86 成熟。

【讨论】:

  • 我可以确认我可以毫无问题地使用 asan 运行 32 位应用程序,但在尝试 64 位版本的同一应用程序时,我遇到了与问题中相同的问题。
猜你喜欢
  • 1970-01-01
  • 2021-09-20
  • 2011-08-01
  • 2020-02-05
  • 2023-03-19
  • 2016-02-05
  • 2016-04-17
  • 2012-05-18
相关资源
最近更新 更多