0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MISRA C在安全可靠編程中的地位

星星科技指導(dǎo)員 ? 來(lái)源:嵌入式計(jì)算設(shè)計(jì) ? 作者:Yannick Moy ? 2022-11-23 11:55 ? 次閱讀

C編程語(yǔ)言的普及,以及它的許多陷阱和陷阱,導(dǎo)致了MISRA C在C用于高完整性軟件的領(lǐng)域取得了巨大的成功。這一成功促使工具供應(yīng)商提出了許多MISRA C檢查器的競(jìng)爭(zhēng)實(shí)現(xiàn)。工具在它們幫助執(zhí)行的MISRA C指南的覆蓋范圍上尤其競(jìng)爭(zhēng),因?yàn)椴豢赡軋?zhí)行MISRA C的所有16個(gè)指令和143個(gè)規(guī)則(統(tǒng)稱(chēng)為指南)。

特別是,143 條規(guī)則中有 27 條是不可判定的,因此沒(méi)有工具可以始終檢測(cè)所有違反這些規(guī)則的行為,同時(shí)報(bào)告不構(gòu)成違規(guī)的代碼的“誤報(bào)”。不可判定規(guī)則的一個(gè)例子是規(guī)則1.3:“不得發(fā)生未定義或關(guān)鍵的未指定行為。MISRA C:2012 的附錄 H 列出了 C 編程語(yǔ)言標(biāo)準(zhǔn)中數(shù)百個(gè)未定義和關(guān)鍵未指定行為的案例,其中大多數(shù)無(wú)法單獨(dú)判定。在大多數(shù)情況下,MISRA C 檢查器忽略了不可判定的規(guī)則,例如規(guī)則 1.3,盡管已知違反這些規(guī)則會(huì)對(duì)軟件質(zhì)量產(chǎn)生巨大影響。

但是,對(duì)于其他編程語(yǔ)言,可以使用靜態(tài)分析技術(shù)來(lái)應(yīng)對(duì)這一挑戰(zhàn),而不會(huì)使用戶(hù)誤報(bào)淹沒(méi)。一個(gè)例子是由AdaCore,Altran和Inria開(kāi)發(fā)的SPARK工具集,它基于四個(gè)原則:

基礎(chǔ)語(yǔ)言 Ada 通過(guò)定義明確的語(yǔ)言標(biāo)準(zhǔn)、強(qiáng)大的類(lèi)型化和豐富的規(guī)范功能為靜態(tài)分析提供了堅(jiān)實(shí)的基礎(chǔ)。

Ada 的 SPARK 子集通過(guò)控制歧義來(lái)源(如函數(shù)中的副作用和名稱(chēng)的別名)以基本方式限制基本語(yǔ)言以支持靜態(tài)分析。

靜態(tài)分析工具主要以單個(gè)函數(shù)的粒度工作,使分析更加精確,并最大限度地減少誤報(bào)的可能性。

靜態(tài)分析工具是交互式的,允許用戶(hù)在必要時(shí)或需要時(shí)指導(dǎo)分析,并在用戶(hù)提供的合同無(wú)法證明時(shí)提供反例。

SPARK 可以在 C 代碼庫(kù)中逐步采用,通過(guò)SPARK 采用的五個(gè)級(jí)別以及支持將形式分析 (SPARK) 與傳統(tǒng)的基于測(cè)試的方法 (C) 相結(jié)合的“混合驗(yàn)證”來(lái)逐步獲得保證。

火花石等級(jí) - 基本保證

SPARK采用的第一級(jí)稱(chēng)為石頭級(jí)。它對(duì)應(yīng)于符合 Ada 的 SPARK 子集的代碼。僅采用此級(jí)別即可保證許多無(wú)法對(duì) C 強(qiáng)制執(zhí)行的一致性屬性。其中包括:

使用適當(dāng)?shù)陌到y(tǒng),而不是C使用基于文本的文件,沒(méi)有翻譯單元的一致性要求;

嚴(yán)格且可讀的語(yǔ)法,強(qiáng)調(diào)清晰度并最大限度地減少“陷阱”,而不是 C 非常寬松的語(yǔ)法,這使得編寫(xiě)效果不是預(yù)期程序變得容易,

遵守 Ada 和 SPARK 的強(qiáng)類(lèi)型規(guī)則,而不是 C 的“糟糕的類(lèi)型安全性,允許發(fā)生廣泛的隱式類(lèi)型轉(zhuǎn)換,這可能會(huì)損害安全性,因?yàn)樗鼈兊膶?shí)現(xiàn)定義方面可能會(huì)導(dǎo)致開(kāi)發(fā)人員混淆。(MISRA C:2012,附件C)

