Freigeben über


/RTC (Laufzeitfehlerüberprüfungen)

Wird zur Aktivierung und Deaktivierung der Laufzeitfehlerüberprüfungen in Verbindung mit dem runtime_checks-Pragma verwendet.

/RTC1
/RTCc
/RTCs
/RTCu

Argumente

  • 1
    Äquivalent von /RTCsu.

  • c
    Meldet die Zuweisung eines Werts zu einem kleineren Datentyp und führt zu einem Datenverlust. Dies ist beispielsweise der Fall, wenn ein Wert vom Typ short 0x101 einer Variablen vom Typ char zugewiesen wird.

    Mit dieser Option werden Situationen gemeldet, in denen Sie eine Verkürzung beabsichtigen, z. B. wenn die ersten acht Bits eines int-Werts als char zurückgegeben werden sollen. Da /RTCc einen Laufzeitfehler verursacht, wenn als Ergebnis der Zuweisung Informationen verloren gehen, können Sie die gewünschten Informationen maskieren, um zu vermeiden, dass /RTCc zu einem Laufzeitfehler führt. Beispiele:

    #include <crtdbg.h>
    
    char get8bits(int 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);
    }
    
  • s
    Aktiviert die Laufzeitfehlerüberprüfung für Stapelrahmen wie folgt:

    • Initialisierung lokaler Variablen auf einen Wert ungleich 0. Dies erleichtert die Identifizierung von Fehlern, die beim Ausführen im Debugmodus nicht auftreten. Die Wahrscheinlichkeit, dass Stapelvariablen den Wert 0 haben, ist in einem Debugbuild höher als in einem Releasebuild, da der Compiler Stapelvariablen im Releasebuild optimiert. Nachdem ein Programm auf einen Stapelbereich zugegriffen hat, wird dieser vom Compiler nie auf 0 zurückgesetzt. Deshalb können nachfolgende, nicht initialisierte Stapelvariablen, die zufällig auf denselben Stapelbereich zugreifen, Werte zurückgeben, die noch vom vorherigen Zugriff auf diesen Stapelspeicherplatz stammen.

    • Erkennung von Über- und Unterläufen lokaler Variablen z. B. Arrays. /RTCs erkennt keine Überläufe beim Zugreifen auf den Speicher, der sich aus der Compilerauffüllung innerhalb einer Struktur ergibt. Füllzeichen können bei Verwendung von align (C++), /Zp (Ausrichten des Strukturmembers) oder pack auftreten und wenn Strukturelemente so geordnet werden, dass der Compiler Füllzeichen hinzufügen muss.

    • Stapelzeigerüberprüfung, erkennt Beschädigung des Stapelzeigers. Der Stapelzeiger kann durch Abweichungen einer Aufrufkonvention beschädigt werden. Dies kann z. B. geschehen, wenn Sie einen Funktionszeiger verwenden und eine Funktion in einer DLL aufrufen, die als __stdcall exportiert wird, den Zeiger für die Funktion jedoch als __cdecl deklarieren.

  • u
    Meldet die Verwendung einer Variablen ohne vorherige Initialisierung. So kann beispielsweise eine Anweisung, die den Fehler C4701 hervorruft, unter /RTCu auch einen Laufzeitfehler verursachen. Jede Anweisung, die den Fehler Compilerwarnung (Stufe 1 und Stufe 4) C4700 hervorruft, verursacht unter /RTCu einen Laufzeitfehler.

    Betrachten Sie jedoch das folgende Codefragment:

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

    Wenn die Initialisierung einer Variablen möglich gewesen wäre, wird dies zur Laufzeit nicht von /RTCu gemeldet. Wenn z. B. durch einen Zeiger ein Alias einer Variablen generiert wurde, findet der Compiler die Variable nicht und meldet eine Verwendung ohne Initialisierung. Eine Variable lässt sich durch die Verwendung ihrer Adresse initialisieren. Der Operator & übernimmt in dieser Situation die Rolle eines Zuweisungsoperators.

Hinweise

Laufzeitfehlerüberprüfungen bieten Ihnen die Möglichkeit, Fehler im ausgeführten Code zu finden. Weitere Informationen finden Sie unter Gewusst wie: Verwenden von systemeigenen Laufzeitprüfungen.

Wenn Sie das Programm in der Befehlszeile mit einer der /RTC-Compileroptionen kompilieren, treten bei allen optimize-Pragmaanweisungen im Code Fehler auf, es werden jedoch keine Fehlermeldungen angezeigt. Das kommt daher, dass Laufzeitfehlerüberprüfungen in einem Releasebuild (optimiertem Build) nicht zulässig sind.

Sie sollten /RTC für Entwicklungsbuilds verwenden; /RTC sollte nicht für einen Verkaufsversionsbuild verwendet werden. /RTC kann nicht mit Compiler-Optimierungen verwendet werden (/O-Optionen (Code optimieren)). Ein mit /RTC erstelltes Programmbild ist etwas größer und langsamer als ein mit /Od erstelltes Bild (bis zu 5 Prozent langsamer als ein /Od-Build).

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

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

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Ausführliche Informationen finden Sie unter Gewusst wie: Öffnen von Projekteigenschaftenseiten.

  2. Klicken Sie auf den Ordner C/C++.

  3. Klicken Sie auf die Eigenschaftenseite Codegenerierung.

  4. Ändern Sie eine oder beide folgenden Eigenschaften: Vollständige Laufzeitüberprüfungen oder Überprüfen von kleineren Typen.

So legen Sie diese Compileroption programmgesteuert fest

Siehe auch

Aufgaben

RTC-Beispiel: Laufzeitfehlerüberprüfungen

Referenz

Compileroptionen

Festlegen von Compileroptionen