詳情
https://www.zhihu.com/question/7233096076
詳情
https://www.zhihu.com/question/7233096076
您好,根據(jù)您的代碼,不建議將函數(shù)內(nèi)部臨時(shí)變量的地址作為返回值。函數(shù)調(diào)用結(jié)束后棧空間釋放,局部變量的地址為無效值。
編譯時(shí)會(huì)出現(xiàn)警告提醒。
@TECH224?我不是來討論棧上數(shù)據(jù)是不是有效的, 我知道怎么用.
@TECH224?其次, 棧即使釋放了, 但是函數(shù)返回值在寄存器, 怎么會(huì)是 0
TECH224?而且這代碼在 msvc 和 armcc 表現(xiàn)都是一樣的, 都能正常返回啊
您好,涉及到函數(shù)棧地址的返回時(shí),編譯器通常會(huì)做出一定的優(yōu)化決策,以避免其潛在風(fēng)險(xiǎn)。
不同的編譯器會(huì)有不同的處理??赡苁遣蛔魈幚碇苯臃祷?zé)o效地址,或?yàn)楸苊獬绦蛟L問非法內(nèi)存而返回0值。?
在函數(shù)test1中,返回ret時(shí),將地址通過寄存器返回;在函數(shù)test中,GCC對(duì)于直接返回&a的情況進(jìn)行處理,以0作為返回值,避免返回已經(jīng)被銷毀內(nèi)存的地址。?在這種情況下,直接返回 0是一個(gè)保護(hù)措施,防止程序訪問非法內(nèi)存。?
您好,如還有其他問題,可以聯(lián)系郵箱lhb@wch.cn,方便進(jìn)一步交流。
多謝回復(fù), 這個(gè)跟優(yōu)化等級(jí)有關(guān)系嗎? 我目前只遇到過 risc-v 的 gcc 出現(xiàn)過這種優(yōu)化, 我編譯參數(shù)是 -O0.??
這種所謂優(yōu)化或者保護(hù)有編譯選項(xiàng)可以關(guān)閉嗎? 因?yàn)檎{(diào)試在內(nèi)存中加載的機(jī)器碼用主程序的調(diào)試器沒法調(diào)試
如果用郵箱聯(lián)系的話, 需要重新把問題整理后發(fā)郵件是吧
我用 STM32 的 CubeIDE 帶的 gcc 編譯器也測試了下, 發(fā)現(xiàn)的確和?MounRiver Studio_Community 的 gcc 編譯器一樣, 看來應(yīng)該是 gcc 的行為, 就是不知道有沒有哪個(gè)參數(shù)可以關(guān)閉這種行為
您好,該行為應(yīng)該是與優(yōu)化等級(jí)無關(guān)的,在O0和Os下是同樣的情況。
使用GCC12,將函數(shù)返回值類型定義為整型時(shí),能直接返回局部變量地址;當(dāng)函數(shù)返回值類型定義為指針類型時(shí)則返回0。您可據(jù)此進(jìn)行相應(yīng)處理。
后續(xù)如仍有相關(guān)問題,可以直接將本帖鏈接發(fā)送至郵箱lhb@wch.cn,方便通過郵箱更好地溝通。