※ 引述《gamed (Maiko)》之銘言:
: 我朋友最近去面試
: 其中有一個主管考一題
: char *fun()
: {
: char str[] = {"Hello"};
: return str;
: }
: void main()
: {
: char *p = NULL;
: p = fun();
: printf("%s\n", p);
: }
: 問結果如何
: 主管給的回答是這樣可以把指標傳出來
指標傳出來我想是沒問題的,這樣就單純把指到這空間的地址回傳出來而已,除非編
譯器很好心幫你加工過
: 所以可以印出結果
是可以印出東西,但東西是不是對的比較重要XDD
: 我的觀念是 function 的變數只要離開迴圈
: 都會被歸還OS(除了malloc)
: 我的想法對嗎?
OS應該是程式結束後才會接手吧?離開function,東西還是會留在那,但下一個用到
該空間的function如果有對該空間寫值就會被蓋過去,你一點辦法都沒有,換句話說
無法保證資料的正確性
: 我在公司電腦(ubuntu)
: 的確可以印出字串 囧
那就只是剛好沒有function對該空間寫值
: 但家裡的電腦(ubuntu)卻印出亂碼
info leak !
: 我有印出指標位址
: 的確可以把位址傳出來
我自己用gcc 5.4測試,看起來編譯器會在fun()結尾的時候把rax歸0,不讓指向區域
變數的指標回傳
: 我後來想想
: 在公司電腦可以順利印出字串
: 是運氣好 剛好那段位址的內容沒被覆蓋??
: 如果想法有錯誤
: 請各位前輩能多給指導
: 謝謝
就是運氣好別懷疑,後續的printf裏面用的變數也是用stack上的空間存放,沒被蓋掉
真的就是運氣好
這種寫法很糟,很容易有安全性問題,就像你在家試的時候印出的亂碼很可能就是洩
漏出敏感地址,讓系統保護形同虛設
大概是這樣子吧,不知道有沒有說錯QQ