檢查程序位址空間是否出現位址越界問題是處理器範疇嗎

時間 2025-07-04 23:20:17

1樓:匿名使用者

與編譯器無關,只與記憶體管理機制有關,是作業系統級別的問題,堆疊的讀取方式只是資料結構上的不同,在機器層面,依然是單純的記憶體讀寫操作;陣列越界訪問的危險性不好評估,但確實是最嚴重的危險之一;結果基本上會100%崩潰,但是崩潰的租姿原因很可能不一樣,就算是同一段越界**跑幾遍,原因也可能是不一樣的;指標越界問題是不限於陣列訪問的,所以全面點的解釋如下:c語言的編譯時,會跟你的**需要,首先申請一塊棧空間和堆禪友空間,棧的優先順序較高,一般時存放程式執行所必須的資料和變數,記憶體上是連續的,堆空間是程式執行時動態申請的空間,記憶體上一般是不連續的,這裡說的棧與你自己建立的棧不是乙個棧,不過資料結構是一樣的,只不過你自己建立的棧是靠你自己寫的**動態建立的,所以其實是在你程式的堆空間中的;下面關鍵問題來了,以上所有記憶體空間就是你的程式在跑起來之後,向作業系統申請的所有空間,換句話說,弊襲絕這些記憶體以外的資料,都是不屬於你這個程式的資源,當你使用指標操作的時候,如果你的指標越界了,那麼接下來你對這個指標的操作就是非法的了,如果這段空間依然是你程式內部的資源,通常會導致你程式自己崩潰,如果是程式之外的資源一般就更糟糕了,甚至會導致更高階別的崩潰,原因很多:比如你篡改了不屬於你的資料,導致該資料所屬物件的邏輯混亂;比如越界區域存在保護,記憶體空間是有讀寫許可權控制的,如果接下來你對唯讀的空間進行寫操作,也會導致崩潰,windows下你會看到非常親切的藍屏;等等這也是記憶體溢位攻擊的基本思想;

2樓:匿名使用者

bolcym

zklssp腐劇 百棚遊早鏈雀磨隱度雲 rea

mykgqg

程序的位址空間和定址空間一樣嗎?

3樓:帳號已登出

位址空間就是程式可以使用的位址的集合,是乙個集合。你就把位址想象成**號碼,而一系列的號碼組成了乙個**號碼空間。

現在的作業系統都是比較先進的,使用者程式不能直接使用實體地址空間(為了安全),所以作業系統為每個程序建立了乙個位址空間,稱為虛擬位址空間。(注意是每個程序有乙個虛擬位址空間),對應的位址是虛擬位址。

如果程式要從記憶體中讀寫乙個位元組的話,首先使用的是虛擬位址空間的位址進行讀寫,cpu執行這條指令(包含虛擬位址空間的位址),然後將這條指令傳送出去,在半路上被乙個稱為mmu的強盜攔截了,然後這個強盜將虛擬位址替換成了實體地址,然後將這個位址傳送到記憶體。

每個程序都是0x00000000到0xffffffff的定址空間,4個g。 這裡的「0x00000000到0xffffffff」指的是虛擬位址。

比如說程序a的定址空間是0x00000000到0xffffffff,程序b也是這個,那豈不是這兩個程序的位址空間是一樣的?

這兩個程序的位址空間是不一樣的。打個比方,每個程序的位址空間就好像是不同地區的固定**號碼空間,不同地區的**號碼可以重疊,但是不會互相影響,是不同的東西。

不知道我又沒有說清楚!!!

總之每個程序被分配乙個位址空間(稱為虛擬位址空間),程序中的程式使用的位址就是這個位址空間的位址(稱為虛擬位址),而實際進行的記憶體讀寫使用的是記憶體條的實體地址,在程式進行記憶體讀寫時,有乙個稱為記憶體管理單元的硬體(mmu)將虛擬位址對映到實體地址進行讀寫。

4樓:匿名使用者

通常人們認為,記憶體容量越大,處理資料的能力也就越強,但記憶體容量不可能無限的大,它要受到系統結構、硬體設計、製造成本等多方面因素的制約,乙個最直接的因素取決於系統的位址匯流排的位址暫存器的寬度(位數)。 計算機的尋找範圍由匯流排寬度(處理器的位址匯流排的位數)決定的,也可以理解為cpu暫存器位數,這二者一般是匹配的。

