Erreur d'exécution C R6035
Bibliothèque Runtime Microsoft Visual C++, erreur R6035 - Un module de cette application initialise le cookie de sécurité globale du module alors qu'une fonction utilisant ce cookie de sécurité est active. Appelez __security_init_cookie plut tôt.
__security_init_cookie doit être appelé avant la première utilisation du cookie de sécurité global.
Le cookie de sécurité global est utilisé pour éviter le dépassement de mémoire tampon dans le code compilé avec /GS (Vérification de la sécurité de la mémoire tampon) et dans le code qui utilise la gestion structurée des exceptions. En général, le cookie est mis sur la pile au point d'entrée de la fonction protégée contre le dépassement, et la valeur de la pile est comparée au cookie global à la sortie. Une différence de valeur indique qu'un dépassement de mémoire tampon s'est produit et a provoqué l'arrêt immédiat du programme.
L'erreur R6035 indique qu'un appel à __security_init_cookie a été effectué après l'entrée dans une fonction protégée. Si l'exécution devait se poursuivre, un dépassement de mémoire tampon parasite serait détecté car le cookie de la pile ne correspondrait plus au cookie global.
Prenons l'exemple de DLL suivant. Le point d'entrée de la DLL a la valeur DllEntryPoint par le biais de l'option /ENTRY (Symbole de point d'entrée) de l'éditeur de liens. Étant donné que l'initialisation du CRT qui initialise normalement le cookie de sécurité global est ignorée, la DLL proprement dite doit appeler __security_init_cookie.
// Wrong way to call __security_init_cookie
DllEntryPoint(...) {
DllInitialize();
...
__try {
...
} __except()... {
...
}
}
void DllInitialize() {
__security_init_cookie();
}
Cet exemple génère l'erreur R6035 car DllEntryPoint utilise la gestion structurée des exceptions, et donc, le cookie de sécurité pour détecter des dépassements de mémoire tampon. Lorsque DllInitialize est appelé, le cookie de sécurité global a déjà été mis sur la pile.
La méthode correcte est illustrée dans l'exemple suivant :
// Correct way to call __security_init_cookie
DllEntryPoint(...) {
__security_init_cookie();
DllEntryHelper();
}
void DllEntryHelper() {
...
__try {
...
} __except()... {
...
}
}
Dans ce cas, DllEntryPoint n'est pas protégé contre les dépassements de mémoire tampon (il ne contient aucune mémoire tampon de chaîne locale et n'utilise pas la gestion structurée des exceptions) ; par conséquent, il peut appeler __security_init_cookie en toute sécurité. Il appelle ensuite une fonction d'assistance protégée.
Notes
Le message d'erreur R6035 est généré uniquement par le CRT de débogage x86, et uniquement pour la gestion structurée des exceptions, mais la condition est une erreur sur toutes les plateformes et pour toutes les formes de gestion des exceptions, par exemple C++ EH.