事後諸葛亮:如何寫出沒有bug的軟體
網上對蘋果iOS7作業系統中最新暴露出的一個嚴重安全漏洞的討論讀起來十分有趣。如果你還沒有讀過Alex Langley對此的分析,那現應該讀一下,寫的非常好。
附帶說一下,是一個TLS v1.2 SSL連線問題上的bug,簽名認證沒有被檢查,使偽造簽名成為可能。原因是程式碼永久的直接跳到了方法的結尾處,沒有實際檢查雜湊結果是否正確。
是什麼導致了這樣一個弱者的bug?我四處看了一下,下面是網友們總結出的幾個原因:
- 用C語言很難寫出正確無誤的程式
- 蘋果公司的程式設計師不用心
- 編碼風格中允許忽略大括號
- 蘋果公司裡沒有正規的程式碼審查
- 使用了goto語句
- 使用了自動程式碼合併
- 沒有開啟編譯器對死程式碼的警告
- 沒有使用靜態分析工具
- 沒有好好測試
所有的這些原因看起來都像是在這個bug的產生中扮演了一定的角色。但有一個主導原因嗎?
對程式碼的差異對比給不了多少有用的資訊,在631行上的這個bug看起來怎麼產生的都有可能。也許是一次程式碼合併錯誤,也許是愚蠢的複製/貼上造成。
事實上,你很難,或許不可能找到一個單一的為此bug負責的原因,那我們能有什麼良方?很多人說是指程式碼上沒有用花括號包圍的原因。例如Zed說:
很顯然寫這段Apple SSL C 程式碼的傢伙沒有讀過我的C語言書:永遠使用花括號!
— zedshaw (@zedshaw) February 23, 2014
這就是帕金森瑣碎定理的一個很好的例子:花費大量時間討論無關緊要的瑣事。引起這個bug的根源不是缺少花括號。有沒有花括號不會成為這個多餘的goto的產生的原因。
為什麼我們,程式設計師們,總是抱怨編碼風格問題,但卻不重視程式碼審查對程式正確性的決定作用呢?雖然不好的編碼風格會隱藏程式bug,但並不是編碼風格產生的問題。我們太重視程式碼佈局視覺上的問題,卻故意逃避正確性問題。如果更注重正確性,絕對不可能讓這種關鍵程式碼中未經測試的情況下發布。
好的編碼風格並不能防止大部分的bug的產生——儘管有點作用。簡單的程式語言能夠減少bug的產生。程式碼審查的作用更大。靜態分析能讓你避免大量的bug。
認真的測試可以捕捉並防止很多bug的產生。這就是為什麼對於關鍵的軟體,比如cryptography
library,有100%的測試覆蓋率。這種一眼就能看出來的bug絕對不會在這種軟體裡出現。
未經測試的加密程式碼是用來解密的程式碼。
所以說,抱怨花括號是愚蠢的做法。相反,在這種情況下花括號會讓問題更難發現,花括號不是問題的根源,也不是問題的解決方案。大家找錯了方向。
相關文章
- 事後諸葛亮
- “事後諸葛亮”分析
- 事後諸葛亮會議
- 事後諸葛亮分析
- 事後諸葛亮分析報告
- 沒有需求就沒有軟體 (轉)
- 有沒有線上使用的CRM軟體?
- 有沒有support這樣的開源軟體
- 有沒有好用的,永久免費的CRM軟體?
- 如何製作地圖?有沒有什麼超好用的地圖軟體?地圖
- 有沒有永久免費的專案管理軟體專案管理
- 軟體測試到底有沒有出路
- 沒有防毒軟體的iOS,還安全麼?防毒iOS
- ORACLE軟體克隆完成後sysdba登入提示沒有許可權Oracle
- SOLIDWORKS軟體如何匯出帶有縮圖的BOMSolid
- 當今防毒軟體有沒有技術含量?防毒
- 軟體測試培訓分享:Bug的作用有多大?
- 中國真的沒有軟體生長的土壤嗎?
- 電腦風扇控制軟體有沒有?風扇控制軟體推薦!
- 你有哪些寫了Flutter 之後才知道的事兒Flutter
- 沒有流氓軟體,只有流氓行為
- 開源軟體沒有這麼脆弱
- 中國軟體人沒有創造力?
- fir.im Weekly - 如何寫出零 bug 的程式碼
- RealVNC,除了RealVNC,有沒有其他好用的VNC軟體VNC
- 日常Bug排查-應用Commit報錯事務並沒有回滾MIT
- ERP是軟體?你有沒有誤解?(轉)
- 軟體Bug引發的十次嚴重後果
- 軟體 Bug 引發的十次嚴重後果
- 如何跟程式設計師談一場沒有Bug的戀愛程式設計師
- 有沒有比較好的專案文件管理軟體?
- 哪位知道有沒有比較成熟的物流軟體模型?模型
- ALLEGRO軟體開啟提示說沒有記憶體記憶體
- 軟體人才並沒有那麼難找
- 後端開發:如何寫出可靠的介面後端
- 如何確定你的Linux發行版中有沒有某個軟體包Linux
- 《致命Bug:軟體缺陷的災難與啟示》讀後感受
- 軟體測試中的Bug迴歸,到底有多重要?