다음을 통해 공유


오류: memcpy-param-overlap

삭제자 오류 해결: memcpy-param-overlap

CRT 함수 memcpy 는 겹치는 메모리를 지원하지 않습니다. CRT는 겹치는 메모리memmovememcpy 지원하는 대안을 제공합니다.

일반적인 오류는 의미상 같음으로 처리하는 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 플래그컴파일러에 함수를 처리하고 memmove 내장 함수로 처리 memcpy 하도록 지시합니다. 이는 표준 라이브러리의 일부 버전이 동일한 방식으로 구현 memcpy 하기 memmove 때문에 필요합니다. ASAN은 동적 분석 도구이므로 관찰 가능한 런타임 효과가 있는 오류만 검색합니다.

결과 오류

예제 1에서 memcpy-param-overlap 오류를 표시하는 디버거의 스크린샷

참고 항목

AddressSanitizer 개요
AddressSanitizer 알려진 문제
AddressSanitizer 빌드 및 언어 참조
AddressSanitizer 런타임 참조
AddressSanitizer 섀도 바이트
AddressSanitizer 클라우드 또는 분산 테스트
AddressSanitizer 디버거 통합
AddressSanitizer 오류 예제