5樓:網友

絕對是、肯定是一樣的。

c語言指標訪問越界

6樓:網友

作業系統記憶體管理模組,起到的作用是儲存程序的位址空間,即a程序不能「隨便」訪問b程序的位址。

而c++語言因為有指標,所以可以讓指標在記憶體中瘋狂移動,當然也可以移動到不屬於自己程序的記憶體位址空間上。比如上面再次p++(最好寫成++p),指標就有可能跑到其它程序了,而如果此時指標所指的位址正在被使用,就會出現read only之類的錯誤。但如果運氣好,越界的指標所指位址沒有被其它程序使用,這時程式就不會報錯!!!

這就是為什麼指標越界後,執行程式時有時會報錯,而有時只有程式邏輯上的錯誤!!

unix和linux上也大同小異。

問題補充:這是作業系統和硬體打交道的事,不關c語言的事,作業系統已經為c語言做好了訪存的工作。

7樓:網友

我的理解是,系統會管理所有使用的記憶體,並檢查對指定記憶體訪問是否合法。預設情況下乙個程式只能使用它系統分配給它的記憶體,在這個範圍裡面,只要經過分配出來的記憶體應該都能操作。通過一些api開啟其它程式的記憶體空間也能操作對應的記憶體,而如果不申請而直接使用系統肯定會報錯並且禁止這個操作的。

我沒有學習過相應的知識,不過根據我使用的經驗,系統有一套機制保障記憶體訪問的有效和安全。你可以看看這個。

8樓:網友

有指標越界,如果不是寫程式者的本意,那麼一般程式都不會正常執行,都要修改掉。

9樓:網友

c語言的指標是比較難用的,不知道什麼時候就有問題了,但是這個也是它強大的地方,可以訪問到任何地方。

10樓:匿名使用者

檢查越界是程式設計師得事,編譯器,系統一般不會越俎代庖。

11樓:da小麥開花

一般越界都會改變程式執行結構的 著名的蠕蟲病毒就是通過陣列溢位攻擊的。

12樓:

這個本身就不應該檢查啊。因為指標p指向的東西不一定要在陣列a的範圍內。他可以指向任何存在的位址範圍。

13樓:勵新霽萊湛

與編譯器無關,只與記憶體管理機制有關,是作業系統級別的問題,堆疊的讀取方式只是資料結構上的不同,在機器層面,依然是單純的記憶體讀寫操作;

陣列越界訪問的危險性不好評估,但確實是最嚴重的危險之一;

結果基本上會100%崩潰,但是崩潰的原因很可能不一樣,就算是同一段越界**跑幾遍,原因也可能是不一樣的;

指標越界問題是不限於陣列訪問的,所以全面點的解釋如下:

c語言的編譯時,會跟你的**需要,首先申請一塊棧空間和堆空間,棧的優先順序較高,一般時存放程式執行所必須的資料和變數,記憶體上是連續的,堆空間是程式執行時動態申請的空間,記憶體上一般是不連續的,這裡說的棧與你自己建立的棧不是乙個棧,不過資料結構是一樣的,只不過你自己建立的棧是靠你自己寫的**動態建立的,所以其實是在你程式的堆空間中的;

下面關鍵問題來了,以上所有記憶體空間就是你的程式在跑起來之後,向作業系統申請的所有空間,換句話說,這些記憶體以外的資料,都是不屬於你這個程式的資源,當你使用指標操作的時候,如果你的指標越界了,那麼接下來你對這個指標的操作就是非法的了,如果這段空間依然是你程式內部的資源,通常會導致你程式自己崩潰,如果是程式之外的資源一般就更糟糕了,甚至會導致更高階別的崩潰,原因很多:

比如你篡改了不屬於你的資料,導致該資料所屬物件的邏輯混亂;

比如越界區域存在保護,記憶體空間是有讀寫許可權控制的,如果接下來你對唯讀的空間進行寫操作,也會導致崩潰,windows下你會看到非常親切的藍屏;

等等。這也是記憶體溢位攻擊的基本思想;

c 語言中編譯器為何不檢測陣列下標越界問題

14樓:宥子quuo乲睽

