Partilhar via


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

Usado para ativar e desativar a funcionalidade de verificação de erros em tempo de execução, em conjunto com o pragma runtime_checks .

Sintaxe

/RTC1
/RTCc
/RTCs
/RTCu

Arguments

/RTC1
Equivalente a /RTCsu.

/RTCc
Reporta quando um valor é atribuído a um tipo de dado menor e resulta numa perda de dados. Por exemplo, reporta se um short valor de tipo de 0x0101 é atribuído a uma variável de tipo char.

Esta opção pode reportar situações em que pretendes mudar. Por exemplo, quando quer que os primeiros 8 bits de um int sejam devolvidos como um char. Como /RTCc causa um erro em tempo de execução se uma atribuição causar perda de informação, primeiro disfarce a informação necessária para 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 /RTCc rejeita código que cumpre o padrão, não é suportado pela C++ Standard Library. O código que utiliza /RTCc e a Biblioteca Padrão C++ pode causar erros do compilador C1189 ou C2338. Remova a /RTCc opção de usar a Biblioteca Padrão C++.

/RTCs
Permite a verificação de erros em tempo de execução de frames de pilha, da seguinte forma:

  • Inicialização de variáveis locais para um valor não nulo. Esta opção ajuda a identificar bugs que não aparecem ao correr em modo de depuração. Há uma maior probabilidade de as variáveis de pilha ainda terem valor zero numa build de depuração comparado com uma build de release. Isto deve-se às otimizações do compilador para variáveis de pilha numa versão de release. Depois de um programa ter usado uma área da sua pilha, nunca é reiniciado para 0 pelo compilador. Isto significa que quaisquer variáveis de pilha não inicializadas que mais tarde usem a mesma área de pilha podem devolver valores remanescentes do uso anterior desta memória de pilha.

  • Deteção de ultrapassos e subcorrimentos de variáveis locais, como arrays. /RTCs não deteta overruns ao aceder à memória que resultam do preenchimento do compilador dentro de uma estrutura. O preenchimento pode ocorrer usando align, /Zp (Alinhamento dos Membros da Estrutura), ou pack, ou se ordenar os elementos da estrutura de forma a exigir que o compilador adicione enchimento (padding).

  • Verificação de ponteiros de pilha, que deteta corrupção de ponteiros de pilha. A corrupção do ponteiro de pilha pode ser causada por um desajuste de convenção de chamada. Por exemplo, usando um ponteiro de função, chama uma função numa DLL que é exportada como __stdcall mas declara o ponteiro da função como __cdecl.

/RTCu
Reporta quando uma variável é usada sem ter sido inicializada. Por exemplo, uma instrução que gera o aviso C4701 pode também gerar um erro em tempo de execução sob /RTCu. Qualquer instrução que gere o Aviso do Compilador (nível 1 e 4) C4700 gerará um erro em tempo de execução sob /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, não é reportada em tempo de execução por /RTCu. Por exemplo, depois de uma variável ser aliasada através de um apontador, o compilador não rastreia a variável e reporta usos não inicializados. Na prática, pode inicializar uma variável tomando o seu endereço. O & operador funciona como um operador de atribuição nesta situação.

Observações

As verificações de erro em tempo de execução são uma forma de encontrar problemas no seu código em execução; Para mais informações, veja Como: Usar verificações nativas de tempo de execução.

Podes especificar mais do que uma /RTC opção na linha de comandos. Os argumentos das opções podem ser combinados; por exemplo, /RTCcu é o mesmo que /RTCc /RTCu.

Se compilar o seu programa na linha de comandos usando qualquer uma das /RTC opções do compilador, qualquer instrução pragma optimize no seu código falha silenciosamente. Isto porque as verificações de erro em tempo de execução não são válidas numa versão de lançamento (otimizada).

Uso /RTC para builds de desenvolvimento; Não uses /RTC para uma versão de lançamento. /RTC não pode ser usado com otimizações de compiladores (/O Opções (Otimizar Código)). Uma imagem de programa construída com /RTC é ligeiramente maior e ligeiramente mais lenta do que uma imagem construída com /Od (até 5 por cento mais lenta do que uma /Od build).

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

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

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

  2. Selecione a página de propriedades Configuration Properties>C/C++>Code Generation página de propriedades.

  3. Modificar uma ou ambas as seguintes propriedades: Verificações Básicas em Tempo de Execução ou Verificação de Tipo Menor.

Para definir essa opção do compilador programaticamente

Consulte também

opções do compilador MSVC
de sintaxe de linha de comando do compilador MSVC
Como: Usar verificações nativas de tempo de execução