Re: [問題]請問在FreeBSD底下設計程式
※ 引述《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"的狂狷不馴;屬於年少的輕狂色彩 ◎
討論串 (同標題文章)
FreeBSD 近期熱門文章
PTT數位生活區 即時熱門文章