事後諸葛亮:如何寫出沒有bug的軟體
網上對蘋果iOS7作業系統中最新暴露出的一個嚴重安全漏洞的討論讀起來十分有趣。如果你還沒有讀過Alex Langley對此的分析,那現應該讀一下,寫的非常好。
附帶說一下,是一個TLS v1.2 SSL連線問題上的bug,簽名認證沒有被檢查,使偽造簽名成為可能。原因是程式碼永久的直接跳到了方法的結尾處,沒有實際檢查雜湊結果是否正確。
是什麼導致了這樣一個弱者的bug?我四處看了一下,下面是網友們總結出的幾個原因:
用C語言很難寫出正確無誤的程式
蘋果公司的程式設計師不用心
編碼風格中允許忽略大括號
蘋果公司裡沒有正規的程式碼審查
使用了goto語句
使用了自動程式碼合併
沒有開啟編譯器對死程式碼的'警告
沒有使用靜態分析工具
沒有好好測試
所有的這些原因看起來都像是在這個bug的產生中扮演了一定的角色。但有一個主導原因嗎?
對程式碼的差異對比給不了多少有用的資訊,在631行上的這個bug看起來怎麼產生的都有可能。也許是一次程式碼合併錯誤,也許是愚蠢的拷貝/貼上造成。
事實上,你很難,或許不可能找到一個單一的為此bug負責的原因,那我們能有什麼良方?很多人說是指程式碼上沒有用花括號包圍的原因。例如Zed說:
這就是帕金森碎定理的一個很好的例子:花費大量時間討論無關緊要的瑣事。引起這個bug的根源不是缺少花括號。有沒有花括號不會成為這個多餘的goto的產生的原因。
為什麼我們,程式設計師們,總是抱怨編碼風格問題,但卻不重視程式碼審查對程式正確性的決定作用呢?雖然不好的編碼風格會隱藏程式bug,但並不是編碼風格產生的問題。我們太重視程式碼佈局視覺上的問題,卻故意逃避正確性問題。如果更注重正確性,絕對不可能讓這種關鍵程式碼中未經測試的情況下發布。
好的編碼風格並不能防止大部分的bug的產生儘管有點作用。簡單的程式語言能夠減少bug的產生。程式碼審查的作用更大。靜態分析能讓你避免大量的bug。
認真的測試可以捕捉並防止很多bug的產生。這就是為什麼對於關鍵的軟體,比如cryptography library,有100%的測試覆蓋率。這種一眼就能看出來的bug絕對不會在這種軟體裡出現。
未經測試的加密程式碼是用來解密的程式碼。
所以說,抱怨花括號是愚蠢的做法。相反,在這種情況下花括號會讓問題更難發現,花括號不是問題的根源,也不是問題的解決方案。大家找錯了方向。
-
解讀計算機軟體開發技術與設計論文
隨著現代科學技術的發展與計算機的普及,各行各業以及人們的日常生活都離不開計算機的應用,可以說計算機的出現將現代社會推進了一個新高度,計算機的應用與發展給人們的生活帶來了方便,比如工業企業等檔案傳輸,生活中的遊戲娛樂,以及資源資訊共享等。計算機快速發展的...
-
計算機軟體實習報告精選5篇
在我們平凡的日常裡,報告的使用成為日常生活的常態,其在寫作上具有一定的竅門。寫起報告來就毫無頭緒?以下是小編為大家整理的計算機軟體實習報告,歡迎大家借鑑與參考,希望對大家有所幫助。計算機軟體實習報告1對計算機有了更具體認識,透過對計算機的具體操作和親自...
-
計算機軟體使用許可合同(彙編6篇)
隨著法治精神地不斷髮揚,人們愈發重視合同,合同在生活中的使用越來越廣泛,簽訂合同也是避免爭端的最好方式之一。相信很多朋友都對擬合同感到非常苦惱吧,下面是小編收集整理的計算機軟體使用許可合同,歡迎閱讀,希望大家能夠喜歡。計算機軟體使用許可合同1答應方:_____...
-
關於計算機軟體專業求職信六篇
光陰如水,我們又將開啟新的篇章,尋求新的工作機會,你的求職信寫好了嗎?求職信怎麼寫才能具有特色?下面是小編收集整理的計算機軟體專業求職信6篇,僅供參考,大家一起來看看吧。計算機軟體專業求職信篇1尊敬的**公司領導:您好!感謝您能百忙之中關注我的個人求職信。我是一...