- Alloc/dealloc 불일치 및 new/delete 타입 불일치
- 힙에 비해 너무 큰 할당
- calloc 오버플로 및 alloca 오버플로
- Double free 및 use after free
- 전역 변수 오버플로
- 힙 버퍼 오버플로
- 정렬된 값의 잘못된 정렬
- memcpy 및 strncat 매개 변수 겹침
- 스택 버퍼 오버플로 및 언더플로
- 스택 return 후 사용 및 스코프 후 사용
- poison된 이후의 메모리 사용
컴파일러에서 ASan 활성화
Address Sanitizer는 Visual Studio 프로젝트 시스템, CMake 빌드 시스템, IDE와 통합되어 있습니다. 프로젝트는 하나의 추가 컴파일러 옵션/fsanitize=address 를 사용하거나 Visual Studio에서 프로젝트 속성을 설정하여 AddressSanitizer를 활성화할 수 있습니다.
이 옵션은 x64의 모든 최적화 수준 및 구성과 호환됩니다. 그러나
edit-and-continue, incremental linking, /RTC와는 호환되지 않으며, ASan으로 컴파일하기 전에 이들을 비활성화해야 합니다.$(VC_LibraryPath_VC_x64) 값이 다른 라이브러리에 사용되지 않도록 목록의 마지막 항목이 되도록 하세요.
ASan 런타임 요구 사항
ASan이 활성화된 상태로 게임이 빌드되면 기능을 활성화하기 위해 런타임에 추가 DLL이 필요합니다. 기본적으로 ASan이 컴파일러에서 활성화되면 이 DLL은 프로젝트 출력 디렉터리에 복사되며, 그런 다음 실행 파일 옆에 콘솔로 배포되어야 합니다. 필요한 경우 Visual Studio의$(VC_ExecutablePath_x64) 디렉터리에서 수동으로 DLL을 찾을 수 있습니다. XBOX는 빌드 버전에 따라 다음 두 개 중 하나가 필요합니다.
런타임 디버거 지원
ASan이 활성화된 게임을 디버거를 연결한 상태로 실행하면, 오류가 발견될 경우 디버거로 중단되고 오류가 발생한 위치를 파악할 수 있는 자세한 보고서가 표시됩니다. 그러나 자동화된 테스트 프레임워크처럼 디버거 없이 실행하는 경우 오류 정보는 표준 출력에 표시되며 게임이 종료됩니다. 이는 유용할 수 있지만, 크래시의 근본 원인을 찾기 위해 더 많은 상태 정보가 필요할 수 있는데 이때 Crash Dump 지원이 유용합니다.디버거 없이 실행하면서 이 시점에 심볼을 해결하려면
llvm-symbolizer.exe 파일을 게임 EXE와 함께 배포해야 합니다. 이 파일은 위에 나열된 ASan 런타임 DLL과 같은 위치에서 찾을 수 있습니다.런타임 Crash Dump 지원
Visual Studio 16.9.8 또는 16.10.2부터 ASan은 오류와 연결된 메타데이터가 포함된 크래시 덤프 파일을 저장하도록 구성할 수 있습니다. Visual Studio의 디버거는 덤프 파일에 저장된 메타데이터를 파싱하여 크래시에 대한 더 많은 컨텍스트를 제공합니다. 빌드별로 이 크래시 덤프 저장을 구성하고, 이러한 이진 아티팩트를 저장한 다음, 적절한 소스 인덱싱을 사용해 IDE에서 볼 수 있습니다. 크래시 덤프 설명서는 여기에서 확인할 수 있습니다. Configuring Crash Dumps(Microsoft Docs) 그러나 위에 링크된 접근 방식은 환경 변수 설정이 필요하며, 이는 XBOX에서 지원되지 않기 때문에 대안 방식이 구현되었습니다. XBOX 타이틀에 크래시 덤프 지원을 추가하려면 필요한 크래시 덤프 파일 이름 정보를 ASan에 제공하는 함수 콜백을 간단히 정의하면 됩니다. 아래 세 가지 예를 확인하세요.파일 이름은 Visual Studio IDE 규칙을 따르기 위해 일반적으로 .dmp 접미사를 갖습니다.
이전 함수와 마찬가지로 이 오버라이드도 XBOX에서 선택 사항이지만, 디버거 없이 ASan 정보를 수집하기 위해 크래시 덤프를 사용하려면 강력히 권장됩니다. 덤프 파일 이름을 제공하되 dumptype 오버라이드를 제공하지 않으면 XBOX에서 유효한 크래시 덤프를 생성하지 못합니다.
ASan 예제 코드
이 코드는 이러한 함수를 기존 코드베이스에 얼마나 쉽게 추가하고 필요에 따라 조정할 수 있는지 보여줍니다.알려진 문제
- Visual Studio 2019(16.11)의 ASan은 Game OS와 호환되지 않습니다.
- ASan DLL은 Game OS와 호환되지 않으며 17.12 및 17.13 초기 릴리스에서 로드에 실패합니다. 이는 17.12.6 및 17.13.3에서 수정되었습니다.
- Visual Studio 2022에서 시작 시 크래시를 유발한 Game OS용 ASan 지원의 회귀는 17.14.29 및 Visual Studio 2026의 18.4.1에서 수정되었습니다.
- XBOX에서 디버거를 사용해 실행할 때 다음 예외 메시지가 정기적으로 발생하지만 안전하게 무시할 수 있습니다.
