靜態分析工具可以幫助找到并發性和其他缺陷,以減少遺留的延遲。
從基于軟件的舊系統遷移到新技術時,能夠重用盡可能多的代碼非常重要。即使這些代碼已經過徹底的測試,并且在舊系統中的實踐中被證明是可靠的,它仍然可能包含潛在的錯誤。這些錯誤可能從未在舊系統中觸發,因為該系統非常特定的屬性,例如用于編譯代碼的工具鏈、處理器體系結構或主機操作系統。當移植到這些屬性不同的新系統時,潛在缺陷可能表現為有害錯誤。但好消息是,先進的靜態分析工具可以清除這些潛在的缺陷,以幫助應對挑戰。
更新系統,揭示編碼缺陷
遷移遺留系統最重要的動機之一是利用自原始系統首次部署以來硬件技術的進步。由于采用了更新更快的處理器,最常見的好處可能是性能提高。從代碼的角度來看,這也是一個最重要的變化。新處理器可以具有不同的位寬或字節序,并且可用內核的數量可以不同。在從舊平臺移植到下一個平臺的代碼期間,大部分重新編碼工作將用于使代碼適應這些差異。
編譯器、工具鏈和潛在錯誤
與實現新處理器相比,還有許多其他不太明顯的差異,這些細微差別很容易被忽視。以用于編譯代碼的工具鏈為例。從表面上看,這應該不會有太大區別。畢竟,如果代碼是編寫為符合 ANSI C 標準,并且如果編譯器聲稱支持 ANSI C,那么當由任一編譯器編譯時,代碼肯定會具有相同的語義嗎?不幸的是不是。C 和 C++ 標準充斥著“編譯器依賴”的子句,這意味著該標準并不確切規定如何編譯某些結構,選擇取決于編譯器編寫者。其中許多對于程序員來說是顯而易見和眾所周知的,例如計算操作數的順序,但其他的則非常微妙。潛在錯誤在舊系統上可能是無害的,因為編譯器選擇以特定方式編譯它,但在新系統上是危險的,因為新編譯器會做出不同的選擇。
當然,編譯器也是程序,它們本身并非沒有缺陷。最近一項針對 C 編譯器的研究發現,他們測試的每個編譯器都有代碼生成缺陷[1]。易失性關鍵字的處理在嵌入式安全關鍵型軟件中至關重要,因為它經常用于讀取傳感器數據,特別容易出現編譯器錯誤,從而導致傳感器值的更改被靜默忽略。程序的正確運行甚至可能依賴于這些缺陷。
另一個危險區域:標準庫
另一個可能導致潛在缺陷變得危險的細微軟件遷移差異涉及與操作系統接口的標準庫。人們可能希望這樣的庫在各個平臺上保持一致,但這種情況很少見。最顯著的區別是在錯誤處理方面。新平臺可能具有與舊平臺完全不同的故障模式,可能需要更改代碼才能處理這些差異。更糟糕的是,根據最近的一項研究,錯誤案例的記錄似乎非常糟糕[2]。
靜態分析勝出,補充傳統測試
顯然,任何遺留遷移項目都必須包括大量時間來測試軟件的新版本。但是,測試結果僅與測試輸入一樣好。如果測試用例未能執行發生錯誤的路徑,則該缺陷可能無法檢測到。生成新的測試用例也很昂貴。因此,清除這些潛在缺陷的明智策略是使用高級靜態分析工具作為遺留轉換工作的一部分。此類工具能夠發現本文所述的缺陷,包括那些依賴于平臺微妙之處的缺陷。他們特別擅長發現并發缺陷,例如使用傳統測試方法極難發現的數據爭用。他們還擅長查找代碼實例,這些代碼雖然不是絕對錯誤的,但與錯誤高度相關,或者在移植到不同環境時特別危險。
審核編輯:郭婷
-
處理器
+關注
關注
68文章
19409瀏覽量
231189 -
編譯器
+關注
關注
1文章
1642瀏覽量
49286
發布評論請先 登錄
相關推薦
評論