错误:memcpy-param-overlap

地址清理器错误:memcpy-param-overlap

CRT 函数memcpy不支持重叠内存。 CRT 为支持重叠内存的 memcpy 提供了替代方法:memmove

常见的错误是将 memmove 视为语义上等效于 memcpy

示例

// example1.cpp
// memcpy-param-overlap error
#include <string.h>

__declspec(noinline) void bad_function() {
    char buffer[] = "hello";

    memcpy(buffer, buffer + 1, 5); // BOOM!
}

int main(int argc, char **argv) {
    bad_function();
    return 0;
}

若要生成并测试此示例,请在 Visual Studio 2019 版本 16.9 或更高版本的开发人员命令提示符中运行以下命令:

cl example1.cpp /fsanitize=address /Zi /Oi
devenv /debugexe example1.exe

/Oi 标志指示编译器将 memcpymemmove 视为内部函数。 这是必要的,因为某些版本的标准库以相同方式实现 memcpymemmove。 由于 ASAN 是动态分析工具,因此它仅检测具有可见的运行时效果的错误。

生成的错误

示例 1 中显示 memcpy-param-overlap 错误的调试器的屏幕快照。

另请参阅

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