Udostępnij za pośrednictwem


Błąd czasu wykonania języka C R6035

Biblioteka środowiska uruchomieniowego programu Microsoft Visual C++, Błąd R6035 — moduł w tej aplikacji inicjuje globalny plik cookie zabezpieczeń modułu, podczas gdy funkcja uzależniona od tego pliku cookie zabezpieczeń jest aktywna. Wywołaj __security_init_cookie wcześniej.

__security_init_cookie należy wywołać przed pierwszym użyciem globalnego pliku cookie zabezpieczeń.

Globalny plik cookie zabezpieczeń jest używany do ochrony przed przekroczeniem buforu w kodzie skompilowanym za pomocą /GS (sprawdzanie zabezpieczeń buforu) i w kodzie korzystającym z obsługi wyjątków strukturalnych. Zasadniczo podczas wprowadzania do funkcji chronionej przed przekroczeniem plik cookie jest umieszczany na stosie, a po wyjściu wartość na stosie jest porównywana z globalnym plikiem cookie. Każda różnica między nimi wskazuje, że wystąpiło przekroczenie buforu i powoduje natychmiastowe zakończenie programu.

Błąd R6035 wskazuje, że wywołanie funkcji __security_init_cookie zostało wykonane po wprowadzeniu funkcji chronionej. Gdyby wykonanie miało być kontynuowane, wykryto fałszywe przepełnienie buforu, ponieważ plik cookie na stosie nie będzie już zgodny z globalnym plikiem cookie.

Rozważmy następujący przykład biblioteki DLL. Punkt wejścia biblioteki DLL jest ustawiony na DllEntryPoint za pośrednictwem konsolidatora /ENTRY (symbol punktu wejścia). Spowoduje to obejście inicjalizacji CRT, która zwykle inicjuje globalny plik cookie zabezpieczeń, więc sama biblioteka DLL musi wywołać metodę __security_init_cookie.

// Wrong way to call __security_init_cookie
DllEntryPoint(...) {
   DllInitialize();
   ...
   __try {
      ...
   } __except()... {
      ...
   }
}

void DllInitialize() {
   __security_init_cookie();
}

W tym przykładzie zostanie wygenerowany błąd R6035, ponieważ biblioteka DllEntryPoint używa obsługi wyjątków strukturalnych i w związku z tym używa pliku cookie zabezpieczeń do wykrywania przekroczania buforu. Po wywołaniu biblioteki DllInitialize globalny plik cookie zabezpieczeń został już umieszczony na stosie.

Prawidłowy sposób pokazano w tym przykładzie:

// Correct way to call __security_init_cookie
DllEntryPoint(...) {
   __security_init_cookie();
   DllEntryHelper();
}

void DllEntryHelper() {
   ...
   __try {
      ...
   } __except()... {
      ...
   }
}

W takim przypadku program DllEntryPoint nie jest chroniony przed przepełnień buforu (nie ma lokalnych ciągów i nie używa obsługi wyjątków strukturalnych); w związku z tym może bezpiecznie wywołać metodę __security_init_cookie. Następnie wywołuje funkcję pomocnika, która jest chroniona.

Uwaga

Komunikat o błędzie R6035 jest generowany tylko przez debugowanie CRT x86 i tylko w przypadku obsługi wyjątków strukturalnych, ale warunek jest błędem na wszystkich platformach i dla wszystkich form obsługi wyjątków, takich jak C++ EH.

Zobacz też

Funkcje zabezpieczeń w MSVC