Compartilhar via


/RTC (verificações de erro em tempo de execução)

Usada para habilitar e desabilitar o recurso de verificações de erro em tempo de execução, em conjunto com o pragma runtime_checks.

Sintaxe

/RTC1
/RTCc
/RTCs
/RTCu

Argumentos

/RTC1
Equivalente a /RTCsu.

/RTCc
Informa quando um valor é atribuído a um tipo de dados menor e resulta em perda de dados. Por exemplo, ele relata se um valor de tipo short igual a 0x0101 é atribuído a uma variável do tipo char.

Essa opção pode relatar situações nas quais você pretende truncar. Por exemplo, quando você quiser os primeiros 8 bits de um int retornado como um char. Como /RTCc causa um erro em tempo de execução se uma atribuição causar qualquer perda de informações, primeiro retire a mascara das informações que você precisa a fim de evitar o erro em tempo de execução. Por exemplo:

#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);
}

Como a /RTCc rejeita o código que está em conformidade com o padrão, ela não tem suporte na Biblioteca Padrão do C++. O código que usa /RTCc e a Biblioteca Padrão do C++ pode causar o erro do compilador C1189. Você pode definir _ALLOW_RTCc_IN_STL para silenciar o aviso e usar a opção /RTCc.

/RTCs
Habilita a verificação de erro em tempo de execução do registro de ativação, da seguinte maneira:

  • Inicialização de variáveis locais para um valor diferente de zero. Essa opção ajuda a identificar bugs que não aparecem ao executar no modo de depuração. Há uma chance maior de que as variáveis de pilha ainda tenham um valor zero em um build de depuração se comparadas com um build de lançamento. Isso ocorre devido às otimizações do compilador das variáveis de pilha em um build de lançamento. Depois que um programa tiver usado uma área de sua pilha, ela nunca será redefinida para 0 pelo compilador. Isso significa que todas as variáveis de pilha não inicializadas que usarem a mesma área de pilha posteriormente poderão retornar valores que sobraram do uso anterior dessa memória de pilha.

  • Detecção de saturações e falta de execução de variáveis locais, como matrizes. A /RTCs não detecta saturações ao acessar a memória resultante do preenchimento do compilador em uma estrutura. O preenchimento pode ocorrer usando align, /Zp (Alinhamento de Membro de Struct) ou pack, ou se você ordenar elementos de estrutura de forma a exigir que o compilador adicione preenchimento.

  • Verificação do ponteiro da pilha, que detecta a corrupção do ponteiro da pilha. A corrupção do ponteiro de pilha pode ser causada por uma incompatibilidade de convenção de chamada. Por exemplo, usando um ponteiro de função, você chama uma função em uma DLL exportada como __stdcall, mas declara o ponteiro para a função como __cdecl.

/RTCu
Relata quando uma variável é usada sem ter sido inicializada. Por exemplo, uma instrução que gera o aviso C4701 também pode gerar um erro em tempo de execução em /RTCu. Qualquer instrução que gere o Aviso do Compilador (nível 1 e nível 4) C4700 gerará um erro em tempo de execução em /RTCu.

No entanto, considere o seguinte fragmento de código:

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

Se uma variável pudesse ter sido inicializada, ela não será relatada em tempo de execução por /RTCu. Por exemplo, depois que uma variável recebe um alias por meio de um ponteiro, o compilador não controla a variável e relata usos não inicializados. Na verdade, você pode inicializar uma variável usando seu endereço. O operador & funciona como um operador de atribuição nessa situação.

Comentários

As verificações de erro em tempo de execução são uma forma de você encontrar problemas no código em execução; para obter mais informações, confira Como usar verificações de tempo de execução nativas.

Você pode especificar mais de uma opção /RTC na linha de comando. Os argumentos da opção podem ser combinados; por exemplo, /RTCcu é o mesmo que /RTCc /RTCu.

Se você compilar o programa na linha de comando usando qualquer uma das opções do compilador /RTC, as instruções de pragma optimize em seu código falharão silenciosamente. Isso ocorre porque as verificações de erro em tempo de execução não são válidas em um build de lançamento (otimizado).

Uso /RTC para builds de desenvolvimento; não use /RTC para um build de lançamento. /RTC não pode ser usado com otimizações do compilador ( Opções /O (Otimizar Código)). Uma imagem do programa criada com /RTC é um pouco maior e ligeiramente mais lenta do que uma imagem criada com /Od (até 5% mais lenta que um build /Od).

A diretiva de pré-processador __MSVC_RUNTIME_CHECKS será definida quando você usar qualquer opção /RTC ou /GZ.

Para definir esta opção do compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter detalhes, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.

  2. Selecione a página de propriedades Propriedades da Configuração>C/C++>Geração de Código.

  3. Modifique uma ou ambas as propriedades a seguir: Verificações básicas de runtime ou Verificação de tipo menor.

Para definir essa opção do compilador via programação

Confira também

Opções do compilador MSVC
Sintaxe de linha de comando do compilador MSVC
Como usar verificações de tempo de execução nativas