/RTC(런타임 오류 검사)
업데이트: 2007년 11월
runtime_checks pragma와 함께 런타임 오류 검사 기능을 사용하거나 사용하지 않도록 설정하는 데 사용됩니다.
/RTC1
/RTCc
/RTCs
/RTCu
인수
1
/RTCsu에 해당합니다.c
더 작은 데이터 형식에 값이 할당됨으로써 데이터 손실이 발생하는 경우 이를 보고합니다. short 0x101 형식의 값을 char 형식의 변수에 할당하는 경우를 예를 들 수 있습니다.이 옵션을 사용하면 int의 처음 8비트를 필요로 할 때 그 결과가 char로서 반환되는 경우와 같이, 의도적으로 잘라내기를 한 경우에도 보고됩니다. 할당으로 인해 정보가 손실되는 경우 /RTCc는 런타임 오류를 발생시키므로, 사용자는 /RTCc의 결과로 발생하는 런타임 오류를 방지하기 위해 필요한 정보를 숨길 수 있습니다. 예를 들면 다음과 같습니다.
#include <crtdbg.h> char get8bits(int value, int position) { _ASSERT(position < 32); return (char)(value >> position); // Try the following line instead: // return (char)((value >> position) && 0xff); } int main() { get8bits(12341235,3); }
s
다음과 같이 스택 프레임 런타임 오류 검사를 수행합니다.지역 변수를 0이 아닌 값으로 초기화합니다. 이렇게 하면 디버그 모드에서 실행할 때 발견하지 못한 버그를 찾는 데 도움이 됩니다. 릴리스 빌드에서 스택 변수의 컴파일러 최적화 때문에, 릴리스 빌드보다 디버그 빌드에서 스택 변수가 0이 될 가능성이 더 높습니다 . 일단 프로그램에서 해당 스택 영역이 사용되었으면, 컴파일러에 의해 0으로 다시 설정되지 않습니다. 따라서, 같은 스택 영역을 사용하는 초기화되지 않은 다음 스택 변수는 이 스택 메모리에서 이전에 사용한 값을 반환할 수 있습니다.
배열과 같은 지역 변수의 오버런 및 언더런을 탐지합니다. /RTCs는 구조 내에서 컴파일러 패딩으로 인한 메모리에 액세스할 때 오버런을 탐지하지 못합니다. 패딩은 align (C++), /Zp(구조체 멤버 맞춤) 또는 pack을 사용하거나, 컴파일러에 패딩 추가를 요청하는 것과 같은 방식으로 구조 요소를 주문하는 경우에 발생할 수 있습니다.
스택 포인터 손상을 탐지하는 스택 포인터 확인을 수행합니다. 스택 포인터 손상은 호출 규칙 불일치에 의해 발생할 수 있습니다. 예를 들어, 함수 포인터를 사용하여 내보내지는 DLL의 함수가 __stdcall로 호출되지만, 함수에 대한 포인터는 __cdecl로 선언됩니다.
u
초기화되지 않고 변수가 사용될 때 보고합니다. 예를 들어, 컴파일러 경고(수준 4) C4701을 생성하는 명령에서도 /RTCu를 사용하면 런타임 오류가 발생할 수 있습니다. 컴파일러 경고(수준 1 및 수준 4) C4700을 생성하는 모든 명령에서는 /RTCu를 사용하면 런타임 오류가 발생합니다.그러나 다음 코드 부분을 살펴보십시오.
int a, *b, c; if ( 1 ) b = &a; c = a; // No run-time error with /RTCu
변수는 초기화될 수 있는 경우 /RTCu에 의해 런타임에 보고되지 않습니다. 예를 들어, 변수의 별칭이 포인터를 통해 지정된 후에는 컴파일러에서 변수를 추적하지 않으며 초기화되지 않은 사용을 보고하지 않습니다. 실제로, 사용자는 주소를 통해 변수를 초기화할 수 있습니다. & 연산자는 이 경우 할당 연산자 역할을 수행합니다.
설명
런타임 오류 검사를 통해 실행 코드에서 문제를 발견할 수 있습니다. 자세한 내용은 방법: 네이티브 런타임 검사 기능 사용을 참조하십시오.
/RTC 컴파일러 옵션을 사용하여 명령줄에서 프로그램을 컴파일하는 경우, 코드의 모든 optimize pragma 명령은 실패합니다. 이는 런타임 오류 검사가 릴리스 최적화 빌드에서 유효하지 않기 때문입니다.
개발 빌드에는 /RTC를 사용해야 합니다. 정품 빌드에는 /RTC를 사용하지 않는 것이 좋습니다. /RTC는 컴파일러 최적화에 사용할 수 없습니다(/O 옵션(코드 최적화)). /RTC를 사용하여 빌드한 프로그램 이미지는 /Od를 사용하여 빌드한 이미지보다 약간 크고 속도가 약간 느립니다(/Od 빌드의 경우보다 5% 느림).
__MSVC_RUNTIME_CHECKS 전처리기 지시문은 사용자가 /RTC 옵션이나 /GZ를 사용할 때 정의됩니다.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 방법: 프로젝트 속성 페이지 열기를 참조하십시오.
C/C++ 폴더를 클릭합니다.
코드 생성 속성 페이지를 클릭합니다.
기본 런타임 검사 또는 작은 형식 검사 속성 중 하나 또는 양쪽 모두를 수정합니다.
프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면
- BasicRuntimeChecks 및 SmallerTypeCheck 속성을 참조하십시오.
스마트 장치 개발자 참고 사항
장치 컴파일러의 경우 RTC 기능은 x86에서만 지원되며 Visual Studio IDE에서 Visual C++ 장치 프로젝트에 대한 속성 설정으로 노출되지 않습니다. 그러나 x86을 대상으로 하는 경우 C/C++ 명령줄 속성 페이지에 있는 추가 옵션 창의 IDE에서 이 옵션을 설정할 수도 있습니다.