Udostępnij za pośrednictwem


/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 funkcji align, /Zp (wyrównanie składowej struktury) lub pack, 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

  1. 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).

  2. Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Code Generation.

  3. 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 też

Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC
Instrukcje: korzystanie z macierzystego sprawdzania w trakcie wykonywania