AddressSanitizer 已知问题

注意

请就你希望在未来版本中看到的内容向我们发送反馈,如果遇到问题,请报告 bug

不兼容的选项和功能

这些选项和功能与 /fsanitize=address 不兼容,应禁用或避免。

标准库支持

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\System32C:\Windows\SysWOW64 中。

自定义属性表支持

Visual Studio IDE 中的“属性管理器”窗口允许向项目添加自定义 .props 文件。 即使显示了“启用地址清理器”属性(<EnableASAN>),但版本仍不支持。 这是因为自定义 .props 文件是在 Microsoft.cpp.props 之后包括在内的,其使用 <EnableASAN> 值设置其他属性。

解决方法是,可以在项目的根目录中创建一个 Directory.Build.props 文件来定义 <EnableASAN> 属性。 有关详细信息,请参阅自定义 C++ 生成

另请参阅

AddressSanitizer 概述
AddressSanitizer 生成和语言参考
AddressSanitizer 运行时参考
AddressSanitizer 阴影字节
AddressSanitizer 云或分布式测试
AddressSanitizer 调试程序集成
AddressSanitizer 错误示例