Partager via


Erreur Runtime C R6035

Bibliothèque runtime Microsoft Visual C++, Erreur R6035 : un module de cette application initialise le cookie de sécurité global du module alors qu’une fonction s’appuie sur ce cookie de sécurité est actif. Appelez __security_init_cookie précédemment.

__security_init_cookie doit être appelée avant la première utilisation du cookie de sécurité global.

Le cookie de sécurité global est utilisé pour la protection de dépassement de mémoire tampon dans le code compilé avec /GS (Contrôle de sécurité de la mémoire tampon) et dans le code qui utilise la gestion structurée des exceptions. Essentiellement, lors de l’entrée à une fonction protégée par dépassement, le cookie est placé sur la pile et à la sortie, la valeur de la pile est comparée au cookie global. Toute différence entre eux indique qu’un dépassement de mémoire tampon s’est produit et entraîne l’arrêt immédiat du programme.

L’erreur R6035 indique qu’un appel a __security_init_cookie été effectué après l’entrée d’une fonction protégée. Si l’exécution devait se poursuivre, un dépassement de mémoire tampon impulsable serait détecté, car le cookie sur la pile ne correspondrait plus au cookie global.

Prenons l’exemple de DLL suivant. Le point d’entrée DLL est défini sur DllEntryPoint via l’option linker /ENTRY (symbole de point d’entrée). Cela contourne l’initialisation du CRT qui initialiserait généralement le cookie de sécurité global, de sorte que la DLL elle-même 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 une erreur R6035, car DllEntryPoint utilise la gestion structurée des exceptions et utilise donc le cookie de sécurité pour détecter les dépassements de mémoire tampon. Au moment où DllInitialize est appelé, le cookie de sécurité global a déjà été mis sur la pile.

La bonne façon est illustrée dans cet exemple :

// 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 n’a pas de mémoire tampon de chaîne locale et n’utilise pas de gestion des exceptions structurées) ; par conséquent, il peut appeler __security_init_cookieen toute sécurité . Il appelle ensuite une fonction d’assistance protégée.

Remarque

Le message d’erreur R6035 est généré uniquement par le CRT de débogage x86, et uniquement pour la gestion des exceptions structurées, mais la condition est une erreur sur toutes les plateformes et pour toutes les formes de gestion des exceptions, telles que C++ EH.

Voir aussi

Fonctionnalités de sécurité dans MSVC