http://kadhoai.com.cn 2026-04-25 06:05:08 來源:IAR
近年來,國內電子公司和芯片設計企業大舉進攻汽車、醫療和工業等高可靠應用(mission-critical)領域,為自己找到了擺脫紅海的新領域。但是高可靠應用多數都需要功能安全認證,在許多行業在諸如汽車、航空電子、醫(yi)療(liao)和(he)工(gong)業(ye)控(kong)製(zhi)等(deng)行(xing)業(ye),是(shi)很(hen)常(chang)見(jian)甚(shen)至(zhi)是(shi)必(bi)須(xu)的(de)工(gong)作(zuo)。這(zhe)些(xie)認(ren)證(zheng)通(tong)過(guo)必(bi)要(yao)的(de)流(liu)程(cheng)和(he)測(ce)試(shi)來(lai)填(tian)寫(xie)功(gong)能(neng)安(an)全(quan)清(qing)單(dan),一(yi)直(zhi)以(yi)來(lai)都(dou)是(shi)一(yi)個(ge)非(fei)常(chang)困(kun)難(nan)的(de)事(shi)情(qing),但(dan)有(you)一(yi)些(xie)方(fang)法(fa)可(ke)以(yi)加(jia)快(kuai)您(nin)的(de)認(ren)證(zheng)。
雖(sui)然(ran)可(ke)以(yi)對(dui)研(yan)發(fa)過(guo)程(cheng)進(jin)行(xing)大(da)量(liang)的(de)微(wei)調(tiao)以(yi)加(jia)快(kuai)您(nin)的(de)認(ren)證(zheng),但(dan)一(yi)切(qie)現(xian)代(dai)電(dian)子(zi)信(xin)息(xi)係(xi)統(tong)都(dou)從(cong)軟(ruan)件(jian)即(ji)代(dai)碼(ma)質(zhi)量(liang)開(kai)始(shi)。但(dan)如(ru)何(he)能(neng)夠(gou)確(que)保(bao)代(dai)碼(ma)質(zhi)量(liang)呢(ne)?幸(xing)運(yun)的(de)是(shi),使(shi)用(yong)一(yi)些(xie)簡(jian)單(dan)的(de)方(fang)法(fa),可(ke)以(yi)幾(ji)乎(hu)立(li)即(ji)提(ti)升(sheng)您(nin)的(de)代(dai)碼(ma)質(zhi)量(liang),並(bing)盡(jin)可(ke)能(neng)地(di)減(jian)少(shao)痛(tong)苦(ku)。
從標準中獲得幫助
作為一家產品被全球近五萬家企業/機構采用的嵌入式開發工具提供商,IAR的研發工程師評估在C99中,代碼規範中有大約190種模棱兩可之處。也就是在C99中,有190種不同的合乎句法的C結構,在C語言規範中沒有明確說明。實際上,進入C18,情況會變得有一點糟糕,在C++中(zhong),情(qing)況(kuang)會(hui)更(geng)加(jia)糟(zao)糕(gao),這(zhe)裏(li)需(xu)要(yao)引(yin)入(ru)多(duo)繼(ji)承(cheng)和(he)虛(xu)擬(ni)繼(ji)承(cheng)的(de)概(gai)念(nian)。當(dang)然(ran),編(bian)譯(yi)器(qi)必(bi)須(xu)把(ba)您(nin)的(de)源(yuan)代(dai)碼(ma)變(bian)成(cheng)具(ju)體(ti)的(de)代(dai)碼(ma),所(suo)以(yi)它(ta)必(bi)須(xu)對(dui)代(dai)碼(ma)的(de)含(han)義(yi)選(xuan)擇(ze)一(yi)種(zhong)解(jie)釋(shi),然(ran)後(hou)用(yong)它(ta)來(lai)運(yun)行(xing)。
這在實踐中意味著,您可以得到不同的編譯器,它們對源代碼有不同的解釋。在一個高可靠的係統中,這是一個如同噩夢般的場景;特te別bie是shi由you於yu許xu多duo公gong司si為wei了le追zhui求qiu盡jin快kuai通tong過guo功gong能neng安an全quan認ren證zheng,為wei了le方fang便bian測ce試shi在zai多duo個ge平ping台tai上shang交jiao叉cha編bian譯yi他ta們men的de代dai碼ma。可ke以yi想xiang象xiang,這zhe對dui您nin獲huo得de認ren證zheng的de時shi間jian會hui有you多duo麼me非fei常chang糟zao糕gao的de影ying響xiang,因yin為wei您nin不bu得de不bu圍wei繞rao所suo有you這zhe些xie情qing況kuang進jin行xing測ce試shi,以yi證zheng明ming代dai碼ma的de可ke重zhong複fu性xing和he可ke靠kao性xing。
怎樣才能破解這個難題呢?簡短的答案是,避免模棱兩可的情況出現在您的代碼中。但如何做到這一點呢?使用像MISRAzheyangdebianmabiaozhunkeyikuaisujiejuezhegenanti,yinweizhexiebiaozhunjiushiweilerangninbimiandiaorudaimazhongnaxiechangjianleixingdexianjing。zhexiebiaozhunhaichangdaobianmayaoanquankekao,yijianshaonindaimazhongdeloudongshuliang。danshi,zenyangcainengquebaowomenzunxunzhexiebiaozhunne?xingyundeshi,gongnenganquanbiaozhuntigongleyizhongfangfa。
標準需要代碼分析
幾乎每一個功能安全標準都需要您對您的代碼進行靜態分析,並且強烈建議您對您的代碼進行運時(或動態)分析。這些標準中影響最廣的是IEC 61508,涵蓋了一般與安全相關的係統。在該標準的C.4.2這一節中,對於安全完整性等級(SIL)1以上的產品,不建議使用沒有消除模棱兩可和危險行為的編碼標準的C語言。
換句話說,如果您想為您的產品獲得SIL 2-4等級的認證,您必須使用靜態分析來讓您的代碼更加穩固。這是為什麼呢?這些靜態分析工具可以迫使開發者實施諸如MISRA的de編bian碼ma標biao準zhun。此ci外wai,靜jing態tai和he運yun時shi分fen析xi可ke以yi幫bang助zhu您nin提ti高gao代dai碼ma質zhi量liang,快kuai速su指zhi出chu您nin何he時shi的de編bian碼ma行xing為wei是shi有you風feng險xian的de,特te別bie是shi存cun在zai上shang述shu編bian碼ma標biao準zhun中zhong模mo棱leng兩liang可ke的de情qing況kuang。
然而,當您使用這類自動化工具時,也會對您的認證時間線產生巨大影響。許多組織使用難以配置、難nan用yong的de代dai碼ma分fen析xi工gong具ju,這zhe些xie工gong具ju在zai構gou建jian服fu務wu器qi上shang運yun行xing,作zuo為wei每mei日ri構gou建jian的de一yi部bu分fen。這zhe對dui您nin的de幫bang助zhu並bing不bu是shi很hen大da,因yin為wei個ge體ti開kai發fa者zhe並bing沒mei有you得de到dao即ji時shi的de反fan饋kui,他ta們men並bing不bu知zhi道dao自zi己ji剛gang剛gang寫xie的de代dai碼ma有you什shen麼me問wen題ti。此ci外wai,有you時shi這zhe些xie工gong具ju發fa出chu的de警jing告gao信xin息xi是shi難nan以yi理li解jie的de,開kai發fa者zhe們men要yao弄nong清qing楚chu是shi什shen麼me意yi思si,以yi及ji怎zen樣yang修xiu正zheng代dai碼ma才cai能neng讓rang警jing告gao消xiao失shi,這zhe浪lang費fei了le他ta們men的de時shi間jian。
換句話說,安全性認證不是要突出項目的優點(高性能),而是要盡量找出項目的弱點(漏洞),所以要盡可能地選用被最大量開發人員群體驗證過的開發工具,或者是“見多識廣”的開發工具係統。全球有超過15萬開發人員在使用IAR提供的IAR Embedded Workbench開發工具來完成其各種嵌入式項目,通過與其中許多“高手”開發人員溝通發現:如果您能在開發過程中進行代碼分析--在正式構建之前--那麼漏洞就像是從來沒有過一樣。您項目的漏洞會比較低,這正是認證機構想要的,因為這意味著您有一個非常成熟的開發組織。
讓代碼分析成為日常工作流程的一部分
IAR的de工gong程cheng師shi們men見jian過guo許xu多duo來lai自zi各ge行xing各ge業ye的de公gong司si,我wo們men注zhu意yi到dao的de是shi,配pei置zhi起qi來lai越yue容rong易yi使shi用yong的de代dai碼ma分fen析xi工gong具ju越yue簡jian單dan,開kai發fa人ren員yuan就jiu更geng有you可ke能neng使shi用yong它ta們men,這zhe樣yang能neng夠gou幫bang助zhu開kai發fa人ren員yuan更geng快kuai完wan成cheng項xiang目mu實shi現xian產chan品pin上shang市shi。讓rang這zhe些xie自zi動dong化hua工gong具ju成cheng為wei開kai發fa者zhe工gong具ju箱xiang的de一yi部bu分fen,意yi味wei著zhe您nin可ke以yi在zai編bian寫xie應ying用yong程cheng序xu時shi檢jian查zha和he改gai進jin代dai碼ma質zhi量liang,同tong時shi可ke以yi在zai“區域”內(nei)了(le)解(jie)這(zhe)部(bu)分(fen)代(dai)碼(ma)要(yao)做(zuo)什(shen)麼(me)以(yi)及(ji)它(ta)如(ru)何(he)與(yu)係(xi)統(tong)中(zhong)的(de)其(qi)他(ta)模(mo)塊(kuai)進(jin)行(xing)交(jiao)互(hu)。為(wei)了(le)有(you)效(xiao)地(di)做(zuo)到(dao)這(zhe)一(yi)點(dian),這(zhe)些(xie)工(gong)具(ju)必(bi)須(xu)被(bei)整(zheng)合(he)到(dao)日(ri)常(chang)工(gong)作(zuo)流(liu)程(cheng)中(zhong)。
在瀏覽其他人對整合代碼分析的看法時,IAR的工程師發現穀歌在ACM出版物上發表了一篇文章,探討了代碼分析的優點。雖然文章對他們的整個代碼庫,包括C、C++和Java進行了全麵的考察,但他們的結果非常明確:
“在開發過程的早期就能發現編譯器錯誤,並且能夠整合到開發人員的工作流程中。我們發現擴大編譯器的檢查集對提高 Google的代碼質量是有效的。”
作zuo者zhe說shuo,將jiang靜jing態tai分fen析xi檢jian查zha整zheng合he到dao編bian譯yi器qi工gong作zuo流liu程cheng中zhong,並bing使shi其qi作zuo為wei錯cuo誤wu出chu現xian,極ji大da地di提ti高gao了le對dui工gong具ju調tiao查zha結jie果guo的de關guan注zhu度du,這zhe意yi味wei著zhe他ta們men的de代dai碼ma質zhi量liang最zui後hou會hui很hen高gao。再zai往wang下xia看kan,他ta們men談tan到dao了le一yi項xiang調tiao查zha,這zhe項xiang調tiao查zha麵mian向xiang最zui近jin遇yu到dao編bian譯yi器qi錯cuo誤wu以yi及ji已yi經jing收shou到dao修xiu複fu同tong一yi問wen題ti補bu丁ding的de開kai發fa者zhe:
“穀歌開發者認為,在編譯時標記的問題(與已提交的代碼補丁不同)能捕捉到更嚴重的漏洞;例如,編譯過程中標記的問題裏麵有74%被調查參與者認為是‘真正的問題’,相比之下,在已提交的代碼中發現的問題隻有21%。”
文wen章zhang還hai談tan到dao了le將jiang代dai碼ma分fen析xi作zuo為wei工gong作zuo流liu程cheng一yi部bu分fen的de重zhong要yao性xing,指zhi出chu當dang他ta們men通tong過guo靜jing態tai分fen析xi工gong具ju自zi動dong運yun行xing提ti交jiao的de代dai碼ma並bing邀yao請qing工gong程cheng師shi查zha看kan分fen析xi儀yi表biao板ban時shi,很hen少shao有you工gong程cheng師shi跟gen進jin到dao底di。在zai編bian譯yi過guo程cheng中zhong的de即ji時shi反fan饋kui讓rang靜jing態tai分fen析xi使shi用yong起qi來lai更geng簡jian單dan,也ye更geng難nan被bei忽hu視shi。因yin此ci,他ta們men選xuan擇ze在zai每mei個ge人ren的de工gong作zuo流liu程cheng中zhong默mo認ren加jia入ru靜jing態tai分fen析xi。穀gu歌ge團tuan隊dui認ren為wei,代dai碼ma分fen析xi工gong具ju要yao想xiang取qu得de成cheng功gong,一yi定ding要yao讓rang開kai發fa人ren員yuan感gan覺jiao到dao他ta們men用yong了le這zhe些xie工gong具ju,並bing從cong中zhong受shou益yi,並bing且qie很hen享xiang受shou用yong這zhe些xie工gong具ju。
但(dan)是(shi),在(zai)工(gong)作(zuo)流(liu)程(cheng)中(zhong)加(jia)入(ru)代(dai)碼(ma)分(fen)析(xi),您(nin)期(qi)望(wang)看(kan)到(dao)什(shen)麼(me)樣(yang)的(de)結(jie)果(guo)呢(ne)?有(you)一(yi)件(jian)事(shi)情(qing)是(shi)可(ke)以(yi)期(qi)望(wang)實(shi)現(xian)的(de),那(na)就(jiu)是(shi)提(ti)高(gao)應(ying)用(yong)程(cheng)序(xu)的(de)整(zheng)體(ti)安(an)全(quan)性(xing),因(yin)為(wei)高(gao)質(zhi)量(liang)代(dai)碼(ma)可(ke)以(yi)消(xiao)除(chu)漏(lou)洞(dong)去(qu)利(li)用(yong)諸(zhu)如(ru)緩(huan)衝(chong)區(qu)溢(yi)出(chu)和(he)非(fei)法(fa)指(zhi)針(zhen)等(deng)機(ji)會(hui),如(ru)該(gai)文(wen)所(suo)述(shu)。雖(sui)然(ran)這(zhe)本(ben)身(shen)就(jiu)是(shi)使(shi)用(yong)代(dai)碼(ma)分(fen)析(xi)的(de)一(yi)個(ge)很(hen)好(hao)的(de)理(li)由(you),但(dan)有(you)時(shi)很(hen)難(nan)說(shuo)服(fu)人(ren)們(men)相(xiang)信(xin)“一針不補,十針難縫”這句格言,您需要更顯著的結果來說服開發者和管理層,讓他們信服代碼分析的好處。
Stefan Wagner等人的一篇論文使用經驗數據來計算代碼分析工具與傳統測試在不同代碼庫上的優勢。他們的結果很有說服力:在769個被識別到的漏洞中,76%是被代碼分析工具發現,隻有4%是在傳統測試中發現,其餘20%在代碼審查中發現。如果能在開始測試前就消除75%的漏洞,那麼能多快地實現軟件的平均故障間隔時間(MTTF)目標?答案是 “非常快”。jinjinshikanceshijieshengxialaideshijianhejinqian,jikefaxianduidaimafenxigongjudetouzijiushizhidede,gengbuyongshuosuoduanchanpinshangshizhouqishengxiadeshijian。zhexiedoushigongnenganquanrenzhengjigouxihuankandaodeliuchengleixing,yinweitajidadijiangdilezuizhongchanpinrengranhanyouloudongdefengxian。
高質量的代碼讓您在通往功能安全的道路上快速前進
jiakuaigongnenganquanrenzhengzhiludeguanjianshitigaodaimazhiliang。tigaodaimazhiliang,keyijiangdinindechanpinloudonglv,zheyiweizhekeyigengkuaididadaoruanjianfabubiaozhun,rangnindekaifazuzhizaigongnenganquanrenzhengjigoukanlaifeichangchengshu。suiranninyongyuanbukenengqueqiedizhidaoyigeyingyongchengxuzhonghaiyouduoshaoloudong,danjinzaodiduoshiyongdaimafenxigongjukeyijianshaoloudongdeshuliang。