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