C Çalışma Zamanı Hatası R6035

Microsoft Visual C++ Çalışma Zamanı Kitaplığı, Hata R6035 - Bu uygulamadaki bir modül, modülün genel güvenlik tanımlama bilgisini başlatırken bu güvenlik tanımlama bilgisini kullanan bir işlev etkindir. Daha önce __security_init_cookie arayın.

__security_init_cookie, genel güvenlik tanımlama bilgisinin ilk kullanımından önce çağrılmalıdır.

Genel güvenlik tanımlama bilgisi, /GS (Arabellek Güvenlik Denetimi) ile derlenen kodda ve yapılandırılmış özel durum işleme kullanan kodda arabellek taşması koruması için kullanılır. Temelde, taşma korumalı bir işleve girişte, tanımlama bilgisi yığına konur ve çıkışta yığındaki değer genel tanımlama bilgisi ile karşılaştırılır. Aralarındaki farklar arabellek taşması oluştuğuna ve programın hemen sonlandırılmasına neden olduğunu gösterir.

R6035 hatası, korumalı bir işlev girildikten sonra çağrısı __security_init_cookie yapıldığını gösterir. Yürütmenin devam etmesi durumunda, yığındaki tanımlama bilgisi artık genel tanımlama bilgisi ile eşleşmeyeceğinden sahte bir arabellek taşması algılanabilir.

Aşağıdaki DLL örneğini göz önünde bulundurun. DLL giriş noktası, bağlayıcı /ENTRY (Giriş Noktası Simgesi) seçeneği aracılığıyla DllEntryPoint olarak ayarlanır. Bu, genel güvenlik tanımlama bilgisini normalde başlatan CRT'nin başlatmasını atlar, bu nedenle DLL'nin kendisini çağırması __security_init_cookiegerekir.

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

void DllInitialize() {
   __security_init_cookie();
}

DllEntryPoint yapılandırılmış özel durum işlemeyi kullandığından ve bu nedenle arabellek taşmalarını algılamak için güvenlik tanımlama bilgisini kullandığından bu örnek R6035 hatası oluşturur. DllInitialize çağrıldığında, genel güvenlik tanımlama bilgisi yığına zaten konuldu.

Bu örnekte doğru yol gösterilmiştir:

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

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

Bu durumda, DllEntryPoint arabellek taşmalarına karşı korunmaz (yerel dize arabellekleri yoktur ve yapılandırılmış özel durum işleme kullanmaz); bu nedenle güvenli bir şekilde çağırabilir __security_init_cookie. Ardından korunan bir yardımcı işlevi çağırır.

Dekont

Hata iletisi R6035 yalnızca x86 hata ayıklama CRT tarafından ve yalnızca yapılandırılmış özel durum işleme için oluşturulur, ancak koşul tüm platformlarda ve C++ EH gibi tüm özel durum işleme biçimlerinde bir hatadır.

Ayrıca bkz.

MSVC'deki Güvenlik Özellikleri