共用方式為


C 執行階段錯誤 R6035

Microsoft Visual C++ 執行階段程式庫,錯誤 R6035:當這個應用程式的模組正在初始化此模組的全域安全性 Cookie 的同時,依賴此安全性 Cookie 的函式正在使用中。要早一點呼叫 __security_init_cookie。

在初次使用此全域安全性 Cookie 之前,必須要先呼叫 __security_init_cookie

此全域安全性 Cookie 是用來當做以 /GS (緩衝區安全性檢查) 編譯的程式碼及使用結構化例外處理之程式碼中的緩衝區滿溢保護。 基本上來說,在進入有滿溢保護的函式中時,會將此 Cookie 放在堆疊上,而在結束時,會將堆疊上的值與全域 Cookie 做比較。 比較所得的任何差異表示已發生緩衝區滿溢,而這會讓程式立即終止。

錯誤 R6035 表示在進入受保護的函式之後,已對 __security_init_cookie 發出了呼叫。 如果繼續執行,將會偵測到假造的緩衝區滿溢,因為堆疊上的 Cookie 不再符合此全域 Cookie。

請參考下列 DLL 範例。 透過連結器 /ENTRY (進入點符號) 選項,將 DLL 進入點設定為 DllEntryPoint。 如此會略過 CRT 的初始化作業 (此作業通常會初始化全域安全性 Cookie),因此必須由 DLL 本身來呼叫 __security_init_cookie

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

void DllInitialize() {
   __security_init_cookie();
}

此範例將會產生錯誤 R6035,因為 DllEntryPoint 會使用結構化例外處理,因此會使用安全性 Cookie 來偵測緩衝區滿溢。 當呼叫 DllInitialize 時,此全域安全性 Cookie 便已經放在堆疊上。

以下範例將示範進行這項處理的正確方式:

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

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

在此例中,DllEntryPoint 不會受到防止緩衝區滿溢的保護 (它沒有任何本機字串緩衝區,也不會使用結構化例外處理);因此,它可以安心地呼叫 __security_init_cookie。 然後,它會呼叫受到保護的 Helper 函式。

注意事項注意事項

錯誤訊息 R6035 只會由 x86 偵錯 CRT 產生,而且只針對結構化例外處理 (但是其情況是在所有平台上發生錯誤),以及針對所有形式的例外處理,例如 C++ EH。

請參閱

參考

Compiler Security Checks In Depth