/RTC (Laufzeitfehlerprüfungen)

Wird verwendet, um das Feature zur Laufzeitfehlerüberprüfung in Verbindung mit dem runtime_checks Pragma zu aktivieren und zu deaktivieren.

Syntax

/RTC1
/RTCc
/RTCs
/RTCu

Argumente

/RTC1
Entspricht /RTCsu.

/RTCc
Meldet, wenn einem kleineren Datentyp ein Wert zugewiesen wird und zu einem Datenverlust führt. Beispielsweise wird gemeldet, ob ein short Typwert 0x0101 einer Variablen vom Typ charzugewiesen ist.

Diese Option kann Situationen melden, in denen Sie abschneiden möchten. Wenn Sie z. B. die ersten 8 Bits eines int zurückgegebenen Elements als ein char. Da /RTCc ein Laufzeitfehler verursacht wird, wenn eine Zuordnung Informationsverluste verursacht, maskieren Sie zuerst die Informationen, die Sie benötigen, um den Laufzeitfehler zu vermeiden. Beispiel:

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

Da /RTCc Code abgelehnt wird, der dem Standard entspricht, wird er von der C++-Standardbibliothek nicht unterstützt. Code, der verwendet wird /RTCc , und die C++-Standardbibliothek kann den Compilerfehler C1189 verursachen. Sie können definieren _ALLOW_RTCc_IN_STL , um die Warnung zu stillen und die /RTCc Option zu verwenden.

/RTCs
Aktiviert die Stapelframe-Laufzeitfehlerüberprüfung wie folgt:

  • Initialisierung lokaler Variablen in einen Wert ungleich Null. Diese Option hilft beim Identifizieren von Fehlern, die nicht angezeigt werden, wenn sie im Debugmodus ausgeführt werden. Es besteht eine größere Wahrscheinlichkeit, dass Stapelvariablen im Vergleich zu einem Releasebuild immer noch einen Nullwert in einem Debugbuild aufweisen. Das liegt an Compileroptimierungen von Stapelvariablen in einem Releasebuild. Sobald ein Programm einen Bereich seines Stapels verwendet hat, wird es nie vom Compiler auf 0 zurückgesetzt. Dies bedeutet, dass alle nicht initialisierten Stapelvariablen, die denselben Stapelbereich später verwenden, Werte zurückgeben können, die von der früheren Verwendung dieses Stapelspeichers übrig bleiben.

  • Erkennung von Überläufen und Unterläufen lokaler Variablen wie Arrays. /RTCs erkennt keine Überläufe beim Zugriff auf den Arbeitsspeicher, der aus dem Compilerabstand innerhalb einer Struktur resultiert. Padding kann mithilfe alignvon , /Zp (Struct Member Alignment) oder pack, oder , oder, wenn Sie Strukturelemente so ordnen, dass der Compiler Abstand hinzufügen muss.

  • Stapelzeigerüberprüfung, die Stapelzeigerbeschädigung erkennt. Stapelzeigerbeschädigung kann durch eine Konfliktübereinstimmung bei aufrufenden Konventionen verursacht werden. Beispielsweise rufen Sie mithilfe eines Funktionszeigers eine Funktion in einer DLL auf, die exportiert wird, aber __stdcall Sie deklarieren den Zeiger auf die Funktion als __cdecl.

/RTCu
Meldet, wenn eine Variable verwendet wird, ohne initialisiert zu werden. Eine Anweisung, die eine Warnung C4701 generiert, kann z. B. auch einen Laufzeitfehler unter /RTCu. Jede Anweisung, die die Compilerwarnung (Ebene 1 und Ebene 4) C4700 generiert, generiert einen Laufzeitfehler unter /RTCu.

Berücksichtigen Sie jedoch das folgende Codefragment:

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

Wenn eine Variable initialisiert werden könnte, wird sie zur Laufzeit nicht gemeldet von /RTCu. Wenn beispielsweise eine Variable über einen Zeiger aliast wurde, verfolgt der Compiler die Variable nicht und meldet nicht initialisierte Verwendungen. Tatsächlich können Sie eine Variable initialisieren, indem Sie deren Adresse verwenden. Der & Operator funktioniert in dieser Situation wie ein Zuordnungsoperator.

Hinweise

Laufzeitfehlerprüfungen sind eine Möglichkeit, um Probleme in Ihrem ausgeführten Code zu finden. weitere Informationen finden Sie unter How to: Use native run-time checks.

Sie können mehr als eine /RTC Option in der Befehlszeile angeben. Die Optionsargumente können kombiniert werden; Ist z. B /RTCcu . identisch mit /RTCc /RTCu.

Wenn Sie Ihr Programm in der Befehlszeile mithilfe einer der /RTC Compileroptionen kompilieren, schlagen alle Pragma-Anweisungen optimize im Code im Hintergrund fehl. Das liegt daran, dass Laufzeitfehlerprüfungen in einem Releasebuild (optimiert) nicht gültig sind.

Verwendung /RTC für Entwicklungsbuilds; Verwenden /RTC Sie nicht für einen Releasebuild. /RTC kann nicht mit Compileroptimierungen verwendet werden (/O Optionen (Optimierungscode)). Ein programmgesteuertes /RTC Image ist etwas größer und etwas langsamer als ein mit /Od (bis zu 5 Prozent langsamer als ein /Od Build).

Die __MSVC_RUNTIME_CHECKS Präprozessordirektive wird definiert, wenn Sie eine beliebige /RTC Option verwenden oder /GZ.

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).

  2. Wählen Sie die Eigenschaftenseite Konfigurationseigenschaften>C/C++>Codegenerierung aus.

  3. Ändern Sie eine oder beide der folgenden Eigenschaften: Grundlegende Laufzeitüberprüfungen oder kleinere Typüberprüfungen.

So legen Sie diese Compileroption programmgesteuert fest

Siehe auch

MSVC-Compileroptionen
MSVC-Compiler-Befehlszeilensyntax
How to: Use native run-time checks (Vorgehensweise: Verwenden von nativen Laufzeitüberprüfungen)