다음을 통해 공유


오류: heap-use-after-free

삭제자 오류 해결: 할당 취소된 메모리 사용

힙의 스토리지가 잘못된 사용volatile과 함께 , realloc (C) 및 new (C++)를 통해 malloc할당될 수 있는 세 가지 예제를 보여 줍니다.

예 - malloc

// example1.cpp
// heap-use-after-free error
#include <stdlib.h>

int main() {
  char *x = (char*)malloc(10 * sizeof(char));
  free(x);

  // ...

  return x[5];   // Boom!
}

이 예제를 빌드하고 테스트하려면 Visual Studio 2019 버전 16.9 이상 개발자 명령 프롬프트에서 다음 명령을 실행합니다.

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

Visual Studio가 나타나면 키를 눌러 F5 예제 1을 실행합니다.

결과 오류

할당 취소된 메모리 오류의 사용을 표시하는 디버거의 스크린샷(예: 1).

throw된 예외는 11줄을 가리키고 x [5]를 반환하며 다음을 말합니다. 할당 취소된 메모리의 삭제자 오류 사용 해결 스크린샷에는 메모리 주소를 표시하는 콘솔 창의 출력과 주소 지정 가능한 바이트, 부분적으로 주소 지정 가능한 바이트, 해제된 힙 영역 및 오류 영역에서 왼쪽 힙 왼쪽 빨간색 영역 바이트를 식별하는 키가 표시됩니다.

예 - operator new

// example2.cpp
// heap-use-after-free error
#include <windows.h>

int main() {
  char *buffer = new char[42];
  delete [] buffer;

  // ...

  buffer[0] = 42;  // Boom!
  return 0;
}

이 예제를 빌드하고 테스트하려면 Visual Studio 2019 버전 16.9 이상 개발자 명령 프롬프트에서 다음 명령을 실행합니다.

cl example2.cpp /fsanitize=address /Zi
devenv /debugexe example2.exe

Visual Studio가 나타나면 키를 눌러 F5 예제 2를 실행합니다.

결과 오류 - 연산자 new

예제 2에서 할당 취소된 메모리 오류의 사용을 표시하는 디버거의 스크린샷.

throw된 예외 대화 상자는 줄 11, 버퍼[0] = 42를 가리키며 다음과 같이 말합니다. 삭제자 오류 해결: 할당 취소된 메모리 사용. 스크린샷에는 메모리 주소를 보여 주는 콘솔 창의 출력과 주소 지정 가능한 바이트, 부분적으로 주소 지정 가능한 바이트, 해제된 힙 영역 및 오류 영역에 남아 있는 힙 왼쪽 알로카 레드 존 바이트를 식별하는 키가 표시됩니다.

예 - realloc

// example3.cpp
// heap-use-after-free error
#include <malloc.h>

int main() {
  char *buffer = (char*)realloc(0, 42);
  free(buffer);

  // ...

  buffer[0] = 42;  // Boom!
  return 0;
}

이 예제를 빌드하고 테스트하려면 Visual Studio 2019 버전 16.9 이상 개발자 명령 프롬프트에서 다음 명령을 실행합니다.

cl example3.cpp /fsanitize=address /Zi
devenv /debugexe example3.exe

Visual Studio가 나타나면 키를 눌러 F5 예제 3을 실행합니다.

결과 오류 - 재할당

예제 3에서 할당 취소된 메모리 오류의 사용을 표시하는 디버거의 스크린샷

throw된 예외 대화 상자는 줄 11, 버퍼[0] = 42를 가리키며 다음과 같이 말합니다. 삭제자 오류 해결: 할당 취소된 메모리 사용. 스크린샷에는 메모리 주소를 표시하는 콘솔 창의 출력과 주소 지정 가능한 바이트, 부분적으로 주소 지정 가능한 바이트, 해제된 힙 영역 및 오류 영역에서 왼쪽 힙 왼쪽 빨간색 영역 바이트를 식별하는 키가 표시됩니다.

예 - volatile

// example4.cpp
// heap-use-after-free error
#include <stdlib.h>

int main() {

  volatile char *x = (char*)malloc(sizeof(char));
  free((void*)x);

      //...

  *x = 42;        // Boom!
}

이 예제를 빌드하고 테스트하려면 Visual Studio 2019 버전 16.9 이상 개발자 명령 프롬프트에서 다음 명령을 실행합니다.

cl example4.cpp /fsanitize=address /Zi
devenv /debugexe example4.exe

Visual Studio가 나타나면 키를 눌러 F5 예제 4를 실행합니다.

결과 오류 - volatile

예제 4에서 할당 취소된 메모리 오류를 사용하는 것을 표시하는 디버거의 스크린샷.

throw된 예외 대화 상자는 줄 12, *x = 42를 가리키며 다음과 같이 말합니다. 삭제자 오류 해결: 할당 취소된 메모리 사용. 스크린샷에는 메모리 주소를 표시하는 콘솔 창의 출력과 주소 지정 가능한 바이트, 왼쪽 힙 왼쪽 빨간색 영역 바이트 및 오류 영역에서 주소 지정 가능하고 부분적으로 주소 지정 가능한 바이트를 식별하는 키가 표시됩니다.

참고 항목

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