Megosztás a következőn keresztül:


C futtatási hiba R6035

Az alkalmazás egy modulja inicializálja a modul globális biztonsági cookie-ját, miközben a biztonsági cookie-ra támaszkodó függvény aktív. Hívja __security_init_cookie korábban.

Megjegyzések

__security_init_cookie a globális biztonsági cookie első használata előtt kell meghívni.

A globális biztonsági cookie-t a puffertúlcsordulás elleni védelemre használják a /GS (Puffer biztonsági ellenőrzés) és a strukturált kivételkezelést használó kódban. A túlfutás-védelemmel ellátott függvénybe való belépéskor a cookie a veremre kerül, és kilépéskor a veremen lévő értéket összehasonlítjuk a globális cookie-val. A kettő közötti különbség azt jelzi, hogy puffertúlcsordulás történt, és a program azonnali leállítását eredményezi.

Az R6035 hiba azt jelzi, hogy __security_init_cookie hívása egy védett függvény belépése után történt. Ha a végrehajtás folytatódna, a rendszer hamis puffertúlcsordulást észlelne, mert a veremen lévő cookie már nem felelne meg a globális cookie-nak.

Example

Tekintse meg a következő DLL-példát. A DLL belépési pont a DllEntryPointra van állítva a linker /ENTRY (Entry-Point Szimbólum) beállításon keresztül. Ez áthalad a CRT inicializálásán, amely általában inicializálná a globális biztonsági cookie-t, ezért magának a DLL-nek kell meghívnia __security_init_cookie.

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

void DllInitialize() {
   __security_init_cookie();
}

Ez a példa R6035-ös hibát fog generálni, mert a DllEntryPoint strukturált kivételkezelést használ, ezért a biztonsági cookie használatával észleli a puffertúllépéseket. Mire a DllInitialize meghívásra kerül, a global security cookie már fel lett helyezve a verembe.

Ebben a példában a helyes módszert mutatjuk be:

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

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

Ebben az esetben a DllEntryPoint nem védett a puffertúllépésekkel szemben (nincs helyi sztringpuffere, és nem használ strukturált kivételkezelést); ezért biztonságosan hívhatja __security_init_cookie. Ezt követően meghív egy segédfüggvényt, amely védett.

Megjegyzés:

Az R6035-ös hibaüzenetet csak az x86 hibakeresési CRT hozza létre, és csak strukturált kivételkezelés esetén, de a feltétel minden platformon hiba, és a kivételkezelés minden formája, például a C++ EH esetében is hiba.

Lásd még

Biztonsági funkciók az MSVC-ben