Condividi tramite


/RTC (Controlli degli errori di runtime)

Usato per abilitare e disabilitare la funzionalità di controllo degli errori di runtime, in combinazione con il pragma runtime_checks .

Sintassi

/RTC1
/RTCc
/RTCs
/RTCu

Argomenti

/RTC1
È equivalente a /RTCsu.

/RTCc
Segnala quando un valore viene assegnato a un tipo di dati più piccolo e comporta una perdita di dati. Ad esempio, segnala se un short valore di tipo è 0x0101 assegnato a una variabile di tipo char.

Questa opzione può segnalare situazioni in cui si intende troncare. Ad esempio, quando si desidera che i primi 8 bit di un oggetto int restituito come char. Poiché /RTCc causa un errore di run-time se un'assegnazione causa una perdita di informazioni, mascherare prima le informazioni necessarie per evitare l'errore di runtime. Ad esempio:

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

Poiché /RTCc rifiuta il codice conforme allo standard, non è supportato dalla libreria standard C++. Il codice che usa /RTCc e la libreria standard C++ può causare l'errore del compilatore C1189. È possibile definire _ALLOW_RTCc_IN_STL per disattivare l'avviso e usare l'opzione /RTCc .

/RTCs
Abilita il controllo degli errori di runtime dello stack frame, come indicato di seguito:

  • Inizializzazione delle variabili locali in un valore diverso da zero. Questa opzione consente di identificare i bug che non vengono visualizzati durante l'esecuzione in modalità di debug. È possibile che le variabili dello stack abbiano ancora un valore zero in una build di debug rispetto a una build di versione. Ciò è dovuto alle ottimizzazioni del compilatore delle variabili dello stack in una build di versione. Una volta che un programma ha usato un'area dello stack, non viene mai reimpostata su 0 dal compilatore. Ciò significa che tutte le variabili dello stack non inizializzate che si verificano per usare la stessa area dello stack in un secondo momento possono restituire valori rimasti dall'uso precedente di questa memoria dello stack.

  • Rilevamento di sovraccarichi e sottorun di variabili locali, ad esempio matrici. /RTCs non rileva sovraccarichi durante l'accesso alla memoria risultante dal riempimento del compilatore all'interno di una struttura. La spaziatura interna può verificarsi usando align, /Zp (allineamento membri struct) o packoppure se si ordinano gli elementi della struttura in modo da richiedere al compilatore di aggiungere spaziatura interna.

  • Verifica del puntatore dello stack, che rileva il danneggiamento del puntatore dello stack. Il danneggiamento del puntatore dello stack può essere causato da una mancata corrispondenza delle convenzioni di chiamata. Ad esempio, usando un puntatore a funzione, si chiama una funzione in una DLL esportata come __stdcall ma si dichiara il puntatore alla funzione come __cdecl.

/RTCu
Segnala quando viene utilizzata una variabile senza essere stata inizializzata. Ad esempio, un'istruzione che genera l'avviso C4701 può anche generare un errore di run-time in /RTCu. Qualsiasi istruzione che genera l'avviso del compilatore (livello 1 e livello 4) C4700 genererà un errore di run-time in /RTCu.

Si consideri tuttavia il frammento di codice seguente:

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

Se una variabile potrebbe essere stata inizializzata, non viene segnalata in fase di esecuzione da /RTCu. Ad esempio, dopo l'aliasing di una variabile tramite un puntatore, il compilatore non tiene traccia della variabile e segnala gli usi non inizializzati. In effetti, è possibile inizializzare una variabile prendendone l'indirizzo. L'operatore & funziona come un operatore di assegnazione in questa situazione.

Osservazioni:

I controlli degli errori di runtime sono un modo per trovare problemi nel codice in esecuzione; Per altre informazioni, vedere Procedura: Usare controlli di runtime nativi.

È possibile specificare più opzioni nella riga di /RTC comando. Gli argomenti di opzione possono essere combinati; ad esempio, /RTCcu è uguale /RTCc /RTCua .

Se si compila il programma dalla riga di comando usando una qualsiasi delle opzioni del /RTC compilatore, le istruzioni pragma optimize nel codice hanno esito negativo in modo invisibile all'utente. Ciò è dovuto al fatto che i controlli degli errori di runtime non sono validi in una build di versione (ottimizzata).

Uso /RTC per le compilazioni di sviluppo; Non usare /RTC per una build di versione. /RTC non può essere usato con le ottimizzazioni del compilatore (/O Opzioni (Ottimizza codice)). Un'immagine del programma compilata con /RTC è leggermente più grande e leggermente più lenta rispetto a un'immagine compilata con /Od (fino al 5% più lenta di una compilazione /Od ).

La __MSVC_RUNTIME_CHECKS direttiva del preprocessore verrà definita quando si usa qualsiasi /RTC opzione o /GZ.

Per impostare l'opzione del compilatore nell'ambiente di sviluppo di Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà>di configurazione C/C++>Generazione codice.

  3. Modificare una o entrambe le proprietà seguenti: Controlli di base del runtime o Controllo dei tipi più piccoli.

Per impostare l'opzione del compilatore a livello di codice

Vedi anche

Opzioni del compilatore MSVC
Sintassi della riga di comando del compilatore MSVC
Procedura: Usare controlli di runtime nativi