在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

堆棧溢出定義和處理方式

要長高 ? 來源:zedware.github.io ? 作者:張文亮 ? 2022-06-10 16:46 ? 次閱讀

文章中用到的示例程序:stack.zip 。

顧名思義,stack overflow 就是是棧溢出了。在進(jìn)行數(shù)值運(yùn)算時,我們常常要和運(yùn)算結(jié)果的溢出打交道。數(shù)值運(yùn)算結(jié)果可能上溢(overflow),也可能是下溢(underflow)。不過棧的溢出顯然只可能是上溢,即棧空間被用完了。在提起“棧”(stack)這個概念的時候,千萬不要忘記了它的兄弟“堆”(heap),也要切記不要把二者搞混了。

那么,什么時候會把給用完了呢?如果我們記得C程序中的局部變量是在棧中分配的,函數(shù)調(diào)用會占用一部分棧空間,則可以很容易地構(gòu)造出相應(yīng)的測試用例。

1、定義占用空間過大的局部變量所導(dǎo)致的棧溢出

C:\》 more stack_local.c

/*

* Allocate too much memory from stack will cause stack overflow.

*/

#include

int main(int argc, char *argv[])

{

int foo[1000000];

return 0;

}

C:\》 cl stack_local.c

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86

Copyright (C) Microsoft Corporation. All rights reserved.

stack_local.c

Microsoft (R) Incremental Linker Version 8.00.50727.42

Copyright (C) Microsoft Corporation. All rights reserved.

/out:stack_local.exe

stack_local.obj

C:\》 stack_local

此時出現(xiàn)一個異常對話框:stack-local.jpg 。

2、函數(shù)遞歸調(diào)用導(dǎo)致的棧溢出

C:\》 more stack_recursive.c

/*

* Infinite recursive calls will lead to stack overflow soon.

*/

#include

static void foo(void);

static void bar(void);

int main(int argc, char *argv[])

{

foo();

return 0;

}

static void foo(void)

{

bar();

}

static void bar(void)

{

foo();

}

C:\》 cl stack_recursive.c

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86

Copyright (C) Microsoft Corporation. All rights reserved.

stack_recursive.c

Microsoft (R) Incremental Linker Version 8.00.50727.42

Copyright (C) Microsoft Corporation. All rights reserved.

/out:stack_recursive.exe

stack_recursive.obj

C:\》 stack_recursive

該程序沒聲沒息就結(jié)束了。查看進(jìn)程返回值能發(fā)現(xiàn)它其實(shí)是異常終止了。只不過沒有像 stack_local 那樣彈出一個對話框。

C:\》 echo %errorlevel%

-1073741819

要搞清楚這兩個程序?yàn)槭裁从羞@點(diǎn)細(xì)微的區(qū)別,可以查閱一下二者的匯編代碼。原來是 _chkstk() 在起作用,其中 stack_local 在程序初始加載時就會導(dǎo)致 _chkstk() 失敗,觸發(fā)異常。而 stack_recursive 可以正確加載,并運(yùn)行一段時間,然后導(dǎo)致棧溢出,并觸發(fā)異常。

要正確處理?xiàng)R绯霾捎靡韵罗k法:

(1)修正我們的程序,不要造成無窮遞歸或太深的遞歸。我們可以把某些遞歸代碼非遞歸化,例如那個經(jīng)典的 qsort ,最好就用非遞歸的算法來實(shí)現(xiàn),就比較皮實(shí)一點(diǎn)。

(2)修正我們的程序,不要定義過大的局部變量,特別是在定義大結(jié)構(gòu)、大數(shù)組時要格外小心。有時我們可能會用 _alloca() 這樣的特殊函數(shù)直接在棧上分配空間,更要多加注意。

(3)利用編譯器的特性,將進(jìn)程允許的棧大小設(shè)置得大一些。例如可以采用 MSC 中的 /STACK 參數(shù)開關(guān)。

