Chyba za běhu R6035 jazyka C
Microsoft Visual C++ Runtime Library, Chyba R6035 - Modul této aplikace inicializuje soubor cookie globálního zabezpečení, když se funkce spoléhá na to, že je soubor cookie zabezpečení aktivní. Zavolejte __security_init_cookie dříve.
__security_init_cookie musí být voláno před prvním použitím souboru cookie globálního zabezpečení.
Soubor cookie globálního zabezpečení se používá pro ochranu přetečení vyrovnávací paměti v kódu zkompilovaném pomocí možnosti /GS (kontrola zabezpečení vyrovnávací paměti) a v kódu, který používá strukturované zpracování výjimek.V podstatě, při vstupu do funkce chráněné před přetečením je soubor cookie vložen do zásobníku a při ukončení funkce je hodnota v zásobníku porovnána s globálním souborem cookie.Případný rozdíl mezi nimi označuje, že došlo k přetečení vyrovnávací paměti a má za následek okamžité ukončení programu.
Chyba R6035 indikuje, že volání __security_init_cookie bylo provedeno po vstupu do chráněné funkce.Pokud spuštění pokračuje, falešné přetečení vyrovnávací paměti by mělo být detekováno, protože soubor cookie v zásobníku už neodpovídá globálnímu souboru cookie.
Zvažte následující příklad knihovny DLL.Vstupní bod knihovny DLL je nastaven na DllEntryPoint pomocí možnosti /ENTRY (symbol vstupního bodu) propojovacího programu.To obchází inicializaci CRT, které by obvykle inicializovalo soubor cookie globálního zabezpečení, takže knihovna DLL samotná musí volat __security_init_cookie.
// Wrong way to call __security_init_cookie
DllEntryPoint(...) {
DllInitialize();
...
__try {
...
} __except()... {
...
}
}
void DllInitialize() {
__security_init_cookie();
}
Tento příklad vygeneruje chybu R6035, protože vstupní bod DllEntryPoint používá strukturované zpracování výjimek a proto použije soubor cookie zabezpečení ke zjištění přetečení zásobníku.Podle času se zavolá DllInitialize, soubor cookie globálního zabezpečení již byl vložen do zásobníku.
V tomto příkladu je znázorněn správný způsob:
// Correct way to call __security_init_cookie
DllEntryPoint(...) {
__security_init_cookie();
DllEntryHelper();
}
void DllEntryHelper() {
...
__try {
...
} __except()... {
...
}
}
V tomto případě vstupní bod DllEntryPoint není chráněn proti přetečení zásobníku (nemá žádné místní vyrovnávací paměti řetězců a nepoužívá strukturované zpracování výjimek), proto může bezpečně volat __security_init_cookie.Poté zavolá pomocnou funkci, která je chráněna.
[!POZNÁMKA]
Chybová zpráva R6035 se vygeneruje pouze při ladění CRT platformy x86 a pouze pro strukturované zpracování výjimek, ale tato podmínka je chybou na všech platformách a pro všechny formy zpracování výjimek, například zpracování výjimek jazyka C++.