|
1 背景 —— C 的使用和問題
1.1 汽車工業中C 的使用
MISRA-C:1998 [1] 發布于1998 年。本文檔是它的修訂版本,用來解決與第一版本有關系的問題。
在汽車工業領域的實時嵌入式應用中,C 編程語言的使用越來越體現出廣泛性和重要性。這在相當程度上取決于該語言固有的靈活性、可支持的范圍及其潛在的訪問廣泛硬件環境的可移植性。詳細的理由包括:
- 對于許多使用中的微處理器來說,如果存在其他除了匯編語言之外的可用語言,通常就是C。在許多情況下,其他語言根本就不可用于硬件。
- C 對高速、底層、輸入/輸出操作等提供了很好的支持,而這些特性是許多汽車嵌入式系統的基本特性。
- 由于應用的逐步增長的復雜性,高級語言的使用較匯編語言更為適合。
- 相對于其他一些高級語言,C 能夠產生較小的和較少RAM 密集性(RAM-intensive)的代碼。
- 增長的可移植性需求。市場競爭要求在工程項目生命周期的任何階段,軟件可以通過移植到新的和/或低成本的處理器,目的是為了降低硬件成本。
- 增長的自動產生 C 代碼的使用要求。C 代碼需要從模型包中自動產生。
- 增長的對開放系統和主機環境(hosted enviroments)的興趣。
1.2 語言的不安全性和C 語言
沒有哪種編程語言能夠保證最終的可執行代碼會準確地按照程序員預想的那樣執行。任何語言都會產生大量的問題,下面為其做了廣泛的分類,并描述了C 語言不安全性的例子。
1.2.1 程序員產生錯誤
程序員產生的錯誤,簡單的可以是變量名字的書寫錯誤,或者更為復雜的錯誤,如對算法的誤解。編程語言可以承受這樣的錯誤。首先,語言的風格和表達能幫助或提示程序員清晰考慮其算法。其次,對于書寫錯誤,語言可以使從一個有效結構向另一個有效(不是預想的)結構的轉換變得輕松或困難。第三,當錯誤發生時,語言可以檢測到也可能檢測不到。
首先,關于語言的風格和表達,使用 C 可以編寫出良好布局的、結構化的和表達性強的代碼。還可以使用它編寫出不正當的和特別難以理解的代碼。很明顯,后者對于安全相關的系統是不可接受的。
其次,C 的語法特性足以使得書寫錯誤也能產生完全有效的代碼。例如,在“==”(邏輯比較)的地方寫成“=”(賦值)是很常見的,而且最終結果也幾乎總是有效的(但它是錯誤的);而if 語句的結尾出現的多余分號能完全改變代碼邏輯。
第三,C 的基本觀點是假設程序員知道他們在做什么,這意味著錯誤即使出現也不會被語言注意到而通過。在這方面C 體現出的軟弱性正在于它的“書寫檢查”(type checking)。舉例來說,C 不會拒絕程序員在使用整數代表true/false 值時卻在該整數中存儲了浮點值。大多數這樣的失配可以簡單地通過強制使其合適。如果C 的表現不得其所(a square peg and a round),它不會挑剔而會適合它們!
1.2.2 程序員不了解語言
程序員可能會誤解語言構造的作用。對這樣的誤解,一些語言是更為開放的。
C 語言中有相當多的地方能使程序員輕易產生誤解。例如運算符優先級的規則。這些規則是良好定義的,但也非常復雜,也很容易對某特定表達式中運算符的優先級做出錯誤的假設。
|
評分
-
查看全部評分
|