Sdílet prostřednictvím


Chyba modulu C runtime R6035

Knihovna prostředí Runtime Microsoft Visual C++, 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í. Call __security_init_cookie earlier.

__security_init_cookie musí být volána před prvním použitím souboru cookie globálního zabezpečení.

Globální soubor cookie zabezpečení se používá pro ochranu proti přetečení vyrovnávací paměti v kódu zkompilovaném pomocí /GS (kontrola zabezpečení vyrovnávací paměti) a v kódu, který používá strukturované zpracování výjimek. 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 značí, že došlo k přetečení vyrovnávací paměti a má za následek okamžité ukončení programu.

Chyba R6035 značí, že volání __security_init_cookie bylo provedeno po vstupu do chráněné funkce. Pokud spuštění pokračuje, mělo by být detekováno falešné přetečení vyrovnávací paměti, protože soubor cookie v zásobníku už neodpovídá globálnímu souboru cookie.

Podívejte se na následující příklad knihovny DLL. Vstupní bod knihovny DLL je nastaven na DllEntryPoint prostřednictvím linker /ENTRY (symbol vstupního bodu). Tím se obchází inicializace CRT, která by obvykle inicializovala soubor cookie globálního zabezpečení, takže samotná knihovna DLL 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í vyrovnávací paměti. Než se zavolá DllInitialize, soubor cookie globálního zabezpečení je již 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í vyrovnávací paměti (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. Tato podmínka je však chybou na všech platformách a pro všechny formy zpracování výjimek, například zpracování výjimek jazyka C++ EH.

Viz také

Funkce zabezpečení v MSVC