不解的Bug

今日在寫ALM算法的C代碼的時候,遇到了一個令我匪夷所思的Bug。現將相關現象記錄如下:

在一個名爲utils.c的文件中定義函數dabs,並且在頭文件utils.h中申明瞭它並使用了extern關鍵字。然後我在alm.c的文件中使用到了dabs函數,但是在該.c的文件中我忘記了include utils.h頭文件。結果編譯鏈接之後,對dabs的調用計算不正確。在alm.c文件中包含了utils.h後,計算正確。


今日發現造成此Bug的原因,原因在於使用了沒有申明的函數,如果在鏈接的時候找到了該函數,那麼編譯器默認函數的返回類型爲int型。而這個Bug正是由編譯器的這一默認操作所導致的,dabs函數的返回值類型爲double,由於沒有包含聲明它的頭文件,編譯鏈接的時候雖然可以找到該函數,但是會默認把它的返回值處理成整型,從而導致出錯;而如果返回函數類型恰巧爲整型,那麼那也只是剛剛好對了而已。


關於這種Bug,如果要能很好的處理它,需要深入地鑽研C99標準。


昨天又搞出一個類似的bug, 只不過這次是函數傳參不對,因爲沒有包含申明函數的頭文件,造成給函數傳遞的參數經常出錯。該Bug的原因應該也是同樣道理,具體原因還有待詳細研究C99標準然後做定論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章