/RTC (Körningsfelkontroller)

Används för att aktivera och inaktivera funktionen för körningsfelkontroller tillsammans med runtime_checks pragma.

Syntax

/RTC1
/RTCc
/RTCs
/RTCu

Arguments

/RTC1
Motsvarar /RTCsu.

/RTCc
Rapporterar när ett värde tilldelas till en mindre datatyp och resulterar i en dataförlust. Den rapporterar till exempel om ett short typvärde 0x0101 för tilldelas till en variabel av typen char.

Det här alternativet kan rapportera situationer där du tänker trunkera. Om du till exempel vill att de första 8 bitarna av en int returneras som en char. Eftersom /RTCc orsakar ett körningsfel om en tilldelning orsakar någon informationsförlust ska du först maskera den information som du behöver för att undvika körningsfelet. Till exempel:

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

Eftersom /RTCc avvisar kod som överensstämmer med standarden stöds den inte av C++-standardbiblioteket. Kod som använder /RTCc och C++-standardbiblioteket kan orsaka kompilatorfel C1189 eller C2338. Ta bort alternativet /RTCc för att använda C++-standardbiblioteket.

/RTCs
Aktiverar körningsfelkontroll för stackram på följande sätt:

  • Initiering av lokala variabler till ett värde som inte är noll. Det här alternativet hjälper dig att identifiera buggar som inte visas när de körs i felsökningsläge. Det finns en större chans att stackvariabler fortfarande har ett nollvärde i en felsökningsversion jämfört med en versionsversion. Det beror på kompilatoroptimeringar av stackvariabler i en versionsversion. När ett program har använt ett område i sin stack återställs det aldrig till 0 av kompilatorn. Det innebär att alla uninitialiserade stackvariabler som råkar använda samma stackområde senare kan returnera värden som är över från den tidigare användningen av det här stackminnet.

  • Identifiering av överskridanden och underkörningar av lokala variabler, till exempel matriser. /RTCs identifierar inte överskridanden vid åtkomst till minne som beror på utfyllnad av kompilatorn i en struktur. Utfyllnad kan ske med hjälp alignav , /Zp (Struct Member Alignment), eller pack, eller om du beställer strukturelement på ett sådant sätt att kompilatorn måste lägga till utfyllnad.

  • Stackpekareverifiering, som identifierar skadade stackpekare. Stackpekarfel kan orsakas av ett matchningsfel för anropskonventionen. Om du till exempel använder en funktionspekare anropar du en funktion i en DLL som exporteras som __stdcall men du deklarerar pekaren till funktionen som __cdecl.

/RTCu
Rapporterar när en variabel används utan att ha initierats. Till exempel kan en instruktion som genererar varning C4701 också generera ett körningsfel under /RTCu. Instruktioner som genererar kompilatorvarning (nivå 1 och nivå 4) C4700 genererar ett körningsfel under /RTCu.

Tänk dock på följande kodfragment:

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

Om en variabel kunde ha initierats rapporteras den inte vid körning av /RTCu. När en variabel till exempel har aliaserats via en pekare spårar kompilatorn inte variabeln och rapportens onitialiserade användningsområden. I själva verket kan du initiera en variabel genom att ta dess adress. Operatorn & fungerar som en tilldelningsoperator i den här situationen.

Anmärkningar

Körningsfelkontroller är ett sätt för dig att hitta problem i koden som körs. Mer information finns i Så här använder du interna körningskontroller.

Du kan ange fler än ett /RTC alternativ på kommandoraden. Alternativargumenten kan kombineras. är till exempel /RTCcu samma som /RTCc /RTCu.

Om du kompilerar programmet på kommandoraden med något av kompilatoralternativen /RTC misslyckas eventuella pragmainstruktioner optimize i koden tyst. Det beror på att körningsfelkontroller inte är giltiga i en versionsversion (optimerad).

Använd /RTC för utvecklingsversioner; Använd inte /RTC för en versionsversion. /RTC kan inte användas med kompilatoroptimeringar (/O alternativ (optimera kod)). En programbild som skapats med /RTC är något större och något långsammare än en avbildning som skapats med /Od (upp till 5 procent långsammare än en /Od version).

Förprocessordirektivet __MSVC_RUNTIME_CHECKS definieras när du använder valfritt /RTC alternativ eller /GZ.

Ange det här kompilatoralternativet i Visual Studio-utvecklingsmiljön

  1. Öppna dialogrutan Egenskapssidor för projektet. Mer information finns i Ange C++-kompilator- och byggegenskaper i Visual Studio.

  2. Välj egenskapssidan Konfigurationsegenskaper>C/C++>Kodgenerering.

  3. Ändra en eller båda av följande egenskaper: Grundläggande körningskontroller eller Mindre typkontroll.

Så här ställer du in det här kompilatoralternativet programmatiskt

Se även

MSVC-kompilatoralternativ
kommandoradssyntax för MSVC-kompilatorn
Så här gör du: Använda interna körningskontroller