以前還真沒想過,記得老師講的時候也沒說,就是強調這是c語言的歷史問題,從一開始就沒有,後來這個功能也沒有加上。至於具體的原因已知模稜兩可,今天總算查清楚了。

綜合網上的各種資料,可以得到如下的結果:

1. 在乙個固定的機器之下,指標所佔的位數都是一樣的,換言之,儲存的位址是有最大值的,這樣如果每次都檢查陣列的越界問題,會對指標的功能做出很大的限制,因為指標只是包含位址資訊並沒有包含長度的資訊,比如乙個。

char ch[100];

char * test=ch;

之後test也可以只想超過100的長度的字串型別,並不是侷限與100。如果檢測長度,那麼就相當與限制的指標的長度,這是不合理的。

2. 沒有效率,需要付出代價。具體:

最早的c編譯器並不檢查下標,而最新的編譯器依然不對它進行檢查。這項任務之所以很困難,是因為下標引用可以作為任意的指標,而不僅僅是陣列名。作用於指標的下標引用的有效性既依賴於該指標當時恰好指向什麼內容,也依賴於下標的值。

結果,c的下標檢查所涉及的開銷比你開始想象的要多。編譯器必須在程式中插入指令,證實下標的結果所引用的元素和指標表示式所指向的元素屬於同乙個陣列。這個比較操作需要程式中所有陣列的位置和長度方面的資訊,這將佔用一些空間。

當程式執行時,這些資訊必須進行更新,以反映自動和動態分配的陣列,這又將佔用一定的時間。因此,即使是那些提供了下標檢查的編譯器通常也會提供一些開關,允許你去掉下標檢查。

c語言程式設計的時候出現「程式已停止工作」的原因有哪些?

15樓:史帥鍋

最常見的原因:程式發生了空指標呼叫。62616964757a686964616fe59b9ee7ad9431333363376535

如果你剛入門,請檢查:

scanf("%d",&i); 有沒有加上「&」號,scanf必須在變數前加「&」取位址符)。

如果沒有加&, scanf會把變數當作位址來用,而你的程式中又沒有以變數為位址的變數,作業系統不允許程式讀寫程式規定範圍以外的空間。出於安全起見,作業系統將其緊急中止。就發生了「**

exe已停止工作」的效果。

如果你正在學習陣列,請檢查:

陣列是否越界。定義為int a[10]的陣列,如果寫a[10]=0; 相當於對a陣列裡的第11個元素賦值。事實上,a陣列裡並沒有第11個元素。

如果該元素的位置指向乙個程式以外的記憶體,作業系統同樣會果斷將其終止。

如果你正在學習指標,請檢查:

指標是否賦值;

在給指標賦值時,有沒有在非指標變數前加取位址符「&」

int * p = &i; //正確!

int * p = i; //錯誤!

這與在sccanf裡沒有加上「&」號的原因大致相同。

指標問題屬於程式邏輯錯誤,很多時侯編譯器只會給你乙個警告。要注意警告發生的位置自己是否有把握。如果你多次編譯或忽視編譯警告而進行鏈結,編譯器會認為你對這些警告是有把握的,完全地信任了你,也就沒有警告了。

求asp空間申請地址,求asp免費空間申請地址

10m asp 免費空間 免費1gb全能空間,電信高速,配有加速器網通訪問超度!詳情訪問 免費2gb全能空間,高速!支援asp php acc mysqr資料庫詳情訪問 本 站 通 知 如 發 現 下 列 情 況 的 不 通 知 的 前 提 下 刪 除 會 員 帳 號 與 空 間 1 注 冊 多 個...

域名如何設定指向空間地址啊

開啟控制面板 進入internet選項 將常規項裡的地址改成你想要指向空間地址 確定後就ok了 樓上的純粹瞎說了 1.先設定mx記錄,這項需要到你的域名 上的管理 上面去設定。比如將www指向到你伺服器的ip202.96.209.133 2.在你的伺服器上設定,比如微軟的伺服器就需要設定iis得主機...

如何看php fpm程序數量是否足夠

首先,需要預估專案在生產環境能有多少併發產生,根據預估設定初始fpm程序數配置,具體可以參考php文件 對於fpm的監控 建議開啟php fpm.conf中pm.status path設定,可以通過url請求獲取當前時刻fpm的程序狀態,支援html,josn,xml等資料格式返回,結合定時任務,可...