MISRA C試圖通過(guò)各種準(zhǔn)則來(lái)馴服C語(yǔ)言的這些可能的不一致之處。它特別定義了更強(qiáng)的類(lèi)型規(guī)則(“基本類(lèi)型模型”),并限制函數(shù)參數(shù)/結(jié)果和控制結(jié)構(gòu)的使用。雖然這些避免了開(kāi)發(fā)人員混淆的常見(jiàn)來(lái)源,但它們故意不是防彈的,否則它們會(huì)使大多數(shù) C 程序非法。

這些基本保證在SPARK中很容易實(shí)現(xiàn),通過(guò)一個(gè)名為GNATprove的工具進(jìn)行簡(jiǎn)單的類(lèi)似編譯器的分析,這要?dú)w功于定義Ada的SPARK子集的更強(qiáng)大的規(guī)則。

SPARK 銀級(jí) - 強(qiáng)大的安全和安保保證

MISRA-C 指南還旨在防止更細(xì)微的錯(cuò)誤、未初始化數(shù)據(jù)的讀取、表達(dá)式中沖突的副作用以及未定義的行為,例如除以零或緩沖區(qū)溢出(這可能具有安全后果)。所有這些都屬于不可判定規(guī)則的范疇,很少有MISRA C檢查器提供完整的檢測(cè)。

在 SPARK 采用的銀牌級(jí)別完全可以防止這些情況,這對(duì)應(yīng)于通過(guò)流分析(達(dá)到稱(chēng)為銅牌的 SPARK 采用的第二級(jí))和證明沒(méi)有運(yùn)行時(shí)錯(cuò)誤(達(dá)到第三級(jí),即白銀)來(lái)分析程序。要達(dá)到此級(jí)別,開(kāi)發(fā)人員通常需要定義具有特定約束的類(lèi)型,這些約束旨在支持和提供文件之間導(dǎo)出的函數(shù)的協(xié)定 - 使用所謂的前提條件來(lái)指定調(diào)用方的義務(wù),以及后置條件來(lái)指定被調(diào)用方的義務(wù)。

達(dá)到銀級(jí)的過(guò)程涉及與 IDE 的交互。開(kāi)發(fā)人員運(yùn)行 GNATprove 工具(可能在程序的子集上),調(diào)查 GNATprove 診斷,相應(yīng)地更新程序,然后重復(fù)。GNATprove 在每一步都提供的詳細(xì)信息促進(jìn)了這種交互,以指導(dǎo)開(kāi)發(fā)人員。以下是 GNATprove 顯示的消息示例:

pYYBAGN9md-AUFN-AADbEpQjVIo527.png

在找到可能導(dǎo)致溢出的加法操作后,GNATprove 給出了一個(gè)觸發(fā)問(wèn)題的值的示例,這里是最大的整數(shù)值(在 SPARK 中表示為整數(shù)‘最后)?!皺z查原因”清楚地解釋了加法的結(jié)果應(yīng)該適合機(jī)器整數(shù),如果 X 是加法前的最大整數(shù)值,則情況并非如此。然后,GNATprove 建議向函數(shù) Incr 添加一個(gè)合適的前提條件可能會(huì)解決這個(gè)問(wèn)題,在這里指定 X 不能是那個(gè)最大值。

超越銀級(jí)的火花

使用SPARK還有更多的好處,遠(yuǎn)遠(yuǎn)超出了MISRA C檢查器所能提供的。在黃金和白金級(jí)別,開(kāi)發(fā)人員通過(guò)SPARK合同指定程序的屬性,然后可以使用GNATprove 來(lái)保證這些屬性將得到滿(mǎn)足。開(kāi)發(fā)人員還可以啟用 GNATprove 警告來(lái)檢測(cè)死代碼(也是 MISRA C 追求的目標(biāo))和代碼中的不一致,使用構(gòu)成 GNATprove 分析基礎(chǔ)的強(qiáng)大證明技術(shù)。

結(jié)論

從本質(zhì)上講,MISRA C追求的所有目標(biāo)都可以在SPARK中最好地實(shí)現(xiàn),結(jié)合更強(qiáng)大的基礎(chǔ)語(yǔ)言(Ada)和強(qiáng)大的分析工具(GNATprove)。計(jì)劃使用 MISRA C 規(guī)則的開(kāi)發(fā)人員可以通過(guò)在其部分應(yīng)用程序中采用 SPARK 來(lái)增強(qiáng)安全性。

