事後諸葛亮:如何寫出沒有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絕對不會在這種軟件裏出現。
未經測試的加密代碼是用來解密的代碼。
所以説,抱怨花括號是愚蠢的做法。相反,在這種情況下花括號會讓問題更難發現,花括號不是問題的根源,也不是問題的解決方案。大家找錯了方向。
-
計算機軟件著作權代理合同通用4篇
隨着人們法律觀念的日益增強,合同出現的次數越來越多,它也是實現專業化合作的紐帶。知道嗎,寫合同可是有方法的哦,以下是小編精心整理的計算機軟件著作權代理合同,供大家參考借鑑,希望可以幫助到有需要的朋友。計算機軟件著作權代理合同1委託人(甲方):被委託人(乙方):甲乙...
-
計算機軟件著作權登記合同3篇
在當今不斷髮展的世界,關於合同的利益糾紛越來越多,在達成意見一致時,制定合同可以享有一定的自由。那麼大家知道正規的合同書怎麼寫嗎?以下是小編為大家整理的計算機軟件著作權登記合同,歡迎閲讀與收藏。計算機軟件著作權登記合同1甲方(委託人):_________________地...
-
計算機軟件專業求職信集合
日子在彈指一揮間就毫無聲息的流逝,我們將帶着新的期許,開啟新一輪的求職,感覺我們很有必要寫求職信了。寫求職信需要注意哪些問題呢?以下是小編為大家收集的計算機軟件專業求職信集合,歡迎大家借鑑與參考,希望對大家有所幫助。計算機軟件專業求職信集合1尊敬的領導:...
-
計算機軟件對平面設計的重要性以及優勢
計算機軟件對平面設計的重要性以及優勢平面設計包含了廣告設計、動畫設計、網頁設計、包裝設計、書籍設計等多個方面的內容。通過平面設計,設計師可以通過各種視覺元素的組合來把信息和構思傳遞給大眾。成功的平面設計作品,能夠在順利傳遞信息的同時,表現出一種感...