Condividi tramite


Errore R6035 di runtime del linguaggio C

Aggiornamento: novembre 2007

Messaggio di errore

Libreria di runtime di Microsoft Visual C++. Errore R6035 - È in corso l'inizializzazione del cookie di sicurezza globale di un modulo dell'applicazione mentre è attiva una funzione basata su tale cookie. Chiamare prima __security_init_cookie.
Microsoft Visual C++ Runtime Library, Error R6035 - A module in this application is initializing the module's global security cookie while a function relying on that security cookie is active. Call __security_init_cookie earlier.

__security_init_cookie deve essere chiamato prima del primo utilizzo del cookie di protezione globale.

Il cookie di sicurezza globale viene utilizzato per la protezione dai sovraccarichi del buffer nel codice compilato con /GS (Controllo protezione buffer) e nel codice che utilizza la gestione delle eccezioni strutturata. In pratica, all'ingresso in una funzione protetta da sovraccarichi il cookie viene inserito nello stack e, all'uscita, il valore presente nello stack viene confrontato con il cookie globale. L'eventuale differenza tra di essi indica che si è verificato un sovraccarico del buffer e determina l'interruzione immediata del programma.

L'errore R6035 indica che è stata effettuata una chiamata a __security_init_cookie dopo l'ingresso di una funzione protetta. Se l'esecuzione continuasse, verrebbe rilevato un sovraccarico del buffer non corretto poiché il cookie nello stack non corrisponderebbe più a quello globale.

Si consideri l'esempio relativo alla DLL riportato di seguito. Il punto di ingresso DLL è impostato su DllEntryPoint attraverso l'opzione /ENTRY (Simbolo del punto di ingresso) del linker. Poiché in questo modo viene ignorata l'inizializzazione di CRT che normalmente inizializza il cookie di sicurezza globale, la DLL stessa dovrà chiamare __security_init_cookie.

// Wrong way to call __security_init_cookie
DllEntryPoint(...) {
   DllInitialize();
   ...
   __try {
      ...
   } __except()... {
      ...
   }
}

void DllInitialize() {
   __security_init_cookie();
}

In questo esempio verrà generato l'errore R6035, in quanto DllEntryPoint utilizza la gestione delle eccezioni strutturata e si serve pertanto del cookie di sicurezza per rilevare i sovraccarichi del buffer. Mentre viene effettuata la chiamata a DllInitialize, il cookie di sicurezza globale è stato già inserito nello stack.

In questo esempio viene illustrato il sistema corretto:

// Correct way to call __security_init_cookie
DllEntryPoint(...) {
   __security_init_cookie();
   DllEntryHelper();
}

void DllEntryHelper() {
   ...
   __try {
      ...
   } __except()... {
      ...
   }
}

In questo caso, DllEntryPoint non dispone di protezione dai sovraccarichi del buffer (non presenta buffer di stringa locale e non utilizza la gestione delle eccezioni strutturata). Di conseguenza, può chiamare senza rischi __security_init_cookie. Chiama quindi una funzione di supporto protetta.

Nota:

Il messaggio di errore R6035 viene generato esclusivamente dal CRT di debug dei processori x86 e solo per la gestione delle eccezioni strutturata, ma la condizione è quella di un errore su tutte le piattaforme e per tutte le forme di gestione delle eccezioni, ad esempio EH di C++.

Vedere anche

Riferimenti

Compiler Security Checks In Depth