/RTC (Run-Time Error Checks)
Collapse the table of content
Expand the table of content
Important This document may not represent best practices for current development, links to downloads and other resources may no longer be valid. Current recommended version can be found here. ArchiveDisclaimer

/RTC (Run-Time Error Checks)


Run-time error checks are a way for you to find problems in your running code; see Using Native Run-Time Checks for a full description of this feature. The run-time error checks feature is enabled and disabled by the /RTC group of compiler options and the runtime_checks pragma.

Option Description
/RTC1 Equivalent of /RTCsu.
/RTCc Reports when a value is assigned to a smaller data type that results in a data loss. For example, if a value of type short 0x101 is assigned to a variable of type char.

This option will report situations where you intend to truncate, as in a situation where you want the first eight bits of an int returned as a char. Since /RTCc will cause a run-time error if any information will be lost as a result of the assignment, you can mask off the information you need to avoid a run-time error as a result of /RTCc. For example:

#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()
/RTCs Enables stack frame run-time error checking:
  • Initialization of local variables to a nonzero value. This helps identify bugs that do not appear when running in debug mode. There is a greater chance that stack variables will still be zero in a debug build compared to a release build because of compiler optimizations of stack variables in a release build. Once a program has used an area of its stack, it is never reset to 0 by the compiler. Therefore, subsequent, uninitialized stack variables that happen to use the same stack area can return values left over from the prior use of this stack memory.
  • Detection of overruns and underruns of local variables such as arrays. /RTCs will not detect overruns when accessing memory that results from compiler padding within a structure. Padding could occur by using align, /Zp, or pack, or if you order structure elements in such a way as to require the compiler to add padding.
  • Stack pointer verification, which detects stack pointer corruption. Stack pointer corruption can be caused by a calling convention mismatch. For example, using a function pointer, you call a function in a DLL that is exported as __stdcall but you declare the pointer to the function as __cdecl.
/RTCu Reports when a variable is used without having been initialized. For example, an instruction that generates C4701 may also generate a run-time error under /RTCu. Any instruction that generates C4700 will generate a run-time error under /RTCu.

However, consider the following code fragment:

int a, *b, c;
if ( 1 )
b = &a;
c = a;  // no run-time error with /RTCu

If a variable could have been initialized, it will not be reported at run time by /RTCu. For example, after a variable is aliased through a pointer, the compiler will not track the variable and report uninitialized uses. In effect, you can initialize a variable by taking its address. The & operator works like an assignment operator in this situation.

Note   If you compile your program at the command line using any of the /RTC compiler options, any pragma optimize instructions in your code will silently fail. This is because run-time error checks are not valid in a release (optimized) build.

The __MSVC_RUNTIME_CHECKS preprocessor directive will be defined when you use any /RTC option or /GZ.

To set this compiler option in the Visual Studio development environment

  1. Open the project's Property Pages dialog box. For details, see Setting Visual C++ Project Properties.
  2. Click the C/C++ folder.
  3. Click the Code Generation property page.
  4. Modify one or both of the following properties: Basic Runtime Checks or Smaller Type Check.

To set this compiler option programmatically

See BasicRuntimeChecks and SmallerTypeCheck properties.

See Also

Compiler Options | Setting Compiler Options | RTC sample

© 2016 Microsoft