0Pricing
C++ Academy · 강의

AddressSanitizer

메모리 오류 잡기

AddressSanitizer은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

AddressSanitizer란 무엇인가요

AddressSanitizer(ASan)는 실행 시간에 메모리 오류를 탐지하는 컴파일러 기반 도구입니다. 범위를 벗어난 접근, 해제 후 사용, 이중 해제, 메모리 누수를 찾아냅니다. 일상적인 테스트에 사용할 수 있을 만큼 빠릅니다.

ASan 활성화

컴파일할 때와 링크할 때 모두 -fsanitize=address를 추가하고, 읽기 쉬운 보고서를 위해 -g도 추가하세요.

g++ -fsanitize=address -g -O1 main.cpp -o app
./app

힙 버퍼 오버플로

ASan은 할당된 버퍼의 범위를 넘어 읽거나 쓰는 동작을 표시합니다. 이 프로그램은 요소를 하나 더 지나서 씁니다.

#include <cstdlib>

int main() {
    int* a = (int*)malloc(3 * sizeof(int));
    a[3] = 7; // out of bounds
    free(a);
    return 0;
}

해제 후 사용

메모리를 해제한 후 해당 메모리에 접근하는 것은 정의되지 않은 동작입니다. ASan은 메모리를 해제한 위치와 할당한 위치의 호출 스택과 함께 heap-use-after-free를 보고합니다.

#include <cstdlib>

int main() {
    int* p = (int*)malloc(sizeof(int));
    free(p);
    *p = 5; // use after free
    return 0;
}

스택 버퍼 오버플로

ASan은 스택 배열에도 계측을 적용하여 지역 버퍼의 범위를 넘는 접근을 찾아냅니다.

#include <iostream>

int main() {
    int buf[3] = {0, 0, 0};
    for (int i = 0; i <= 3; ++i) buf[i] = i; // i==3 overflows
    std::cout << buf[0] << "\n";
    return 0;
}

보고서 읽기

ASan 보고서에는 오류 유형, 오류가 발생한 주소, 잘못된 접근과 관련된 할당 및 해제 작업의 호출 스택이 표시됩니다. 첫 번째 스택 프레임은 대개 버그가 있는 위치를 바로 가리킵니다.

누수 탐지

ASan은 여러 플랫폼에서 LeakSanitizer를 포함하며, 프로그램이 종료될 때까지 해제되지 않은 메모리와 해당 메모리를 할당한 호출 스택을 보고합니다.

#include <cstdlib>

int main() {
    int* leaked = (int*)malloc(100); // never freed
    return 0;
}

실행 시간 옵션

ASAN_OPTIONS 환경 변수로 동작을 조정할 수 있습니다. 예를 들면 ASAN_OPTIONS=detect_leaks=1:halt_on_error=0과 같습니다.

성능 비용

ASan은 일반적으로 프로그램을 약 2배 느리게 하고 메모리 사용량을 늘립니다. 테스트와 CI에서는 허용할 수 있는 수준이지만, 활성화된 상태로 릴리스 빌드를 배포하지는 않습니다.

테스트와 함께 사용하기

CI에서 ASan을 사용하여 단위 테스트를 실행하세요. 많은 실제 버그는 새니타이저가 켜진 상태에서 테스트를 실행할 때만 드러납니다. 새니타이저 전용 빌드 구성을 유지하세요.

주의를 대신할 수는 없습니다

ASan은 실제로 실행한 코드 경로에서만 버그를 찾습니다. 충분한 테스트 범위와 함께 사용하세요. 실행되지 않은 버그 분기는 계속 숨겨져 있습니다.

빠른 확인

ASan을 활성화하는 방법을 떠올려 보세요.

복습

AddressSanitizer를 배웠습니다.

  • 범위를 벗어난 접근, 해제 후 사용, 이중 해제, 메모리 누수를 탐지합니다
  • -fsanitize=address -g로 활성화합니다
  • 보고서에 오류가 표시되고 할당 및 해제 호출 스택이 나타납니다
  • 약 2배 느려지므로 테스트와 CI에 적합하고 릴리스에는 적합하지 않습니다

자주 묻는 질문

“AddressSanitizer” 강의는 무료인가요?

네 — “AddressSanitizer” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“AddressSanitizer”에서 뭘 배우나요?

메모리 오류 잡기 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C++ Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“AddressSanitizer” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. gdb와 lldb 사용하기
  2. AddressSanitizer
  3. UBSan과 TSan
  4. Valgrind 기초
← C++ Academy(으)로 돌아가기