利用函數(shù)參數(shù)地址尋址的問題

之前在用C語言編程的時候,有些時候會利用stack的布局做一些操作.我之前在 實現(xiàn)垃圾收集器算法的時候就會使用函數(shù)參數(shù)的地址嫂丙,用這個地址作為基址在 stack上尋找我想要的數(shù)據(jù). 這篇文章 里面詳細介紹了stack的布局娘赴,以及編譯器在編譯函數(shù)時自動產生的前言和結語等問題. 對這個垃圾收集算法感興趣的可以看 這里. 我在寫這個算法的時候就發(fā)現(xiàn)當使用clang編譯器編譯后,函數(shù)參數(shù)在stack中的布局 跟預期的不一樣.這是 sf上提出的一個問題

后來在工作中涉及到了不少關于stack balance的問題奢入,其中有些需求讓我不得不 讀反編譯后的代碼.

對于這樣一個函數(shù)

int add(int a, int b)
 {
      return a + b;
 }

其用clang編譯后乙漓,反編譯結果如下

 080483c0 <add>:
    80483c0:   55                      push   %ebp
    80483c1:   89 e5                   mov    %esp,%ebp
    80483c3:   83 ec 08                sub    $0x8,%esp
    80483c6:   8b 45 0c                mov    0xc(%ebp),%eax
    80483c9:   8b 4d 08                mov    0x8(%ebp),%ecx
    80483cc:   89 4d fc                mov    %ecx,-0x4(%ebp)
    80483cf:   89 45 f8                mov    %eax,-0x8(%ebp)
    80483d2:   8b 45 fc                mov    -0x4(%ebp),%eax
    80483d5:   03 45 f8                add    -0x8(%ebp),%eax
    80483d8:   83 c4 08                add    $0x8,%esp
    80483db:   5d                      pop    %ebp
    80483dc:   c3                      ret
    80483dd:   0f 1f 00                nopl   (%eax)

可以看到中間有4句mov指令做了stack拷貝操作.拷貝后stack布局變成

 +---------+
 |high     |
 +---------+
 |101      |<-arg2
 +---------+
 |99       |<-arg1
 +---------+
 |ret      |
 +---------+
 |ebp      |
 +---------+
 |99       |<-a
 +---------+
 |101      |<-b
 +---------+
 |low      |
 +---------+

這一步拷貝操作導致用參數(shù)的地址作為地址來尋址會遇出錯.當時在實現(xiàn)垃圾收集 算法的時候還以為clang的參數(shù)計算順序問題,或者是ABI的問題万牺,現(xiàn)在看來還是圖 樣.

回過頭來看這個問題阳掐,clang這么做在效率上會有損失,但是的確是符合邏輯的. 這樣的一個參數(shù)拷貝操作之后武福,使得函數(shù)的參數(shù)都在自己的frame當中议双,而不像之 前一樣,函數(shù)的參數(shù)在其caller的frame中. 這個問題也說明捉片,利用函數(shù)參數(shù)地址來進行stack上的尋址操作是有潛在風險的.

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末平痰,一起剝皮案震驚了整個濱河市汞舱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宗雇,老刑警劉巖昂芜,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赔蒲,居然都是意外死亡泌神,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門舞虱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欢际,“玉大人,你說我怎么就攤上這事矾兜∷鹎鳎” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵椅寺,是天一觀的道長浑槽。 經常有香客問我,道長返帕,這世上最難降的妖魔是什么括荡? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮溉旋,結果婚禮上畸冲,老公的妹妹穿的比我還像新娘。我一直安慰自己观腊,他們只是感情好邑闲,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梧油,像睡著了一般苫耸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儡陨,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天褪子,我揣著相機與錄音,去河邊找鬼骗村。 笑死嫌褪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的胚股。 我是一名探鬼主播笼痛,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缨伊?” 一聲冷哼從身側響起摘刑,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刻坊,沒想到半個月后枷恕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡谭胚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年活尊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漏益。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖深胳,靈堂內的尸體忽然破棺而出绰疤,到底是詐尸還是另有隱情,我是刑警寧澤舞终,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布轻庆,位于F島的核電站,受9級特大地震影響敛劝,放射性物質發(fā)生泄漏余爆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一夸盟、第九天 我趴在偏房一處隱蔽的房頂上張望蛾方。 院中可真熱鬧,春花似錦上陕、人聲如沸桩砰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亚隅。三九已至,卻和暖如春庶溶,著一層夾襖步出監(jiān)牢的瞬間煮纵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工偏螺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留行疏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓套像,卻偏偏與公主長得像隘擎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凉夯,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內容