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.