Re: [問題] function 裡的變數 存活時間

作者: b0920075 (Void)   2017-12-22 15:35:57
※ 引述《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
作者: galic (嘎利)   2017-12-22 17:19:00
先不論對錯 主管這樣考就是預期你面試的時候 講出這篇8成的內容... 可見這種面試多沒有成效我不太能理解為何面試要搞的像震撼教育 然後逼的來面試的人除了被洗臉之外 還要回家上網google 上ptt問解答
作者: Hazukashiine (私は幸せです)   2017-12-22 17:23:00
我倒是很喜歡這種開放式問答的題目 XD
作者: mmmmei (mmm煤)   2017-12-22 17:38:00
那請問一下該怎麼寫才不會有memory leak 又可以在函數外print?
作者: Hazukashiine (私は幸せです)   2017-12-22 17:45:00
1. global char[] 2. heap allocation (preferred)
作者: loveflames (咕啾咕啾魔法陣)   2017-12-22 17:49:00
static local
作者: boss0405 (boss)   2017-12-22 18:12:00
這麼基本的問題如果還不懂很難想像寫出來的code會多可怕但可怕的是原PO的主管似乎認為可以這樣用不過我也曾經聽過有某公司軟體主管說extern globalvariable不要放在header file,然後說出一個錯誤的原因
作者: CoNsTaR ((const *))   2017-12-23 00:37:00
如果面試遇到樓上講的那樣的主管該怎麼辦啊 orz
作者: Schottky (順風相送)   2017-12-23 02:31:00
當然是塊陶,面試官是你以後的同事,有這種雷同事哪行
作者: mmmmei (mmm煤)   2017-12-23 14:48:00
那在c++ 就是char *ptr = new char[5] 這樣嗎?
作者: steve1012 (steve)   2017-12-23 15:04:00
在 c++應該會用 string XD 沒事不會砸自己的腳
作者: mmmmei (mmm煤)   2017-12-23 15:35:00
哎呀!單純疑問觀念 現實有STL可以用當然用
作者: loveflames (咕啾咕啾魔法陣)   2017-12-23 17:01:00
最好加上{}
作者: NoManInCar (NMIC)   2017-12-24 09:46:00
有個疑問 c++在function new出來的 應該也不能傳出來吧?我好像弄錯了 這邊我在想想
作者: uranusjr (←這人是超級笨蛋)   2017-12-24 10:01:00
new 和 malloc 在根本上是一樣的概念
作者: loveflames (咕啾咕啾魔法陣)   2017-12-24 10:26:00
兩個實作或許一樣,不過new是free store,malloc是heap
作者: hakman (^____^)   2017-12-24 23:08:00
我想要知道為什麼 extern global variable 不要放在headerfile ,有人可以說明一下嗎? 感恩
作者: boss0405 (boss)   2017-12-24 23:32:00
樓上,因為那主管搞錯觀念了,所以這結論也是錯的XD
作者: Killercat (殺人貓™)   2017-12-28 14:58:00
new傳出來不是不行 只是是不好的寫法通常來講new/delete要在同一個scope做,不能A()new了傳出來要使用者自己delete不然就得wrap一下 比方說C* Alloc() 跟 Release(C*)C*再用typedef包一下或者拿個warpper class處理一下btw, shared_ptr好方便的啊..大家都忘了很多原則了XD
作者: uranusjr (←這人是超級笨蛋)   2017-12-29 03:23:00
還是 Rust 大法好, 加上 lifetime 不會有這個問題了 (欸

Links booklink

Contact Us: admin [ a t ] ucptt.com