/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 usandoalign
,/Zp
(Alinhamento de Membro de Struct) oupack
, 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
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.
Selecione a página de propriedades Propriedades da Configuração>C/C++>Geração de Código.
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
- Consulte as propriedades BasicRuntimeChecks e SmallerTypeCheck.
Confira também
Opções do compilador MSVC
Sintaxe da linha de comando do compilador MSVC
Como usar verificações de tempo de execução nativas