Re: [問題]請問在FreeBSD底下設計程式

看板FreeBSD作者時間21年前 (2005/03/08 02:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/6 (看更多)
※ 引述《gmobug.bbs@bbs.hs.ntnu.edu.tw (低等動物)》之銘言: > 請問如果在FreeBSD底下設計程式, > 執行結果很詭異,但程式碼確定是正確的時候可能是哪些原因? > 我目前有一個函式會返回unsigned char *型態的指標(他是個字串) > 假設將那個函式的返回值存在res 1. 請勿撰寫類似以下的程式碼 char *foo() { char str[] = "12345"; return str; } 2. 用 gcc 編譯的話請開 -Wall 選項,並把所有 warning 正確的解決... 譬如說以上程式碼會造成 warning: function returns address of local variable 相關知識請參考 C 語言基礎書籍,講 scope 和 lifetime 那章... > 而我用printf("%s", res); > 執行結果是(null) > 用printf("(%d) %s", res, res); > 變成(0) 正確結果 > printf("(%d)(%d) %s", res, res, res); > 變成(0)(一個正整數) 正確結果 > 似乎return之後的第一個動作會出錯 > 接下來又正常了 > 為什麼會這樣? > ============================================= > 另外還有情況是 > 呼叫某自訂函式的時候會發生segment fault (core dump) > 找了很久都沒找到錯誤 > 後來把呼叫函式的那行重寫就又正常了 > 但再比對之前的並沒有什麼不同!? > 有人遇過類似情況嗎? 有關 segmentation fault 的資訊, 可以參考任何 Unix 或 Linux Programming 書籍, 在 signal 那章... 另外請參照這類書籍說明 gdb 的部分, 以協助您利用 dump 出來的 core 檔搭配執行檔進行除錯, 要做這個動作麻煩您在編譯時加個 -g 或 -ggdb 的參數, 這樣通常就能精確抓到問題所在... 至於 process 會收到這個 signal 的原因, 主要是 pointer 指到 process 被 OS 授權存取的記憶體以外的區間, 然後又對該 pointer 進行存取而造成的, OS 會攔截這個的原因是基於安全和穩定性的考量... 簡單說就是程式寫錯, pointer 沒初始化就拿來用, 或是根本不檢查 library function 傳回的是不是 NULL 等等的可能性都有.. -- Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net School: National Chung Cheng University Department: Computer Science and Information Engineering Researching: Porting GCC and Implementing VLIW instruction schedulr in GCC Homepage: https://it.muds.net/~uranus -- ╔═══╗ ┼────────────────────────╮ 狂狷 Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮ 年少 ┼╮ < IP:140.119.164.16 > ╰─╮ ╚╦═╦╝ From:218-171-140-47.dynamic.hinet.net ─╨─╨─ KGBBS 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩
文章代碼(AID): #12B9Rz00 (FreeBSD)
文章代碼(AID): #12B9Rz00 (FreeBSD)