Dela via


C-körningsfel R6035

En modul i det här programmet initierar modulens globala säkerhetscookie medan en funktion som förlitar sig på den säkerhetscookien är aktiv. Ring __security_init_cookie tidigare.

Anmärkningar

__security_init_cookie måste anropas före den första användningen av den globala säkerhetskakan.

Den globala säkerhetscookien används för buffertöverskridningsskydd i kod som kompilerats med /GS (buffertsäkerhetskontroll) och i kod som använder strukturerad undantagshantering. Vid inmatning i en överkörningsskyddad funktion läggs cookien på stacken, och vid avslut av funktionen jämförs värdet på stacken med den globala cookien. Eventuella skillnader mellan dem indikerar att en buffertöverskridning har inträffat och resulterar i omedelbar avslutning av programmet.

Fel R6035 anger att ett anrop till __security_init_cookie gjordes efter att en skyddad funktion hade angivits. Om körningen skulle fortsätta skulle en falsk buffertöverskridning identifieras eftersom cookien på stacken inte längre skulle matcha den globala cookien.

Example

Överväg följande DLL-exempel. DLL-startpunkten är inställd på DllEntryPoint via alternativet linker /ENTRY (Entry-Point Symbol). Detta kringgår CRT:s initiering som normalt initierar den globala säkerhetscookien, så DLL:en själv måste anropa __security_init_cookie.

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

void DllInitialize() {
   __security_init_cookie();
}

Det här exemplet genererar felet R6035 eftersom DllEntryPoint använder strukturerad undantagshantering och därför använder säkerhetscookien för att identifiera buffertöverskridanden. När DllInitialize anropas har den globala säkerhetskakan redan lagts på stacken.

Rätt sätt visas i det här exemplet:

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

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

I det här fallet är DllEntryPoint inte skyddat mot buffertöverskridanden (det har inga lokala strängbuffertar och använder inte strukturerad undantagshantering); därför kan den på ett säkert sätt anropa __security_init_cookie. Den anropar sedan en hjälpfunktion som är skyddad.

Anmärkning

FelmeddelandeT R6035 genereras endast av x86-felsöknings-CRT och endast för strukturerad undantagshantering, men villkoret är ett fel på alla plattformar och för alla former av undantagshantering, till exempel C++ EH.

Se även

Säkerhetsfunktioner i MSVC