다음을 통해 공유


/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 개발 환경에서 이 컴파일러 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 방법: 프로젝트 속성 페이지 열기를 참조하십시오.

  2. C/C++ 폴더를 클릭합니다.

  3. 코드 생성 속성 페이지를 클릭합니다.

  4. 기본 런타임 검사 또는 작은 형식 검사 속성 중 하나 또는 양쪽 모두를 수정합니다.

프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면

스마트 장치 개발자 참고 사항

장치 컴파일러의 경우 RTC 기능은 x86에서만 지원되며 Visual Studio IDE에서 Visual C++ 장치 프로젝트에 대한 속성 설정으로 노출되지 않습니다. 그러나 x86을 대상으로 하는 경우 C/C++ 명령줄 속성 페이지에 있는 추가 옵션 창의 IDE에서 이 옵션을 설정할 수도 있습니다.

참고 항목

작업

RTC 샘플: 런타임 오류 검사

참조

컴파일러 옵션

컴파일러 옵션 설정