淺說iOS為什么會上棧溢出

簡介

本文介紹了如下內(nèi)容

  • 棧的概念
  • 為什么會發(fā)生棧溢出
  • 棧溢出的幾種栗子
  • 怎么預(yù)防和發(fā)現(xiàn)棧溢出锈麸。

什么是棧趾徽?

  • 從數(shù)據(jù)結(jié)構(gòu)來說:棧(stack)又名堆棧侧巨,它是一種運算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表躯枢。這一端被稱為棧頂则吟,相對地,把另一端稱為棧底锄蹂。向一個棧插入新元素又稱作進(jìn)棧氓仲、入棧或壓棧得糜,它是把新元素放到棧頂元素的上面敬扛,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棾叮或退棧啥箭,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素治宣。

  • 在計算機系統(tǒng)中:棧則是一個具有以上屬性的動態(tài)內(nèi)存區(qū)域急侥。程序可以將數(shù)據(jù)壓入棧中,也可以將數(shù)據(jù)從棧頂彈出侮邀。在i386機器中坏怪,棧頂由稱為esp的寄存器進(jìn)行定位。壓棧的操作使得棧頂?shù)牡刂窚p小豌拙,彈出的操作使得棧頂?shù)牡刂吩龃蟆?/p>

  • 棧在程序的運行中有著舉足輕重的作用陕悬。最重要的是棧保存了一個函數(shù)調(diào)用時所需要的維護信息,這常常稱之為堆棧幀或者活動記錄按傅。堆棧幀一般包含如下幾方面的信息:

    • 臨時變量:包括函數(shù)的非靜態(tài)局部變量以及編譯器自動生成的其他臨時變量捉超。
    • 函數(shù)的返回地址和參數(shù)

什么是棧溢出胧卤?

棧溢出就是緩沖區(qū)溢出的一種。 由于緩沖區(qū)溢出而使得有用的存儲單元被改寫,往往會引發(fā)不可預(yù)料的后果拼岳。程序在運行過程中枝誊,為了臨時存取數(shù)據(jù)的需要,一般都要分配一些內(nèi)存空間惜纸,通常稱這些空間為緩沖區(qū)叶撒。如果向緩沖區(qū)中寫入超過其本身長度的數(shù)據(jù),以致于緩沖區(qū)無法容納耐版,就會造成緩沖區(qū)以外的存儲單元被改寫祠够,這種現(xiàn)象就稱為緩沖區(qū)溢出。緩沖區(qū)長度一般與用戶自己定義的緩沖變量的類型有關(guān)粪牲。棧溢出就是緩沖區(qū)溢出的一種古瓤。

iOS/Mac棧的大小是多少?

  • iOS上主線程椣傺簦空間大小為1MB
  • iOS上子線程椔渚空間大小為512KB
  • Mac OS上主線程棧大小為8MB
  • 對于子線程,線程的棧大小是在線程創(chuàng)建的時候就創(chuàng)建好的亭引,但是只有實際使用到的時候才會分配到具體內(nèi)存绎速;同時,子線程能夠允許的最小棧大小為16KB焙蚓,且棧的大小必須是4KB的整數(shù)倍纹冤。

哪些情況會造成棧溢出

  • 棧上變量直接分配內(nèi)存長度超過棧空間大小,如下
   int buf[1024*1024] = {0};

對應(yīng)的崩潰日志主届,一般情況下遇見有Stack Guard的關(guān)鍵字赵哲,就標(biāo)明棧溢出了

image

  • 間接使用操作棧上內(nèi)存超限的函數(shù)待德,包括但不限于以下函數(shù)
void *memcpy(void *__dst, const void *__src, size_t __n);
void *memmove(void *__dst, const void *__src, size_t __len);
char *strcpy(char *__dst, const char *__src);
char *strncpy(char *__dst, const char *__src, size_t __n);

舉個栗子:

void function1(char *str){
    int32_t maxsize = 100*1024*1024;
    char buffer[maxsize];
    //strcpy(buffer, str);
    memcpy(buffer, str, maxsize);
}

   char *a = malloc(1024*1024);
   function1(a);

來個崩潰日志君丁,關(guān)鍵字還是Stack Guard哦。

image

  • 無限遞歸調(diào)用,見如下斐波那契數(shù)列函數(shù)遞歸實現(xiàn)
int  fibonacci(int n){
    if (n == 1) {
       return 1;
    }
    if (n == 2) {
        return 2;
    }
    return  fibonacci(n) * fibonacci(n - 1);
}

再來個崩潰日志給大家瞧瞧将宪,不要錢哦绘闷,關(guān)鍵字還是Stack Guard

image

_

怎么避免棧溢出崩潰较坛?

  • 棧上申請內(nèi)存不要超過512KB印蔗,建議超過100KB以上的內(nèi)存申請,都使用堆上的內(nèi)存分配方式丑勤,malloc,calloc
  • 使用操作內(nèi)存讀寫的系統(tǒng)函數(shù)時华嘹,保證大內(nèi)存的內(nèi)存操作在堆上進(jìn)行
  • 避免使用遞歸,所有的遞歸都可以使用循環(huán)實現(xiàn)法竞。即使不得不使用遞歸耙厚,也要對遞歸調(diào)用層次做優(yōu)化和控制(感謝@老青菜提出的寶貴意見)强挫。

參考文獻(xiàn)

作者:落葉情思 鏈接:https://juejin.cn/post/6902668468991524871

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市薛躬,隨后出現(xiàn)的幾起案子俯渤,更是在濱河造成了極大的恐慌,老刑警劉巖型宝,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件八匠,死亡現(xiàn)場離奇詭異,居然都是意外死亡趴酣,警方通過查閱死者的電腦和手機梨树,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖寞,“玉大人劝萤,你說我怎么就攤上這事∩麒担” “怎么了床嫌?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胸私。 經(jīng)常有香客問我厌处,道長,這世上最難降的妖魔是什么岁疼? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任阔涉,我火速辦了婚禮,結(jié)果婚禮上捷绒,老公的妹妹穿的比我還像新娘瑰排。我一直安慰自己,他們只是感情好暖侨,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布椭住。 她就那樣靜靜地躺著,像睡著了一般字逗。 火紅的嫁衣襯著肌膚如雪京郑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天葫掉,我揣著相機與錄音些举,去河邊找鬼。 笑死俭厚,一個胖子當(dāng)著我的面吹牛户魏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼叼丑,長吁一口氣:“原來是場噩夢啊……” “哼资铡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幢码,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤笤休,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后症副,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體店雅,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年贞铣,在試婚紗的時候發(fā)現(xiàn)自己被綠了闹啦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辕坝,死狀恐怖窍奋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酱畅,我是刑警寧澤琳袄,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站纺酸,受9級特大地震影響窖逗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜餐蔬,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一碎紊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧樊诺,春花似錦仗考、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缸夹,卻和暖如春痪寻,著一層夾襖步出監(jiān)牢的瞬間螺句,已是汗流浹背虽惭。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛇尚,地道東北人芽唇。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匆笤。 傳聞我的和親對象是個殘疾皇子研侣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容