事後諸葛亮:如何寫出沒有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絕對不會在這種軟體裡出現。
未經測試的加密程式碼是用來解密的程式碼。
所以說,抱怨花括號是愚蠢的做法。相反,在這種情況下花括號會讓問題更難發現,花括號不是問題的根源,也不是問題的解決方案。大家找錯了方向。
相關文章
- 事後諸葛亮
- “事後諸葛亮”分析
- 事後諸葛亮會議
- 事後諸葛亮分析
- 事後諸葛亮分析報告
- 諸葛亮是如何用FMEA打勝仗的?
- 團隊作業6——事後諸葛亮分析
- 《王者榮耀》上線反派新英雄:諸葛亮宿敵
- 諸葛亮vs司馬懿,排序演算法大戰誰能笑到最後?排序演算法
- 諸葛亮借到真東風!《世界啟元》重新定義SLG新賽季
- 如何打造軟體平臺的亮點
- IntelliJ IDEA 2020.2正式釋出,諸多亮點總有幾款能助你提效IntelliJIdea
- 有沒有線上使用的CRM軟體?
- Android 13 Beta 版釋出,諸多亮點不容錯過Android
- 有沒有好用的,永久免費的CRM軟體?
- 專訪諸葛瓜CEO:我們如何開發TapTap 9.5分的商業遊戲?APT遊戲
- 如何製作地圖?有沒有什麼超好用的地圖軟體?地圖
- 小米MIX 3將於10月25日釋出:沒有明顯短板,也沒有太多的亮點
- 相聚諸葛八卦村 神武3手遊玩家探尋新門派背後的故事
- 日常Bug排查-應用Commit報錯事務並沒有回滾MIT
- SOLIDWORKS軟體如何匯出帶有縮圖的BOMSolid
- RealVNC,除了RealVNC,有沒有其他好用的VNC軟體VNC
- 有沒有永久免費的專案管理軟體專案管理
- 軟體測試培訓分享:Bug的作用有多大?
- Zoho專案管理軟體有哪些功能亮點專案管理
- 沒有人測出微博的 bug 嗎
- 軟體測試到底有沒有出路
- 阿里雲葛岱斌:讓天下沒有難做的安全運維阿里運維
- 你有哪些寫了Flutter 之後才知道的事兒Flutter
- 沒有發現 bug 的測試是否有價值
- 電腦風扇控制軟體有沒有?風扇控制軟體推薦!
- 後端開發:如何寫出可靠的介面後端
- 如何確定你的Linux發行版中有沒有某個軟體包Linux
- 軟體測試中的Bug迴歸,到底有多重要?
- ALLEGRO軟體開啟提示說沒有記憶體記憶體
- Offer 提速:如何寫出有亮點的簡歷
- ? ? ? 新鮮出爐!go 版本的 pipeline 釋出啦,你還在愁 go 沒有好用的中介軟體嗎?Go
- Appium+python自動化(二十二)- 三個臭皮匠頂個諸葛亮-控制元件座標獲取(超詳解)APPPython控制元件