/RTC (Laufzeitfehlerüberprüfungen)

Aktualisiert: November 2007

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. Beispiel:

    #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.

    • Entdeckung von Überläufen und Unterläufen lokaler Variablen, z. B. Arrays. /RTCs entdeckt keine Überläufe beim Zugriff auf Speicher, die sich aus Compiler-Füllzeichen innerhalb einer Struktur ergeben. 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 Compilerwarnung (Stufe 4) 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 Builds während der Entwicklung verwenden. Verwenden Sie /RTC jedoch nicht für Releasebuilds. /RTC kann mit Compileroptimierungen nicht 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

Hinweise für Entwickler intelligenter Geräte

Bei Gerätecompilern wird die RTC-Funktion nur auf x86 unterstützt und nicht als Eigenschafteneinstellung für Visual C++-Geräteprojekte in der Visual Studio-IDE verfügbar gemacht. Wenn Sie jedoch auf x86 abzielen, kann diese Option in der Entwicklungsumgebung im Bereich Zusätzliche Optionen auf der Eigenschaftenseite C/C++-Befehlszeile eingestellt werden.

Siehe auch

Aufgaben

RTC-Beispiel: Laufzeitfehlerüberprüfungen

Referenz

Compileroptionen

Festlegen von Compileroptionen