错误: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 标志指示编译器将 memcpy
和 memmove
视为内部函数。 这是必要的,因为某些版本的标准库以相同方式实现 memcpy
和 memmove
。 由于 ASAN 是动态分析工具,因此它仅检测具有可见的运行时效果的错误。
生成的错误
另请参阅
AddressSanitizer 概述
AddressSanitizer 已知问题
AddressSanitizer 生成和语言参考
AddressSanitizer 运行时参考
AddressSanitizer 阴影字节
AddressSanitizer 云或分布式测试
AddressSanitizer 调试程序集成
AddressSanitizer 错误示例