Rya*_*ies 7 c c++ windows address-sanitizer msvc12
Microsoft 最近将 Address Sanitizer (ASan) 引入了 Microsoft Visual Studio 2019,我一直在尝试它。这个问题特定于 C 和 C++。我的问题是:是否有任何理由为发布版本启用 ASan,而不是仅为调试版本启用它?打开 ASan 对我的程序的性能和内存使用量来说是毁灭性的。(CPU 性能比减半还要差,内存使用量增加了两倍。)因此,我希望如果我启用 ASan 只是为了检查潜在问题,并且它在调试版本中没有检测到任何问题,那么我可以放心地假设不会有发布版本中是否存在任何可能被 ASan 发现的问题?当然,我们不打算在发布/生产版本中启用 ASan 吗?
感谢您的任何见解。
因此,我希望,如果我启用 ASan 只是为了检查潜在问题,并且它没有检测到调试版本中的任何问题,那么我可以放心地假设发布版本中不会出现任何本来会被捕获的问题由阿桑?
这不太可能(特别是对于较大的复杂程序)。考虑一个像这样的函数:
int array[250];
int test1(uint16_t a) {
return array[ (1016 / (a+1)) & 0xFF];
}
Run Code Online (Sandbox Code Playgroud)
您可以使用许多值a(例如0、2、3、4...)来测试它,它会很好,并且它将在调试期间通过地址清理器的测试。然后,在发布后,它可能会由于a触发“数组索引超出范围”错误的不同(未经测试)值(例如1)而崩溃。
为了保证类似的事情不会发生,您可以测试每个函数的所有可能的参数组合(这将是非常昂贵的);但是(在存在全局变量/状态的情况下)这可能仍然不够,并且(在存在多个线程的情况下)它不会找到隐藏的竞争条件(例如,几乎总是有效的代码,因为线程 A 在线程 B 之前完成,从而崩溃当时间上的细微差异导致线程 B 在线程 A 之前完成时)。
当然,我们不打算在发布/生产版本中启用 ASan 吗?
正确 - 保持启用状态的成本太高。
总的想法是尽量减少错误的风险(因为您不能保证所有错误都被发现并消除)。无需进行太多测试,您就可以说您“80% 确定”发布的版本中没有错误;通过启用 Asan(和优化)进行一些严格的测试,您可能可以说您“95% 确定”发布的版本中没有错误。
这真正归结为经济(金钱)。这是“软件错误成本(销售损失、支持成本等)”与“发现错误成本”的折衷方案;像电脑游戏之类的东西可能只需较少的测试就可以了(因为用户只是假设游戏偶尔会崩溃),而像生命支持机器(错误会导致死亡)之类的东西你可能首先会拒绝使用 C 或 C++。
另一件值得考虑的事情是,用户不太关心你的代码为什么失败——如果它是因为错误而失败,那么用户会很恼火;如果由于启用了 Asan 并检测到错误而导致失败,那么用户也会同样恼火。在发布版本中启用 Asan 将有助于用户在错误报告中提交更好的信息,但大多数人不会提交错误报告(他们只是坐在那里生气;想知道这是否是暂时的硬件故障,因为它们太便宜了而买不起) ECC RAM,或者如果是操作系统或驱动程序中的错误;然后重新启动软件)。
| 归档时间: |
|
| 查看次数: |
1952 次 |
| 最近记录: |