MISRA C 中的規(guī)則代表了在關(guān)鍵應(yīng)用程序中提高 C 代碼可靠性的令人印象深刻的集體努力,重點(diǎn)是避免容易出錯(cuò)的功能,而不是強(qiáng)制實(shí)施特定的編程風(fēng)格。然而,在基本層面上,MISRA C仍然建立在一種基礎(chǔ)語(yǔ)言之上,而這種基礎(chǔ)語(yǔ)言并不是為了支持大型高保證應(yīng)用程序而設(shè)計(jì)的。很難將可靠性、安全性和安全性改造到一種從一開(kāi)始就沒(méi)有這些目標(biāo)的語(yǔ)言中。

由于 C 仍將是像 Linux 內(nèi)核這樣的大型程序的基礎(chǔ)語(yǔ)言,我們可以預(yù)見(jiàn)兩種趨勢(shì)的共存,以更好地防止 C 程序中的錯(cuò)誤,MISRA C 可以發(fā)揮作用,并用更安全的語(yǔ)言(如 Rust 和 SPARK Ada )替換 C 作為部分代碼。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程語(yǔ)言
    +關(guān)注

    關(guān)注

    10

    文章

    1930

    瀏覽量

    34548
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4726

    瀏覽量

    68248
  • 檢查器
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    3483
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SDWAN企業(yè)組網(wǎng)是安全可靠

    SD-WAN(軟件定義廣域網(wǎng))技術(shù)為企業(yè)組網(wǎng)提供了一種現(xiàn)代化、靈活且可靠的解決方案。以下是SD-WAN企業(yè)組網(wǎng)的關(guān)鍵優(yōu)勢(shì): 1、簡(jiǎn)化網(wǎng)絡(luò)管理:SD-WAN通過(guò)集中管理平臺(tái)統(tǒng)一管理廣域網(wǎng),簡(jiǎn)化
    的頭像 發(fā)表于 11-05 17:39 ?75次閱讀

    C2000? MISRA-C策略

    電子發(fā)燒友網(wǎng)站提供《C2000? MISRA-C策略.pdf》資料免費(fèi)下載
    發(fā)表于 10-11 11:43 ?0次下載
    <b class='flag-5'>C</b>2000? <b class='flag-5'>MISRA-C</b>策略

    使用Google Play獲得安全可靠的AI體驗(yàn)

    對(duì) Google Play 的期待,即獲得安全可靠的體驗(yàn)。我們的目標(biāo)是讓 AI 惠及每個(gè)人,豐富應(yīng)用生態(tài)系統(tǒng)并改善用戶(hù)體驗(yàn)。
    的頭像 發(fā)表于 09-09 15:53 ?374次閱讀

    embOS的MISRA-C:2012一致性

    MISRA C是汽車(chē)工業(yè)軟件可靠性協(xié)會(huì)(MISRA)開(kāi)發(fā)的一套針對(duì)C編程語(yǔ)言的軟件開(kāi)發(fā)指南,目的
    的頭像 發(fā)表于 08-20 11:35 ?398次閱讀

    whitepaper-perforce-what-is-misra

    如果您熟悉嵌入式軟件的世界,您可能聽(tīng)說(shuō)過(guò)安全關(guān)鍵系統(tǒng)的MISRA編碼準(zhǔn)則和合規(guī)性。最初為汽車(chē)嵌入式軟件行業(yè),MISRA C for
    發(fā)表于 08-08 15:54 ?0次下載

    DC/AC電源模塊:為醫(yī)療設(shè)備提供安全可靠的電力轉(zhuǎn)換

    BOSHIDA DC/AC電源模塊:為醫(yī)療設(shè)備提供安全可靠的電力轉(zhuǎn)換 DC/AC電源模塊是一種用于將直流電源轉(zhuǎn)換為交流電源的設(shè)備,廣泛應(yīng)用于各種醫(yī)療設(shè)備。它們的主要功能是為醫(yī)療設(shè)備提供安全可靠
    的頭像 發(fā)表于 06-19 16:13 ?361次閱讀
    DC/AC電源模塊:為醫(yī)療設(shè)備提供<b class='flag-5'>安全可靠</b>的電力轉(zhuǎn)換

    Perforce靜態(tài)代碼分析專(zhuān)家解讀MISRA C++:2023?新標(biāo)準(zhǔn):如何安全、高效地使用基于范圍的for循環(huán),防范未定義行

    Frank van den Beuken博士的博客系列,本期為第三篇。 在前兩篇系列文章,我們向您介紹了 新的MISRA C++ 標(biāo)準(zhǔn) 和 C++簡(jiǎn)史 。本文,我們將仔細(xì)研究
    的頭像 發(fā)表于 06-18 12:57 ?332次閱讀

    MISRA-C-:2004文版

    MISRA-C-:2004 中文版
    發(fā)表于 06-04 11:52 ?1次下載

    4G插卡路由器:安全可靠的網(wǎng)絡(luò)安全解決方案

    4G插卡路由器是一款安全可靠的網(wǎng)絡(luò)安全解決方案,具有數(shù)據(jù)加密、防DDoS攻擊、安全防護(hù)和設(shè)備管理等優(yōu)勢(shì)。其信號(hào)覆蓋廣、穩(wěn)定性高、性?xún)r(jià)比高,適用于家庭、辦公室、戶(hù)外等場(chǎng)景。選擇4G插卡路由器,可保護(hù)信息
    的頭像 發(fā)表于 05-07 10:35 ?751次閱讀

    使用 MISRA C++:2023? 避免基于范圍的 for 循環(huán)中的錯(cuò)誤

    在前兩篇博客,我們?向您介紹了新的 MISRA C++ 標(biāo)準(zhǔn)?和?C++ 的歷史?。在這篇博客,我們將仔細(xì)研究以
    的頭像 發(fā)表于 03-28 13:53 ?716次閱讀
    使用 <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>++:2023? 避免基于范圍的 for 循環(huán)中的錯(cuò)誤

    PW4054充電芯片規(guī)格書(shū)概覽:高效充電,無(wú)需外接元件,安全可靠

    PW4054充電芯片規(guī)格書(shū)概覽:高效充電,無(wú)需外接元件,安全可靠
    的頭像 發(fā)表于 03-01 14:44 ?1319次閱讀
    PW4054充電芯片規(guī)格書(shū)概覽:高效充電,無(wú)需外接元件,<b class='flag-5'>安全可靠</b>

    汽車(chē)電子行業(yè)的MISRA C標(biāo)準(zhǔn)解讀

    之前分享了一些編程規(guī)范相關(guān)的文章,有位讀者提到了汽車(chē)電子行業(yè)的MISRA C標(biāo)準(zhǔn),說(shuō)這個(gè)很不錯(cuò)。
    的頭像 發(fā)表于 01-17 11:03 ?1106次閱讀

    C++簡(jiǎn)史:C++是如何開(kāi)始的

    MISRA C++:2023 博客系列的第二部分。 在這篇博客,我們將深入探討 C++ 的歷史、編程語(yǔ)言多年來(lái)的發(fā)展歷程以及它的下一
    的頭像 發(fā)表于 01-11 09:00 ?516次閱讀
    <b class='flag-5'>C</b>++簡(jiǎn)史:<b class='flag-5'>C</b>++是如何開(kāi)始的

    中國(guó)發(fā)布多款國(guó)產(chǎn)CPU及操作系統(tǒng)安全可靠測(cè)評(píng)結(jié)果

    依據(jù)《安全可靠測(cè)評(píng)工作指南(試行)》,測(cè)評(píng)主要針對(duì)計(jì)算機(jī)終端和服務(wù)器搭載的中央處理器(CPU)、操作系統(tǒng)及數(shù)據(jù)庫(kù)等基礎(chǔ)軟件硬件進(jìn)行。經(jīng)過(guò)對(duì)核心技術(shù)、安全保障、持續(xù)發(fā)展等多個(gè)方面的全面評(píng)估,從而評(píng)定產(chǎn)品的安全性與可持續(xù)性
    的頭像 發(fā)表于 12-27 14:36 ?2125次閱讀

    汽車(chē)網(wǎng)絡(luò)安全:防止汽車(chē)軟件的漏洞

    汽車(chē)網(wǎng)絡(luò)安全汽車(chē)開(kāi)發(fā)至關(guān)重要,尤其是 汽車(chē)軟件 日益互聯(lián)的情況下。在這篇博客,我們將分享如何防止汽車(chē)網(wǎng)絡(luò)
    的頭像 發(fā)表于 12-21 16:12 ?1046次閱讀
    汽車(chē)網(wǎng)絡(luò)<b class='flag-5'>安全</b>:防止汽車(chē)軟件<b class='flag-5'>中</b>的漏洞