Re: [問題] function 裡的變數 存活時間
※ 引述《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
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.117.178.137
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1513928161.A.0DB.html
→
12/22 17:19,
6年前
, 1F
12/22 17:19, 1F
→
12/22 17:20,
6年前
, 2F
12/22 17:20, 2F
→
12/22 17:21,
6年前
, 3F
12/22 17:21, 3F
→
12/22 17:21,
6年前
, 4F
12/22 17:21, 4F
原先我看到原文以為主管在考不要回傳區域陣列地址這種觀念,但是看描述怎麼覺得主管才是搞不清楚的XDDD
推
12/22 17:23,
6年前
, 5F
12/22 17:23, 5F
推
12/22 17:38,
6年前
, 6F
12/22 17:38, 6F
→
12/22 17:38,
6年前
, 7F
12/22 17:38, 7F
如樓下所說,建議是malloc一個空間,把你要寫的東西放在malloc出來的空間裏面,因為空間在heap內,所以不
會因為離開function而喪失控制權,malloc出來的空間會喪失控制權就是在你free掉空間的時候,當然如果free完
又去讀寫空間,也會造成安全性問題:info leak和use after free
至於global array的話,如果宣告即給初始值會放在data,沒有的話放在bss,不管放哪個沒有控制權喪失的問題
但是當你不用的話你也不能回收再利用,相較malloc可以把不用的空間free掉,這種使用方式比較......不節約?
推
12/22 17:45,
6年前
, 8F
12/22 17:45, 8F
→
12/22 17:49,
6年前
, 9F
12/22 17:49, 9F
※ 編輯: b0920075 (140.117.178.137), 12/22/2017 18:06:58
推
12/22 18:12,
6年前
, 10F
12/22 18:12, 10F
→
12/22 18:12,
6年前
, 11F
12/22 18:12, 11F
→
12/22 18:14,
6年前
, 12F
12/22 18:14, 12F
→
12/22 18:14,
6年前
, 13F
12/22 18:14, 13F
推
12/23 00:37,
6年前
, 14F
12/23 00:37, 14F
→
12/23 02:31,
6年前
, 15F
12/23 02:31, 15F
推
12/23 14:48,
6年前
, 16F
12/23 14:48, 16F
推
12/23 15:04,
6年前
, 17F
12/23 15:04, 17F
推
12/23 15:35,
6年前
, 18F
12/23 15:35, 18F
→
12/23 17:01,
6年前
, 19F
12/23 17:01, 19F
→
12/24 09:46,
6年前
, 20F
12/24 09:46, 20F
→
12/24 09:46,
6年前
, 21F
12/24 09:46, 21F
→
12/24 09:47,
6年前
, 22F
12/24 09:47, 22F
→
12/24 10:01,
6年前
, 23F
12/24 10:01, 23F
→
12/24 10:26,
6年前
, 24F
12/24 10:26, 24F
→
12/24 10:26,
6年前
, 25F
12/24 10:26, 25F
推
12/24 23:08,
6年前
, 26F
12/24 23:08, 26F
→
12/24 23:08,
6年前
, 27F
12/24 23:08, 27F
推
12/24 23:32,
6年前
, 28F
12/24 23:32, 28F
推
12/28 14:58,
6年前
, 29F
12/28 14:58, 29F
→
12/28 14:58,
6年前
, 30F
12/28 14:58, 30F
→
12/28 14:58,
6年前
, 31F
12/28 14:58, 31F
→
12/28 14:59,
6年前
, 32F
12/28 14:59, 32F
→
12/28 14:59,
6年前
, 33F
12/28 14:59, 33F
→
12/28 15:00,
6年前
, 34F
12/28 15:00, 34F
→
12/29 03:23,
6年前
, 35F
12/29 03:23, 35F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):