天天看點

《C++程式設計調試秘笈》——第2章 什麼時候捕捉缺陷2.1 為什麼編譯器是捕捉缺陷的最好場合

c++程式設計調試秘笈

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

如果在編譯時捕捉缺陷與在運作時捕捉缺陷之間進行選擇,隻要有可能,都應該在編譯時捕捉缺陷。這樣做的理由有很多。首先,如果一個缺陷是被編譯器所檢測到的,我們将看到一條文本資訊,準确描述了所發生的錯誤是什麼,它是在哪裡發生的,發生在哪個檔案以及發生在哪一行。(作者在這裡可能稍微有點樂觀,因為在有些情況下,尤其是在涉及stl時,編譯器所産生的錯誤資訊是相當含糊的,需要花費精力才能推斷出編譯器實際所描述的含義。但是,編譯器總是在不斷地完善中,大多數情況下它們對問題的描述是相當清晰的。)

另一個理由是完整的編譯(進行了最終連結)覆寫了程式中的所有代碼。如果編譯器沒有傳回錯誤或警告,就可以百分之百地确信程式中不存在編譯時可以檢測到的錯誤。但對于運作時測試,就不能做出這樣的保證。當代碼相當龐大時,很難保證所有可能的分枝都被測試到,也無法保證每一行代碼都至少執行1次。

即使我們能夠保證這一點,仍然不夠。同一段代碼對于一組輸入可能正确地完成任務,但對于另一組輸入可能無法正确地工作。是以,通過運作時測試,我們永遠無法完全保證對所有東西都進行了測試。

最後還存在時間因素:我們在運作代碼之前執行編譯,是以如果在編譯時捕捉到了錯誤,就可以節省時間。有些運作時錯誤是在程式的後期出現的,是以可能要等幾分鐘甚至幾小時的運作之後才會發現一個錯誤。更糟的是,這種錯誤很可能是無法複制的,它可能以一種看上去随機的方式,在連續運作時出現并消失。相比之下,在編譯時捕捉錯誤就簡單得多!

繼續閱讀