Sdílet prostřednictvím


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++.

Viz také

Další zdroje

Kontroly zabezpečení kompilátoru podrobně