為什麼main函式的區域性變數的位址每次執行不一樣?

2021-09-30 10:51:18 字數 969 閱讀 7230

現象:

下面**,每次執行時,發現i的位址都不一樣,j的位址每次相同。

#include

int j;

int main(void)

i是函式呼叫棧的第乙個變數,如果棧基址每次執行一樣的話,j的位址應該也是一樣的,難道棧基址每次不一樣?經過驗證後發現確實如此

作業系統給程序棧分配的起始位址為stack_top,這個值一般也為task_size,即為使用者空間的最大位址(在32位系統中,該值為3g),但是如果系統設定pf_randomize標誌,則作業系統會在程序啟動後,隨機設定棧的起始位置,即為:stack_top - randomized_variable,所以每次看到main函式區域性變數位址是不一樣的

目的:防止棧緩衝區溢位這樣的安全漏洞被攻擊使用,通過隨機設定棧的起始位址,使得攻擊變的更加困難

**:在核心2.6.32中,對應的方法:

static unsignedlong randomize_stack_top(unsigned long stack_top)

unsignedint random_variable = 0;

if((current->flags & pf_randomize) &&

!(current->personality & addr_no_randomize)) {

random_variable = get_random_int() & stack_rnd_mask;

random_variable <<= page_shift;

#ifdef config_stack_growsup

returnpage_align(stack_top) + random_variable;

#else

returnpage_align(stack_top) - random_variable;

#endif

為什麼區域性變數是執行緒安全的

例如,有三個方法 a b c,他們的呼叫關係是 a b c a 呼叫 b,b 呼叫 c 在執行時,會構建出下面這樣的呼叫棧。每個方法在呼叫棧裡都有自己的獨立空間,稱為棧幀,每個棧幀裡都有對應方法需要的引數和返回位址。當呼叫方法時,會建立新的棧幀,並壓入呼叫棧 當方法返回時,對應的棧幀就會被自動彈出。...

函式區域性變數的返回

昨天看到一道程式設計糾錯題,在網上看到乙個講解非常詳細的文章,這裡拿來和大家分享一下 一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 ...

函式返回區域性變數

一般的來說,函式是可以返回區域性變數的。區域性變數的作用域只在函式內部,在函式返回後,區域性變數的記憶體已經釋放了。因此,如果函式返回的是區域性變數的值,不涉及位址,程式不會出錯。但是如果返回的是區域性變數的位址 指標 的話,程式執行後會出錯。因為函式只是把指標複製後返回了,但是指標指向的內容已經被...