(4)對于那些還可能導(dǎo)致棧溢出的代碼,采用 Microsoft 的結(jié)構(gòu)化異常處理或標(biāo)準(zhǔn)的 C++ 異常處理機(jī)制,結(jié)合 _resetstkoflw() 進(jìn)行處理。當(dāng)然了,要是不嫌麻煩,我們也可以自己探測所用棧的大小,動態(tài)地檢測是否可能導(dǎo)致棧溢出,以避免可能的異常。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 堆棧
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19794
收藏 人收藏

    評論

    相關(guān)推薦

    Embedded Studio堆棧溢出預(yù)防功能

    為了識別運(yùn)行的嵌入式系統(tǒng)中的堆棧溢出問題,SEGGER編譯器通過為每個函數(shù)生成檢測代碼的方式來檢查堆棧溢出。該功能可以使用命令行開關(guān)-mst
    發(fā)表于 07-14 11:08 ?638次閱讀

    什么是堆棧溢出?如何分配堆棧空間大小?

    前些日子bug交流群里的小哥調(diào)試了一個堆棧溢出的bug,動不動數(shù)據(jù)就被篡改了,應(yīng)該也是搞得焦頭爛額,頭皮發(fā)麻!當(dāng)時bug菌看了下,于是拋出了自己的一些調(diào)試經(jīng)驗(yàn),一般這樣的問題80%是越界和堆棧
    的頭像 發(fā)表于 11-08 09:52 ?4754次閱讀
    什么是<b class='flag-5'>堆棧</b><b class='flag-5'>溢出</b>?如何分配<b class='flag-5'>堆棧</b>空間大小?

    TLE9893如何配置堆棧溢出檢測?

    目的: 因此,根據(jù)我的理解,警戒帶的下限為0x18002 320 ,而上限為0x18002 390,總共為112字節(jié)。 現(xiàn)在,正如鏈接器報告的那樣,最大堆棧使用量至少為 144 字節(jié): 因此,可以得出結(jié)論,堆棧指針必須位于我
    發(fā)表于 01-19 06:11

    PCB過孔阻焊的處理方式

    `請問PCB過孔阻焊的處理方式有哪些?`
    發(fā)表于 12-31 15:28

    FreeRTOS中的任務(wù)堆棧溢出檢測機(jī)制

    余多少空間,如果函數(shù)返回0則說明可能發(fā)生了任務(wù)堆棧溢出。在應(yīng)用中調(diào)用該函數(shù)可以幫助了解任務(wù)堆棧的一個實(shí)際使用情況。FreeRTOS中還提供了兩種堆棧
    發(fā)表于 10-15 13:51

    按鍵消抖都有哪些處理方式

    按鍵消抖都有哪些處理方式除了硬件消抖電路用軟件怎么實(shí)現(xiàn)
    發(fā)表于 11-01 07:06

    MSP430 C語言編程的程序堆棧溢出分析

    MSP430 C語言編程的程序堆棧溢出分析
    發(fā)表于 05-16 15:04 ?40次下載

    光盤銷毀機(jī)的處理方式

    光盤銷毀機(jī)的處理方式         
    發(fā)表于 12-31 10:50 ?4207次閱讀

    堆棧溢出怎么解決方式

     堆棧是一個在計算機(jī)科學(xué)中經(jīng)常使用的抽象數(shù)據(jù)類型。堆棧中的物體具有一個特性: 最后一個放入堆棧中的物體總是被最先拿出來, 這個特性通常稱為后進(jìn)先出(LIFO)隊列。 堆棧
    發(fā)表于 11-28 11:16 ?3w次閱讀
    <b class='flag-5'>堆棧</b><b class='flag-5'>溢出</b>怎么解決<b class='flag-5'>方式</b>

    cad堆棧溢出的原因及解決方式

    近期有用戶反饋在打開AutoCad 2007的時候頻繁出現(xiàn)卡死的情況,并提示還提示0x00000FD堆棧溢出,重啟電腦和重裝軟件都無法解決。針對該問題小編整理了一些方法供大家參考。
    發(fā)表于 11-28 14:19 ?2.8w次閱讀
    cad<b class='flag-5'>堆棧</b><b class='flag-5'>溢出</b>的原因及解決<b class='flag-5'>方式</b>

    【經(jīng)驗(yàn)分享】系統(tǒng)常用 (電磁兼容)EMC處理方式

    【經(jīng)驗(yàn)分享】系統(tǒng)常用 (電磁兼容)EMC處理方式
    發(fā)表于 04-17 10:02 ?35次下載
    【經(jīng)驗(yàn)分享】系統(tǒng)常用 (電磁兼容)EMC<b class='flag-5'>處理方式</b>

    關(guān)于堆棧溢出技術(shù)你知道多少?

    雖然溢出在程序開發(fā)過程中不可完全避免,但溢出對系統(tǒng)的威脅是巨大的,由于系統(tǒng)的特殊性,溢出發(fā)生時攻擊者可以利用其漏洞來獲取系統(tǒng)的高級權(quán)限r(nóng)oot,因此本文將詳細(xì)介紹堆棧
    的頭像 發(fā)表于 07-04 16:42 ?6409次閱讀

    STM32 堆棧溢出檢測

    釋放,存放函數(shù)調(diào)用,局部變量等數(shù)據(jù)。堆heap用于動態(tài)內(nèi)存分配。堆棧可以在啟動文件或者鏈接腳本中指定大小,但在實(shí)際開發(fā)中,尤其工程量較大的項(xiàng)目中難以確定堆棧使用量,容易造成堆棧溢出,造
    發(fā)表于 12-27 18:32 ?22次下載
    STM32 <b class='flag-5'>堆棧</b><b class='flag-5'>溢出</b>檢測

    PCB電鍍中異常處理方式

    個人收集的一些異常處理方式
    發(fā)表于 08-11 15:01 ?0次下載

    Embedded Studio堆棧溢出預(yù)防簡析

    為了識別運(yùn)行的嵌入式系統(tǒng)中的堆棧溢出問題,SEGGER編譯器通過為每個函數(shù)生成檢測代碼的方式來檢查堆棧溢出
    的頭像 發(fā)表于 07-14 11:07 ?957次閱讀
    主站蜘蛛池模板: 亚洲一本| 99在线国产| 国产福利小视频在线观看| 久操成人| 永久免费看的啪啪网站| 六月丁香激情| 欧美国产日本高清不卡| 国内视频一区| 亚洲成年| bt种子搜索在线| 欧美三级一级| 四虎国产视频| 亚洲五月综合网色九月色| 欧美日本免费| 国产精品久久久久久吹潮| 亚洲卡5卡6卡7国色天香| 午夜看黄| 欧洲精品不卡1卡2卡三卡 | 国产小毛片| 老司机成人精品视频lsj| 日本人亚洲人成人| 色婷婷综合久久久| 四虎国产精品成人永久免费影视| 三级黄色免费| 恐怖片大全恐怖片免费观看好看的恐怖片| 国产精品四虎在线观看免费| 天天天狠天天透天天制色| 成 人网站免费| 国产99久9在线视频| avtt天堂网 手机资源| 黄色国产在线视频| 黄色大秀| 伊人狠狠丁香婷婷综合色| 日韩在线视频www色| 色站视频| 韩国精品videosex性韩国| 国产一级久久免费特黄| 午夜免费理论片在线看| 欧美午夜网| 亚洲一区二区三区在线播放| 五月激情婷婷综合|