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。