http://www.kadhoai.com.cn 2026-04-06 22:02:57 來源: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。
suirankeyiduiyanfaguochengjinxingdaliangdeweitiaoyijiakuaininderenzheng,danyiqiexiandaidianzixinxixitongdoucongruanjianjidaimazhiliangkaishi。danruhenenggouquebaodaimazhiliangne?xingyundeshi,shiyongyixiejiandandefangfa,keyijihulijitishengnindedaimazhiliang,bingjinkenengdijianshaotongku。
從標準中獲得幫助
作為一家產品被全球近五萬家企業/機構采用的嵌入式開發工具提供商,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。
怎樣才能破解這個難題呢?簡短的答案是,避免模棱兩可的情況出現在您的代碼中。但如何做到這一點呢?使用像MISRA這zhe樣yang的de編bian碼ma標biao準zhun可ke以yi快kuai速su解jie決jue這zhe個ge難nan題ti,因yin為wei這zhe些xie標biao準zhun就jiu是shi為wei了le讓rang您nin避bi免mian掉diao入ru代dai碼ma中zhong那na些xie常chang見jian類lei型xing的de陷xian阱jing。這zhe些xie標biao準zhun還hai倡chang導dao編bian碼ma要yao安an全quan可ke靠kao,以yi減jian少shao您nin代dai碼ma中zhong的de漏lou洞dong數shu量liang。但dan是shi,怎zen樣yang才cai能neng確que保bao我wo們men遵zun循xun這zhe些xie標biao準zhun呢ne?幸xing運yun的de是shi,功gong能neng安an全quan標biao準zhun提ti供gong了le一yi種zhong方fang法fa。
標準需要代碼分析
幾乎每一個功能安全標準都需要您對您的代碼進行靜態分析,並且強烈建議您對您的代碼進行運時(或動態)分析。這些標準中影響最廣的是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開發工具來完成其各種嵌入式項目,通過與其中許多“高手”開發人員溝通發現:如果您能在開發過程中進行代碼分析--在正式構建之前--那麼漏洞就像是從來沒有過一樣。您項目的漏洞會比較低,這正是認證機構想要的,因為這意味著您有一個非常成熟的開發組織。
讓代碼分析成為日常工作流程的一部分
IARdegongchengshimenjianguoxuduolaizigexinggeyedegongsi,womenzhuyidaodeshi,peizhiqilaiyuerongyishiyongdedaimafenxigongjuyuejiandan,kaifarenyuanjiugengyoukenengshiyongtamen,zheyangnenggoubangzhukaifarenyuangengkuaiwanchengxiangmushixianchanpinshangshi。rangzhexiezidonghuagongjuchengweikaifazhegongjuxiangdeyibufen,yiweizheninkeyizaibianxieyingyongchengxushijianzhahegaijindaimazhiliang,tongshikeyizai“區域”內(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)目標?答案是 “非常快”。僅jin僅jin是shi看kan測ce試shi節jie省sheng下xia來lai的de時shi間jian和he金jin錢qian,即ji可ke發fa現xian對dui代dai碼ma分fen析xi工gong具ju的de投tou資zi就jiu是shi值zhi得de的de,更geng不bu用yong說shuo縮suo短duan產chan品pin上shang市shi周zhou期qi省sheng下xia的de時shi間jian。這zhe些xie都dou是shi功gong能neng安an全quan認ren證zheng機ji構gou喜xi歡huan看kan到dao的de流liu程cheng類lei型xing,因yin為wei它ta極ji大da地di降jiang低di了le最zui終zhong產chan品pin仍reng然ran含han有you漏lou洞dong的de風feng險xian。
高質量的代碼讓您在通往功能安全的道路上快速前進
加(jia)快(kuai)功(gong)能(neng)安(an)全(quan)認(ren)證(zheng)之(zhi)路(lu)的(de)關(guan)鍵(jian)是(shi)提(ti)高(gao)代(dai)碼(ma)質(zhi)量(liang)。提(ti)高(gao)代(dai)碼(ma)質(zhi)量(liang),可(ke)以(yi)降(jiang)低(di)您(nin)的(de)產(chan)品(pin)漏(lou)洞(dong)率(lv),這(zhe)意(yi)味(wei)著(zhe)可(ke)以(yi)更(geng)快(kuai)地(di)達(da)到(dao)軟(ruan)件(jian)發(fa)布(bu)標(biao)準(zhun),讓(rang)您(nin)的(de)開(kai)發(fa)組(zu)織(zhi)在(zai)功(gong)能(neng)安(an)全(quan)認(ren)證(zheng)機(ji)構(gou)看(kan)來(lai)非(fei)常(chang)成(cheng)熟(shu)。雖(sui)然(ran)您(nin)永(yong)遠(yuan)不(bu)可(ke)能(neng)確(que)切(qie)地(di)知(zhi)道(dao)一(yi)個(ge)應(ying)用(yong)程(cheng)序(xu)中(zhong)還(hai)有(you)多(duo)少(shao)漏(lou)洞(dong),但(dan)盡(jin)早(zao)地(di)多(duo)使(shi)用(yong)代(dai)碼(ma)分(fen)析(xi)工(gong)具(ju)可(ke)以(yi)減(jian)少(shao)漏(lou)洞(dong)的(de)數(shu)量(liang)。