共用方式為


C 執行階段錯誤 R6035

Microsoft Visual C++ 執行時間程式庫,錯誤 R6035 - 此應用程式中的模組正在初始化模組的全域安全性 Cookie,而依賴該安全性 Cookie 的函式為作用中。 稍早呼叫__security_init_cookie。

必須先呼叫 __security_init_cookie,才能第一次使用全域安全性 Cookie。

全域安全性 Cookie 用於使用 /GS 編譯的程式碼和使用結構化例外狀況處理的程式碼中的緩衝區 滿溢保護。 基本上,在進入受超支保護的函式時,Cookie 會放在堆疊上,而結束時,堆疊上的值會與全域 Cookie 進行比較。 它們之間的任何差異都表示已發生緩衝區滿溢,並導致程式立即終止。

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

請考慮下列 DLL 範例。 DLL 進入點會透過連結器 /ENTRY (進入點符號) 選項設定為 DllEntryPoint。 這會略過通常初始化全域安全性 Cookie 的 CRT 初始化,因此 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 。 然後,它會呼叫受保護的協助程式函式。

注意

錯誤訊息 R6035 只會由 x86 偵錯 CRT 產生,而且僅適用于結構化例外狀況處理,但條件在所有平臺上都是錯誤,以及所有形式的例外狀況處理,例如 C++ EH。

另請參閱

MSVC 中的安全性功能