AddressSanitizer 已知问题
不兼容的选项和功能
这些选项和功能与 /fsanitize=address
不兼容,应禁用或避免。
/RTC
选项与 AddressSanitizer 不兼容,应禁用。- 增量链接不受支持,应禁用。
- Edit-and-Continue 不受支持,应禁用。
- 协同例程与 AddressSanitizer 不兼容,且可恢复函数不在检测范围内。
- OpenMP 不受支持,应禁用。
- Managed C++ 不受支持,应禁用。
- C++ AMP 不受支持,应禁用。
- 通用 Windows 平台 (UWP) 应用程序不受支持。
- 特殊情况列表文件不受支持。
- 不支持使用可选
alloc_dealloc_mismatch
运行时选项的 MFC。
标准库支持
MSVC 标准库 (STL) 可在一定程度上帮助了解 AddressSanitizer 并提供其他检查。 有关详细信息,请参阅 container-overflow 错误。
当注释被禁用或属于不受支持的版本时,STL 代码中引发的 AddressSanitizer 异常确实仍会识别真正的 bug。 然而,它们并不具有本来的精准率。
此示例演示了精准率的缺失和启用注释的好处:
// Compile with: cl /fsanitize=address /Zi
#include <vector>
int main() {
// Create a vector of size 10, but with a capacity of 20.
std::vector<int> v(10);
v.reserve(20);
// In versions prior to 17.2, MSVC ASan does NOT raise an exception here.
// While this is an out-of-bounds write to 'v', MSVC ASan
// ensures the write is within the heap allocation size (20).
// With 17.2 and later, MSVC ASan will raise a 'container-overflow' exception:
// ==18364==ERROR: AddressSanitizer: container-overflow on address 0x1263cb8a0048 at pc 0x7ff6466411ab bp 0x005cf81ef7b0 sp 0x005cf81ef7b8
v[10] = 1;
// Regardless of version, MSVC ASan DOES raise an exception here, as this write
// is out of bounds from the heap allocation.
v[20] = 1;
}
Windows 版本
由于存在与特定 Windows 版本的依赖关系,因此支持侧重于 Windows 10。 MSVC AddressSanitizer 在 10.0.14393 (RS1) 和 10.0.21323 (预发行内部版本) 上进行了测试。 如果遇到问题,请报告 bug。
内存使用率
AddressSanitizer 运行时在执行期间不会将内存释放回 OS。 从 OS 的角度来看,看似存在内存泄漏。 此设计决策是有意的,为了避免提前分配所有必需的内存。
AddressSanitizer 运行时 DLL 位置
clang_rt.asan*.dll
运行时文件安装在 %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\
中编译器旁边。 这些位置位于调试会话中的路径上和 Visual Studio 开发人员命令提示符中。 这些文件绝不会放在 C:\Windows\System32
或 C:\Windows\SysWOW64
中。
自定义属性表支持
Visual Studio IDE 中的“属性管理器”窗口允许向项目添加自定义 .props
文件。 即使显示了“启用地址清理器”属性(<EnableASAN>
),但版本仍不支持。 这是因为自定义 .props
文件是在 Microsoft.cpp.props
之后包括在内的,其使用 <EnableASAN>
值设置其他属性。
解决方法是,可以在项目的根目录中创建一个 Directory.Build.props
文件来定义 <EnableASAN>
属性。 有关详细信息,请参阅自定义 C++ 生成。
另请参阅
AddressSanitizer 概述
AddressSanitizer 生成和语言参考
AddressSanitizer 运行时参考
AddressSanitizer 阴影字节
AddressSanitizer 云或分布式测试
AddressSanitizer 调试程序集成
AddressSanitizer 错误示例