다음을 통해 공유


오류: stack-buffer-underflow

삭제자 오류 해결: 스택 버퍼 언더플로

이러한 오류 메시지는 스택 변수가 시작되기 전의 어딘가에 메모리 액세스를 나타냅니다.

예제 - 로컬 배열 언더플로

// example1.cpp
// stack-buffer-underflow error
#include <stdio.h>

int main() {

    int subscript = -1;
    char buffer[42];
    buffer[subscript] = 42; // Boom!
   
    return 0;
}

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

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

ASAN은 동적 분석의 한 형태이므로 실제로 실행되는 잘못된 코드만 검색할 수 있습니다. 최적화 프로그램은 읽지 않으므로 할당을 buffer[subscript]buffer[subscript] 제거합니다. 따라서 이 예제에는 플래그가 /Od 필요합니다.

결과 오류

예제 1에서 스택 버퍼-언더플로 오류를 표시하는 디버거의 스크린샷

예제 - 스레드의 스택 언더플로

// example2.cpp
// stack-buffer-underflow error
#include <windows.h>

DWORD WINAPI thread_proc(void *) {
    int subscript = -1;
    volatile char stack_buffer[42];
    stack_buffer[subscript] = 42;

    return 0;
}

int main() {
    HANDLE thr = CreateThread(NULL, 0, thread_proc, NULL, 0, NULL);

    if (thr == 0) return 0;

    WaitForSingleObject(thr, INFINITE);

    return 0;
}

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

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

결과 오류 - 스레드의 스택 언더플로

예제 2에서 스택 버퍼-언더플로 오류를 표시하는 디버거의 스크린샷

참고 항목

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