/RTC
(Sprawdzanie błędów w czasie wykonywania)
Służy do włączania i wyłączania funkcji sprawdzania błędów w czasie wykonywania w połączeniu z runtime_checks pragma.
Składnia
/RTC1
/RTCc
/RTCs
/RTCu
Argumenty
/RTC1
Odpowiednik elementu /RTCsu
.
/RTCc
Raportuje, gdy wartość jest przypisywana do mniejszego typu danych i powoduje utratę danych. Na przykład raportuje, czy short
wartość 0x0101
typu jest przypisana do zmiennej typu char
.
Ta opcja może zgłaszać sytuacje, w których zamierzasz obcinać. Jeśli na przykład chcesz, aby pierwsze 8 bitów int
zwracane jako char
. Ponieważ /RTCc
powoduje błąd czasu wykonywania, jeśli przypisanie powoduje utratę informacji, najpierw maskuj informacje potrzebne do uniknięcia błędu czasu wykonywania. Na przykład:
#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);
}
Ponieważ /RTCc
odrzuca kod zgodny ze standardem, nie jest obsługiwany przez bibliotekę standardową języka C++. Kod korzystający z /RTCc
biblioteki standardowej języka C++ może powodować błąd kompilatora C1189. Możesz zdefiniować _ALLOW_RTCc_IN_STL
, aby wyciszyć ostrzeżenie i użyć /RTCc
opcji .
/RTCs
Włącza sprawdzanie błędów w czasie wykonywania ramek stosu w następujący sposób:
Inicjowanie zmiennych lokalnych na wartość niezerową. Ta opcja pomaga zidentyfikować usterki, które nie są wyświetlane podczas uruchamiania w trybie debugowania. Istnieje większe prawdopodobieństwo, że zmienne stosu nadal mają wartość zerową w kompilacji debugowania w porównaniu z kompilacją wydania. Wynika to z optymalizacji kompilatora zmiennych stosu w kompilacji wydania. Gdy program użył obszaru swojego stosu, nigdy nie zostanie zresetowany do wartości 0 przez kompilator. Oznacza to, że wszystkie niezainicjowane zmienne stosu, które mogą później używać tego samego obszaru stosu, mogą zwracać wartości pozostawione z wcześniejszego użycia tej pamięci stosu.
Wykrywanie przekroczenia i podbiegów zmiennych lokalnych, takich jak tablice.
/RTCs
Program nie wykrywa przepełnienia podczas uzyskiwania dostępu do pamięci, która wynika z wypełnienia kompilatora w strukturze. Wypełnienie może wystąpić przy użyciu funkcjialign
,/Zp
(wyrównanie składowej struktury) lubpack
, lub, jeśli porządkujesz elementy struktury w taki sposób, aby wymagać kompilatora dodania wypełnienia.Weryfikacja wskaźnika stosu, która wykrywa uszkodzenie wskaźnika stosu. Uszkodzenie wskaźnika stosu może być spowodowane niezgodnością konwencji wywoływania. Na przykład przy użyciu wskaźnika funkcji wywołasz funkcję w bibliotece DLL, która jest eksportowana jako
__stdcall
, ale deklarujesz wskaźnik do funkcji jako__cdecl
.
/RTCu
Raporty, gdy zmienna jest używana bez zainicjowania. Na przykład instrukcja, która generuje ostrzeżenie C4701, może również wygenerować błąd czasu wykonywania w obszarze /RTCu
. Każda instrukcja, która generuje ostrzeżenie kompilatora (poziom 1 i poziom 4) C4700 , spowoduje wygenerowanie błędu czasu wykonywania w obszarze /RTCu
.
Należy jednak wziąć pod uwagę następujący fragment kodu:
int a, *b, c;
if ( 1 )
b = &a;
c = a; // No run-time error with /RTCu
Jeśli zmienna mogła zostać zainicjowana, nie jest zgłaszana w czasie wykonywania przez ./RTCu
Na przykład po utworzeniu aliasu zmiennej za pomocą wskaźnika kompilator nie śledzi zmiennej i nie zgłasza niezainicjowanych zastosowań. W efekcie można zainicjować zmienną, przyjmując jej adres. Operator &
działa jak operator przypisania w tej sytuacji.
Uwagi
Sprawdzanie błędów w czasie wykonywania to sposób znajdowania problemów w uruchomionym kodzie; Aby uzyskać więcej informacji, zobacz How to: Use native run-time checks (Instrukcje: używanie natywnych testów w czasie wykonywania).
W wierszu polecenia można określić więcej niż jedną /RTC
opcję. Argumenty opcji można połączyć; na przykład /RTCcu
jest taka sama jak /RTCc /RTCu
.
Jeśli skompilujesz program w wierszu polecenia przy użyciu dowolnej /RTC
z opcji kompilatora, wszystkie instrukcje pragma optimize
w kodzie w trybie dyskretnym kończą się niepowodzeniem. Wynika to z faktu, że testy błędów czasu wykonywania nie są prawidłowe w kompilacji wydania (zoptymalizowane).
Służy /RTC
do tworzenia kompilacji; Nie używaj ich /RTC
do kompilacji wydania. /RTC
Nie można używać z optymalizacjami kompilatora (/O
Opcje (Optymalizowanie kodu)). Obraz programu utworzony za pomocą /RTC
programu jest nieco większy i nieco wolniejszy niż obraz skompilowany /Od
za pomocą (do 5 procent wolniej niż kompilacja /Od
).
Dyrektywa __MSVC_RUNTIME_CHECKS
preprocesora zostanie zdefiniowana podczas korzystania z dowolnej /RTC
opcji lub /GZ
.
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).
Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Code Generation.
Zmodyfikuj jedną lub obie z następujących właściwości: Sprawdzanie podstawowego środowiska uruchomieniowego lub sprawdzanie mniejszego typu.
Aby programowo ustawić tę opcję kompilatora
- Zobacz BasicRuntimeChecks i SmallerTypeCheck właściwości.
Zobacz też
Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC
Instrukcje: korzystanie z macierzystego sprawdzania w trakcie wykonywania