오류: 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을 실행합니다.
결과 오류
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
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을 실행합니다.
결과 오류 - 재할당
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
throw된 예외 대화 상자는 줄 12, *x = 42를 가리키며 다음과 같이 말합니다. 삭제자 오류 해결: 할당 취소된 메모리 사용. 스크린샷에는 메모리 주소를 표시하는 콘솔 창의 출력과 주소 지정 가능한 바이트, 왼쪽 힙 왼쪽 빨간색 영역 바이트 및 오류 영역에서 주소 지정 가능하고 부분적으로 주소 지정 가능한 바이트를 식별하는 키가 표시됩니다.
참고 항목
AddressSanitizer 개요
AddressSanitizer 알려진 문제
AddressSanitizer 빌드 및 언어 참조
AddressSanitizer 런타임 참조
AddressSanitizer 섀도 바이트
AddressSanitizer 클라우드 또는 분산 테스트
AddressSanitizer 디버거 통합
AddressSanitizer 오류 예제