C++在嵌入式應用中的安全問題
嵌入式系統(tǒng)的軟件設計中,“匯編語言+C語言”早已成為理所當然的經(jīng)典組合。的確,對于硬件配置來說,匯編語言清晰明了;對于上層設計來說,C語言緊湊高效。這樣的搭配能夠滿足大多數(shù)傳統(tǒng)嵌入式系統(tǒng)應用的需要。隨著技術水平的提高,今天的嵌入式系統(tǒng)也比過去更加深入到人們的日常生活中,大到汽車、飛機、火箭,小到手機、打印機、鬧鐘、手表,都可以找到嵌入式系統(tǒng)的蹤影。然而,這看似一成不變的情況,也在悄然轉變。隨著網(wǎng)絡、多媒體等技術的出現(xiàn)、發(fā)展與普及,對嵌入式系統(tǒng)應用有了新的要求,也給了其他高級語言,特別是C++語言以機會。
本文引用地址:http://m.butianyuan.cn/article/150695.htm由此帶來的在語言使用中的安全問題,目前雖然還未凸顯,但根據(jù)以往的經(jīng)驗來看,終將成為限制行業(yè)發(fā)展的新瓶頸。已有的C++語言國際標準雖然龐大細致,但作為一個“語言標準”,只能是盡力做得面面俱到,其目標在于構造一個語句合法性的權威依據(jù),以約束人們對于C++的使用。但它并不是針對應用而寫的規(guī)范,對于可能遇到的安全性問題也無法進行特別深入的探討,更加沒有安全方面的實踐經(jīng)驗支撐。一個針對安全方面的、被國際所認可的使用規(guī)范,無疑是C++語言在嵌入式系統(tǒng)中得到廣泛應用的堅實基礎與助推劑。
1 C++在嵌入式應用中的機遇與挑戰(zhàn)
C++作為一門高級語言,人們在提及它時,總難免會談到C語言。直至今天,很多人對于C++語言的認識依然是“C語言的超集”。這是因為C++的起源與C語言有著千絲萬縷的聯(lián)系。
1978年,美國貝爾實驗室的Dennis Ritchie和BrianKernighan在BCPL以及其簡化版本B語言的基礎之上開發(fā)了C語言,并合作出版了《The C Programming Lan-guage》。C語言迅速得到了大家的認可,并廣為流傳。1989年,ANSI推出了第一個C語言的標準——X3.159-1989,并被ISO采納,隨之發(fā)布。ISO/IEC 9899-1990。早在C語言標準發(fā)布之前,貝爾實驗室的Bjarne Stroustrup就致力于在C語言里增加類、函數(shù)類型檢查以及其他的一些優(yōu)秀特征,于1980年發(fā)布“C with Classes”。經(jīng)過持續(xù)的努力,他最終完成了對C語言的改造,由此創(chuàng)生出一門新語言——C++,并出版了《The C++ ProgrammingLanguage》一書。由于它帶來了持續(xù)的影響,ISO于1998年發(fā)布ISO/IEC 14882:1998;幾乎同一時間,ANSI也發(fā)布了類似標準,這標志著C++作為一門獨立語言的標準化得到了官方的認可。
統(tǒng)計數(shù)據(jù)表明,日常生活中一個美國人平均占用8個微控制器,這些都離不開嵌入式系統(tǒng)的應用。然而嵌入式系統(tǒng)軟件技術似乎落后于當前的軟件發(fā)展形勢,近年來才逐漸由匯編語言過渡到面向過程的C語言。但對于面向?qū)ο笳Z言的應用還很有限。
這一方面是由于嵌入式開發(fā)人員多年來應付有限資源的經(jīng)驗而養(yǎng)成的保守態(tài)度,另一方面也是由于長久以來,嵌入式系統(tǒng)應用設計中,人們要花費許多精力在底層硬件的驅(qū)動上,功能實現(xiàn)也主要局限在實時操作系統(tǒng)和相關支撐軟件的層次,并不涉及過多的應用軟件開發(fā)。這種在嚴苛條件下追求效率與實時性的任務,其他的高級語言并沒有特別的優(yōu)勢。
最近幾年,嵌入式系統(tǒng)領域又有了新的發(fā)展。首先,隨著手機、PDA等消費性電子產(chǎn)品的飛速增長,嵌入式系統(tǒng)的市場規(guī)模在迅速擴大,同時越來越多的智能嵌入式應用場合需要互聯(lián)網(wǎng)的支持,這要求嵌入式系統(tǒng)的軟件具有更好的應用性和更高的復雜性;其次,隨著芯片等相關領域的技術進步,嵌入式系統(tǒng)工程師們不再需要時時刻刻去考慮資源是否夠用了。當面向?qū)ο蟮母呒壵Z言參與到嵌入式系統(tǒng)設計中去不再遙不可及時,語言的效率則成為突出的問題。根據(jù)《Thinking in C++》一書的總結,C++與C的效率差別往往在±5%,這使得C++在新一輪的嵌入式應用發(fā)展浪潮中占得先機。
值得注意的是,盡管自1998年發(fā)布最初的C++標準——ISO/IEC 14882:1998以來,每5年都會對此標準進行一次更新,但是由于C++語言過于復雜,以及它經(jīng)歷了長年的演變,直到2004年,沒有任何一款編譯器完全支持ISO C++。這對于時常要面對各種嚴苛條件的嵌入式系統(tǒng)應用工程師們來說,是難以忍受的。同時,即使是符合ISO C++標準的語句或者格式,對于實際的應用場合來說,也存在著重大隱患,而不應當被直接采用。因此,人們迫切需要一個正式的基于安全角度考慮的C++語言使用規(guī)范。
2 關于MISRA
MISRA(the Motor Industry Software Reliability As-sociation),即汽車工業(yè)軟件可靠性協(xié)會,于1994.年在英國成立,以“協(xié)助汽車工業(yè)提供安全、可靠的軟件”為使命,期望通過“規(guī)范指南”的形式來約束人們在汽車電子以及其他嵌入式系統(tǒng)開發(fā)領域或涉及安全與可靠性的領域中對于程序語言的使用。由于這些“規(guī)范指南”都是從大量工程實踐中總結的第一手經(jīng)驗,因而具有極高的指導意義。
經(jīng)過4年準備,它在1998年發(fā)布了一個針對汽車工業(yè)的《Guidelines for the Use of the C Langtlage in VehicleBased Software》,簡稱“MISRA C:1998'’,針對那些滿足C語言標準,卻存在安全隱患的語言使用習慣,提出了127條規(guī)則。由于它很好地解決了C語言國際標準的冗繁性,以及其中對于安全性考慮的不足性,從而得到了廣泛的好評。MISRA-C不僅成為眾多汽車廠商推崇的行業(yè)標準,其影響力更是遠遠超出了汽車工業(yè),得到鐵路、航空航天、國防、醫(yī)療等眾多領域的認可,成為“最佳實踐”解決方案。2004年,MISRA對于已有的規(guī)則進行改編與擴充,推出了“MISRA C 2004”,首次將該規(guī)范指南的對象從汽車工業(yè)推廣到所有具有安全性要求的系統(tǒng)應用中去,包含了強制規(guī)則121條,推薦規(guī)則20條,并刪除了15條舊規(guī)則,共計含有141條規(guī)則。
時至今日,MISRA組織不僅是汽車工業(yè)軟件規(guī)范的權威,其制定的規(guī)范指南更得到了嵌入式系統(tǒng)應用領域的廣泛認可??紤]到近年來,C++語言在嵌入式系統(tǒng)中的應用越來越多,2005年MISRA C++委員會成立,并于2008年推出針對C++語言的《MISRA C++:2008——Guidelines for the USe of the C++ language in critical sys-tems>>,以下簡稱“MISRA C++:2008”。有興趣的讀者可以聯(lián)系相關網(wǎng)站:http://www.misra-cpp.com/,購買詳細的文檔。
MISRA C++:2008同樣從推出之日起,就得到了業(yè)內(nèi)外廣泛關注。例如:LDRA軟件公司一直跟蹤著MIS-RA C++:2008的制定進展,在MISRA C++:2008發(fā)布時同步宣稱已經(jīng)完成了對工具套件產(chǎn)品的相應改進,使其符合MISRA C++:2008標準。(LDRA的Testbed產(chǎn)品曾成功用于“神舟”飛船項目的軟件測試)
3 MISRA C++概述
作為規(guī)范指南,MISRA C++:2008基于ISO/IEC 14882:2003的C++語言國際標準,以規(guī)則(rule)的形式,給出了相關的建議。它的規(guī)則又細分為以下3種類型:
①強制型(required),必須符合、允許例外;
②推薦型(advisory),推薦符合;
?、鄄蝗萦懻撔?document),必須符合、不許例外。
MISRA C++:2008中共給出了20個大類的規(guī)則(編號并不連續(xù)),細分為228條。詳細情況如表1所列。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論