Megosztás a következőn keresztül:


/RTC (Futásidejű hibaellenőrzések)

A futásidejű hibaellenőrzési funkció engedélyezésére és letiltására szolgál, a runtime_checks pragmával együtt.

Szemantika

/RTC1
/RTCc
/RTCs
/RTCu

Arguments

/RTC1
Egyenértékű /RTCsu.

/RTCc
Azt jelenti, hogy egy érték kisebb adattípushoz van rendelve, és adatvesztést eredményez. Például azt jelenti, hogy egy short típusérték 0x0101 hozzárendelve van-e egy típusváltozóhoz char.

Ez a beállítás jelentheti azokat a helyzeteket, amelyekben csonkítani szeretne. Ha például a visszaadott első 8 bitet int szeretné visszaadni char. Mivel /RTCc futásidejű hibát okoz, ha egy hozzárendelés adatvesztést okoz, először maszkolja le az adatokat, hogy elkerülje a futásidejű hibát. Például:

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

Mivel /RTCc elutasítja a szabványnak megfelelő kódot, a C++ standard kódtár nem támogatja. A használt /RTCc kód és a C++ standard kódtár C1189 vagy C2338 fordítóhibát okozhat. Távolítsa el a /RTCc C++ Standard kódtár használatára vonatkozó lehetőséget.

/RTCs
Engedélyezi a veremkeret futásidejű hibaellenőrzését az alábbiak szerint:

  • Helyi változók inicializálása nemzero értékre. Ez a beállítás segít azonosítani azokat a hibákat, amelyek hibakeresési módban nem jelennek meg. Nagyobb az esélye annak, hogy a veremváltozók nulla értékkel rendelkeznek a hibakeresési buildekben a kiadási buildekhez képest. Ez a kiadási buildben lévő veremváltozók fordítóoptimalizálásának köszönhető. Miután egy program felhasználta a verem egy területét, a fordító soha nem állítja vissza 0-ra. Ez azt jelenti, hogy minden olyan nem inicializált veremváltozó, amely később ugyanazt a veremterületet használja, visszaadhatja a veremmemória korábbi használatából megmaradt értékeket.

  • Helyi változók, például tömbök túllépésének és aláfutásának észlelése. /RTCs nem észleli a túlfuttatásokat, amikor olyan memóriához fér hozzá, amely a fordító szerkezeten belüli kitöltéséből ered. A kitöltés történhet a következő használatával align: , /Zp (Tagigazítás) vagy pack, vagy ha úgy rendezi a szerkezeti elemeket, hogy a fordítónak paddingot kell hozzáadnia.

  • Veremmutató ellenőrzése, amely észleli a veremmutató sérülését. A veremmutató sérülését a hívási konvenció eltérése okozhatja. Ha például függvénymutatót használ, meghív egy függvényt egy DLL-ben, amely exportálva __stdcall van, de deklarálja a mutatót a függvényhez __cdecl.

/RTCu
Jelenti, ha a változót inicializálás nélkül használják. Egy C4701 figyelmeztetést generáló utasítás például futásidejű hibát is okozhat a következő alatt /RTCu: . A C4700(1. és 4. szint) fordítói figyelmeztetést generáló utasítások futásidejű hibát okoznak a következő alatt /RTCu: .

Vegye azonban figyelembe a következő kódrészletet:

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

Ha egy változó inicializálható lett volna, akkor a rendszer nem jelenti futásidőben /RTCu. Ha például egy változó át van aliasolva egy mutatón, a fordító nem követi nyomon a változót, és nem iicializált felhasználásokat jelent. Lényegében inicializálhat egy változót a cím megadásával. Ebben a helyzetben az & operátor hozzárendelési operátorként működik.

Megjegyzések

A futásidejű hibaellenőrzésekkel problémákat találhat a futó kódban; további információ : Útmutató: Natív futásidejű ellenőrzések használata.

A parancssorban /RTC több lehetőséget is megadhat. A beállítás argumentumai kombinálhatók; például ugyanaz, /RTCcu mint /RTCc /RTCua .

Ha a programot a parancssorban fordítja le a /RTC fordító bármely beállításával, a kódban található pragma optimize utasítások csendesen meghiúsulnak. Ennek az az oka, hogy a futásidejű hibaellenőrzések nem érvényesek egy kiadási (optimalizált) buildben.

Fejlesztési buildekhez használható /RTC ; Ne használja /RTC kiadási buildekhez. /RTC nem használható fordítóoptimalizálással (/O Beállítások (Kód optimalizálása)). A beépített programképek /RTC valamivel nagyobbak és kissé lassabbak, mint a beépített rendszerképek /Od (akár 5%-kal lassabbak, mint egy /Od build).

Az __MSVC_RUNTIME_CHECKS előfeldolgozó direktíva akkor lesz definiálva, ha bármilyen /RTC lehetőséget vagy /GZlehetőséget használ.

A fordító beállításának beállítása a Visual Studio fejlesztői környezetében

  1. Nyissa meg a projekt Tulajdonságlapok párbeszédpaneljét. További információ: C++ fordító és buildtulajdonságok beállítása a Visual Studióban.

  2. Válassza a Konfiguráció tulajdonságai>C/C++>Kódgenerálás tulajdonságlapját.

  3. Módosítsa az alábbi tulajdonságok egyikét vagy mindkettőt: Alapszintű futtatókörnyezet-ellenőrzések vagy kisebb típusellenőrzés.

A fordítóprogram programozott beállítása

Lásd még

MSVC-fordító beállításai
MSVC-fordító parancssori szintaxisa
Útmutató: Natív futásidejű ellenőrzések használata