/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 char
zugewiesen 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. Zum 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 mithilfealign
von ,/Zp
(Struct Member Alignment) oderpack
, 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
Ö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).
Wählen Sie die Eigenschaftenseite Konfigurationseigenschaften>C/C++>Codegenerierung aus.
Ä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 die Eigenschaften BasicRuntimeChecks und SmallerTypeCheck.
Siehe auch
MSVC-Compileroptionen
Syntax für die MSVC-Compilerbefehlszeile
How to: Use native run-time checks (Vorgehensweise: Verwenden von nativen Laufzeitüberprüfungen)