참고 항목
향후 릴리스에서 보고 싶은 내용에 대한 피드백을 보내고 문제가 발생할 경우 버그를 보고합니다.
호환되지 않는 옵션 및 기능
다음 옵션 및 기능은 호환되지 않으며 /fsanitize=address
사용하지 않도록 설정하거나 피해야 합니다.
-
/RTC
옵션은 AddressSanitizer와 호환되지 않으며 비활성화해야 합니다. - 증분 연결 은 지원되지 않으며 사용하지 않도록 설정해야 합니다.
- 편집 및 계속하기는 지원되지 않으며 비활성화해야 합니다.
- 코루틴은 AddressSanitizer와 호환되지 않으며 다시 시작 가능한 함수는 계측에서 제외됩니다.
- OpenMP 는 지원되지 않으며 사용하지 않도록 설정해야 합니다.
- 관리되는 C++ 는 지원되지 않으며 사용하지 않도록 설정해야 합니다.
- C++ AMP는 지원되지 않으며 비활성화해야 합니다.
- UWP(유니버설 Windows 플랫폼) 애플리케이션은 지원되지 않습니다.
- 특수 사례 목록 파일은 지원되지 않습니다.
-
주소 없이
/fsanitize
빌드된 미리 컴파일된 헤더는 지원되지 않습니다.
표준 라이브러리 지원
MSVC 표준 라이브러리(STL)는 AddressSanitizer를 부분적으로 사용하고 다른 코드 안전 검사를 제공합니다. 자세한 내용은 컨테이너 오버플로 오류를 참조 하세요.
주석을 사용하지 않도록 설정하거나 해당 주석을 지원하지 않는 표준 라이브러리 버전에서 STL 코드에서 발생한 AddressSanitizer 예외는 여전히 실제 버그를 식별합니다. 그러나 주석을 사용하도록 설정하고 이를 지원하는 표준 라이브러리 버전을 사용하는 경우 더 정확합니다.
이 예제에서는 전체 자릿수가 부족하고 주석을 사용할 수 있는 이점을 보여 줍니다.
// Compile with: cl /fsanitize=address /Zi
#include <vector>
int main() {
// Create a vector of size 10, but with a capacity of 20.
std::vector<int> v(10);
v.reserve(20);
// In versions prior to 17.2, MSVC ASan does NOT raise an exception here.
// While this is an out-of-bounds write to 'v', MSVC ASan
// ensures the write is within the heap allocation size (20).
// With 17.2 and later, MSVC ASan will raise a 'container-overflow' exception:
// ==18364==ERROR: AddressSanitizer: container-overflow on address 0x1263cb8a0048 at pc 0x7ff6466411ab bp 0x005cf81ef7b0 sp 0x005cf81ef7b8
v[10] = 1;
// Regardless of version, MSVC ASan DOES raise an exception here, as this write
// is out of bounds from the heap allocation.
v[20] = 1;
}
새 연산자 재정의 및 삭제
AddressSanitizer(ASan)는 사용자 지정 버전을 operator new
사용하고 다음과 operator delete
같은 alloc_dealloc_mismatch
할당 오류를 찾습니다. 링커를 /INFERASANLIBS
사용하여 실행하면 ASan의 재정의 new
delete
/우선 순위가 낮아지므로 링커는 ASan의 사용자 지정 버전보다 다른 라이브러리에서 선택 operator new
하거나 operator delete
재정의합니다. 이 경우 ASan은 사용자 지정 operator new
및 operator delete
에 의존하는 일부 오류를 catch하지 못할 수 있습니다.
MFC 에는 사용자 지정 재정의가 operator new
포함되어 있으며 operator delete
다음과 같은 alloc_dealloc_mismatch
오류가 누락될 수 있습니다.
메모리 사용량
AddressSanitizer 런타임은 실행 중에 메모리를 OS로 다시 해제하지 않으므로 메모리가 모두 미리 할당되지 않습니다. OS의 관점에서 볼 때 메모리 누수처럼 보일 수 있습니다.
AddressSanitizer 런타임 DLL 위치
런타임 파일은 clang_rt.asan*.dll
.의 %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\
컴파일러 옆에 설치됩니다. 이러한 위치는 디버깅 세션 및 Visual Studio 개발자 명령 프롬프트의 경로에 있습니다. 이러한 파일은 안 또는 C:\Windows\System32
에 C:\Windows\SysWOW64
배치되지 않습니다.
사용자 지정 속성 시트 지원
Visual Studio 속성 관리자 창을 사용하면 프로젝트에 사용자 지정 .props
파일을 추가할 수 있습니다. Enable Address Sanitizer빌드는 이를 인식하지 않습니다. 사용자 지정 .props
파일은 값을 사용하여 다른 속성을 설정하는 후 Microsoft.cpp.props
포함되므로 빌드는 <EnableASAN>
이를 적용하지 않습니다.
해결 방법으로 프로젝트의 루트에 파일을 만들어 Directory.Build.props
속성을 정의 <EnableASAN>
합니다. 자세한 내용은 C++ 빌드 사용자 지정을 참조 하세요.
스레드 지역 변수
스레드 지역 변수(또는 __declspec(thread)
함께 thread_local
선언된 전역 변수)는 AddressSanitizer로 보호되지 않습니다. 이 제한은 Windows 또는 Microsoft Visual C++에만 국한되지 않지만 일반적인 제한 사항입니다.
사용자 지정 코드는 일반 함수 반환 시퀀스를 건너뜁니다.
사용자 지정 코드 또는 어셈블리 언어를 사용하여 일반적인 반환 메커니즘을 적용하지 않고 현재 스택 프레임을 그대로 두는 것은 지원되지 않습니다. 예를 들어 긴 점프를 통해 현재 스택 프레임을 유지하면 가양성 발생이 발생할 수 있습니다.
대신 사용자 지정 긴 점프와 유사한 코드를 호출하기 전에 호출 __asan_handle_no_return()
합니다. 이 함수는 현재 스레드 스택과 연결된 모든 섀도 바이트를 지웁니다. 이로 인해 일부 검사 손실이 발생하며 거짓 부정의 위험이 발생합니다. 그러나 프로그램에서 부실 스택 섀도 바이트로 인해 가양성으로 실행하지 않고 스택을 안전하게 해제할 수 있습니다.
부분적으로 삭제된 실행 파일과 관련된 문제
프로세스의 모든 코드가 컴파일되지 /fsanitize=address
않은 경우 ASan은 모든 메모리 안전 오류를 진단하지 못할 수 있습니다. 가장 일반적인 예는 ASan으로 컴파일된 DLL이 ASan으로 컴파일되지 않은 코드를 포함하는 프로세스에 로드되는 경우입니다. 이 경우 ASan은 ASan 초기화 전에 발생한 할당을 분류하려고 합니다. 이러한 할당이 다시 할당되면 ASan은 메모리의 수명을 소유하고 모니터링하려고 합니다.
ASan으로 컴파일된 모든 DLL이 프로세스가 종료되기 전에 프로세스에서 언로드되는 경우 , 등과 같은 memcmp
memcpy
memmove
가로채는 함수에 대한 참조를 현수로 인해 충돌이 발생할 수 있습니다. 최상의 결과를 얻으려면 테스트 /fsanitize=address
중인 모든 모듈을 컴파일하거나 프로세스를 입력한 후 ASan으로 컴파일된 모듈을 언로드하지 마세요.
개발자 커뮤니티에 버그를 보고하세요.
참고 항목
AddressSanitizer 개요
AddressSanitizer 빌드 및 언어 참조
AddressSanitizer 런타임 참조
AddressSanitizer 섀도 바이트
AddressSanitizer 클라우드 또는 분산 테스트
AddressSanitizer 디버거 통합
AddressSanitizer 오류 예제