Compartir a través de


/RTC (Comprobaciones de errores en tiempo de ejecución)

Se usa para activar y deshabilitar la característica de comprobación de errores en tiempo de ejecución, junto con el pragma runtime_checks.

Sintaxis

/RTC1
/RTCc
/RTCs
/RTCu

Argumentos

/RTC1
Equivalente a /RTCsu.

/RTCc
Informa cuando se asigna un valor a un tipo de datos más pequeño y se provoca una pérdida de datos. Por ejemplo, notifica si se asigna un valor de tipo short de 0x0101 a una variable de tipo char.

Esta opción puede informar de las situaciones en las que se va a truncar. Por ejemplo, cuando se quieren los primeros 8 bits de un int devuelto como char. Debido a que /RTCc provoca un error en tiempo de ejecución si una asignación causa alguna pérdida de información, primero oculte la información que necesita para evitar el error en tiempo de ejecución. Por ejemplo:

#include <crtdbg.h>

char get8bits(unsigned 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);
}

Debido a que /RTCc rechaza el código que se ajusta al estándar, no es compatible con la biblioteca estándar de C++. El código que usa /RTCc y la biblioteca estándar de C++ pueden producir el error del compilador C1189. Puede definir _ALLOW_RTCc_IN_STL para silenciar la advertencia y usar la opción /RTCc.

/RTCs
Habilita la comprobación de errores en tiempo de ejecución del marco de la pila, como se indica a continuación:

  • Inicialización de las variables locales en un valor distinto de cero. Esta opción ayuda a identificar los errores que no aparecen al ejecutarse en el modo de depuración. Hay una mayor probabilidad de que las variables de la pila sigan teniendo un valor cero en una compilación de depuración comparado con una compilación de versión. Esto se debe a las optimizaciones del compilador de las variables de pila en una compilación de versión. Una vez que un programa ha usado un área de su pila, el compilador nunca la pone a 0. Esto significa que las variables de pila no inicializadas que usen más tarde la misma área de pila pueden devolver los valores sobrantes del uso anterior de esta memoria de pila.

  • Detección de saturaciones e infrautilización de variables locales, como las matrices. /RTCs no detecta los desbordamientos cuando se accede a la memoria que resulta del relleno del compilador dentro de una estructura. El relleno podría producirse mediante align, /Zp (Alineación de miembros de estructura) o pack, o si ordena los elementos de estructura de tal manera que requiera que el compilador agregue el relleno.

  • Comprobación del puntero de la pila, que detecta los daños en el puntero de la pila. Los daños en el puntero de la pila pueden deberse a un error de coincidencia en la convención de llamada. Por ejemplo, mediante un puntero de función, se llama a una función en un archivo DLL que se exporta como __stdcall, pero se declara el puntero a la función como __cdecl.

/RTCu
Informa cuando se usa una variable sin que se haya inicializado. Por ejemplo, una instrucción que genera la advertencia C4701 también puede generar un error en tiempo de ejecución en /RTCu. Cualquier instrucción que genere Advertencia del compilador (nivel 1 y nivel 4) C4700 generará un error en tiempo de ejecución en /RTCu.

Sin embargo, considere el siguiente fragmento de código:

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

Si se ha podido inicializar una variable, no se notifica en tiempo de ejecución mediante /RTCu. Por ejemplo, después de que una variable se agrega a través de un puntero, el compilador no hace un seguimiento de la variable y notifica los usos sin inicializar. De hecho, se puede inicializar una variable usando la dirección. El operador & funciona como un operador de asignación en esta situación.

Comentarios

Las comprobaciones de errores en tiempo de ejecución son una manera de encontrar problemas en el código en ejecución; para más información, vea Procedimiento: Usar comprobaciones en tiempo de ejecución nativas.

Puede especificar más de una opción /RTC en la línea de comandos. Los argumentos de opción se pueden combinar, por ejemplo, /RTCcu es igual que /RTCc /RTCu.

Si compila el programa en la línea de comandos mediante cualquiera de las opciones del compilador /RTC, se producirá un error de manera imperceptible en cualquier instrucción de pragma optimize en el código. Esto se debe a que las comprobaciones de errores en tiempo de ejecución no son válidas en una compilación de versión (optimizada).

Uso de /RTC para las compilaciones de desarrollo; no use /RTC para una compilación de versión. /RTC no se puede usar con las optimizaciones del compilador (/O Opciones (Optimizar código)). Una imagen de programa creada con /RTC es ligeramente mayor y más lenta que una imagen creada con /Od (hasta un 5 por ciento más lenta que una compilación /Od).

La directiva de preprocesador __MSVC_RUNTIME_CHECKS se definirá cuando use cualquier opción /RTC o /GZ.

Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento del compilador de C++ y de propiedades de compilación en Visual Studio.

  2. Seleccione la página de propiedades Propiedades de configuración>C/C++>Generación de código.

  3. Modifique una o las dos propiedades siguientes: Comprobaciones básicas en tiempo de ejecución o Comprobación de tipos más pequeños.

Para establecer esta opción del compilador mediante programación

Consulte también

Opciones del compilador de MSVC
Sintaxis de línea de comandos del compilador de MSVC
Cómo: usar comprobaciones nativas en tiempo de ejecución