【发布时间】: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