事後諸葛亮:如何寫出沒有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絕對不會在這種軟件裏出現。
未經測試的加密代碼是用來解密的代碼。
所以說,抱怨花括號是愚蠢的做法。相反,在這種情況下花括號會讓問題更難發現,花括號不是問題的根源,也不是問題的解決方案。大家找錯了方向。
-
計算機軟件專業求職信(13篇)
時間是箭,去來迅疾,我們又將面臨求職找工作的挑戰,此時此刻需要開始寫求職信了哦。那麼如何寫求職信才簡練、明確呢?以下是小編幫大家整理的計算機軟件專業求職信,歡迎大家借鑑與參考,希望對大家有所幫助。計算機軟件專業求職信1尊敬的經理:您好!我的名字叫xx,聽到貴公...
-
(精華)計算機軟件許可協議
在現在社會,很多場合都離不了協議,簽訂協議能夠最大程度的保障自己的合法權利。一般協議是怎麼起草的呢?以下是小編收集整理的計算機軟件許可協議,歡迎大家分享。計算機軟件許可協議1甲方(委託方):乙方(受託方):甲方因涉嫌一案,聘請乙方的律師爲辯護人,經雙方協商,達成...
-
關於計算機軟件開發中的分層技術探討
伴隨着網絡技術的進步,計算機軟件從原有的兩層結構模式逐漸過渡到多層結構模式,並被廣泛地應用在軟件開發工作中。近年來,計算機應用環境日益複雜,多層結構體系應運而生,多層結構體系的應用可簡化軟件系統流程,便於維護擴展工作的開展。1分層技術概述1.1內涵分層技術...
-
win7如何設置ip地址-win7設置ip地址圖文步驟
導語:IP地址是IP協議提供的一種統一的地址格式,它爲互聯網上的每一個網絡和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的'差異。1、點擊開始——控制面板;2、選擇“網絡和Internet”;3、選擇網絡和共享中心;4、然後選擇更改適配器;5、在無線網絡圖標上單擊...