Errore di runtime di C R6035
Libreria di runtime di Microsoft Visual C++, Errore R6035: un modulo in questa applicazione sta inizializzando il cookie di sicurezza globale del modulo mentre una funzione che si basa su tale cookie di sicurezza è attiva. Chiamare __security_init_cookie in precedenza.
__security_init_cookie deve essere chiamato prima del primo utilizzo del cookie di sicurezza globale.
Il cookie di sicurezza globale viene usato per la protezione dell'overrun del buffer nel codice compilato con /GS (Buffer Security Check) e nel codice che usa la gestione strutturata delle eccezioni. Essenzialmente, all'ingresso di una funzione protetta da overrun, il cookie viene inserito nello stack e all'uscita, il valore nello stack viene confrontato con il cookie globale. Qualsiasi differenza tra di esse indica che si è verificato un sovraccarico del buffer e comporta la chiusura immediata del programma.
L'errore R6035 indica che è stata effettuata una chiamata a __security_init_cookie
dopo l'immissione di una funzione protetta. Se l'esecuzione dovesse continuare, verrebbe rilevato un sovraccarico spurio del buffer perché il cookie nello stack non corrisponderebbe più al cookie globale.
Si consideri l'esempio di DLL seguente. Il punto di ingresso della DLL è impostato su DllEntryPoint tramite l'opzione linker /ENTRY (Simbolo punto di ingresso). In questo modo viene ignorata l'inizializzazione di CRT che in genere inizializza il cookie di sicurezza globale, quindi la DLL stessa deve chiamare __security_init_cookie
.
// Wrong way to call __security_init_cookie
DllEntryPoint(...) {
DllInitialize();
...
__try {
...
} __except()... {
...
}
}
void DllInitialize() {
__security_init_cookie();
}
Questo esempio genererà l'errore R6035 perché DllEntryPoint usa la gestione strutturata delle eccezioni e quindi usa il cookie di sicurezza per rilevare i sovraccarichi del buffer. Al momento della chiamata di DllInitialize, il cookie di sicurezza globale è già stato inserito nello stack.
Il modo corretto è illustrato in questo esempio:
// Correct way to call __security_init_cookie
DllEntryPoint(...) {
__security_init_cookie();
DllEntryHelper();
}
void DllEntryHelper() {
...
__try {
...
} __except()... {
...
}
}
In questo caso, DllEntryPoint non è protetto da sovraccarichi del buffer (non dispone di buffer di stringhe locali e non usa la gestione strutturata delle eccezioni); pertanto può chiamare __security_init_cookie
in modo sicuro . Chiama quindi una funzione helper protetta.
Nota
Il messaggio di errore R6035 viene generato solo da CRT di debug x86 e solo per la gestione delle eccezioni strutturate, ma la condizione è un errore in tutte le piattaforme e per tutte le forme di gestione delle eccezioni, ad esempio C++EH.