Gs(控制堆疊檢查呼叫)

2021-07-05 04:02:34 字數 1057 閱讀 6006

控制堆疊探測。

/gs[size]
size

(可選)在啟動堆疊探測之前區域性變數可以占用的位元組數。 

如果在不指定 size 引數的情況下指定/gs選項,則這與指定/gs0的效果相同。

堆疊探測是編譯器插入到每個函式呼叫中的**序列。 

堆疊探測啟動時,它在記憶體中良性延伸儲存函式的區域性變數所需的空間量。

如果函式的區域性變數需要的堆疊空間多於 size 位元組,則啟動它的堆疊探測。 

預設情況下,當函式需要的堆疊空間多於一頁時,編譯器將生成啟動堆疊探測的**。

這等效於 x86 的/gs4096、x64 和 arm 平台的編譯器選項。

此值使應用程式和 windows 記憶體管理器可以動態增加執行時提交給程式堆疊的記憶體量。

說明

/gs4096的預設值使 windows 應用程式的程式堆疊可以在執行時適當增長。 

我們建議,除非有確切的理由,否則請不要更改預設值。

某些程式(如虛擬裝置驅動程式)並不需要這種預設堆疊增長機制。 

在這些情況下,不需要堆疊探測,通過將 size 設定為大於任何函式(將需要區域性變數儲存)的值,可阻止編譯器生成堆疊探測。

/gs和 size 之間不允許有空格。

/gs0為需要區域性變數儲存的每個函式呼叫啟用堆疊探測。 

這可對效能產生負面影響。

可以通過使用 check_stack 開啟或關閉堆疊探測。 

/gs和 check_stack 雜注對標準 c 庫例程沒有影響;它們只影響你編譯的函式。

開啟專案的「屬性頁」對話方塊。 

有關詳細資訊,請參見如何:開啟專案屬性頁。

選擇 c/c++ 資料夾。

選擇「命令列」屬性頁。

在「附加選項」框中鍵入編譯器選項。

參考編譯器選項

設定編譯器選項

堆疊溢位第三話 GS機制

棧中的守護天使 gs,亦稱作stack canary cookie,從vs2003起開始啟用 也就說,gs機制是由編譯器決定的,跟作業系統無關 是堆疊溢位中最令人頭疼的一道關卡 gs機制分三個步驟 計算隨機種子 canary寫入棧幀 gs校驗 1 程式啟動時,讀取.data的第乙個dword作為基數...

函式呼叫堆疊

一 函式呼叫堆疊 認真體會每一行指令位址!include intsum int a,int b mov ebp,esp 讓esp回退到ebp的位置,回退棧幀的過程中,沒有對棧幀中的值進行清0的操作 pop ebp 出棧並把出棧的值賦給ebp int main 下圖為上面示例函式,程式在sum函式中,...

函式呼叫堆疊

一 棧 1 傳統的棧 被定義為乙個特殊的容器,使用者可以將資料壓入棧中,也可以將壓入 棧中的資料彈出,但必須遵守一條規則 先進後出。2 計算機系統中的棧 是乙個有以上屬性的動態記憶體區域,壓棧操作使得棧增大,彈出操作使棧減小。棧通常是向下增長的。3 最重要的是棧儲存了乙個函式呼叫所需的維護資訊,這通...