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

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

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

帶你走近MISRA C:2012

北匯信息POLELINK ? 2022-10-13 14:37 ? 次閱讀

作者:給你小魚(yú)干小編:吃不飽

01

汽車(chē)軟件與C語(yǔ)言

隨著軟件定義汽車(chē)概念的興起,汽車(chē)軟件開(kāi)發(fā)的工作量開(kāi)始呈指數(shù)級(jí)增加,當(dāng)前車(chē)載軟件代碼量已經(jīng)達(dá)到1億-3億行。這是一個(gè)什么概念呢,相當(dāng)于比Windows系統(tǒng)還高出一個(gè)數(shù)量級(jí)。據(jù)調(diào)查,大部分的車(chē)載軟件都是使用C語(yǔ)言進(jìn)行開(kāi)發(fā),因?yàn)镃執(zhí)行效率高、代碼量小,因此在汽車(chē)的小型控制部件中被廣泛使用。盡管C語(yǔ)言在嵌入式系統(tǒng)中如此流行,但仍有很多缺陷:

1

C是弱類(lèi)型語(yǔ)言

在下面代碼中,char類(lèi)型和int類(lèi)型是可以直接運(yùn)算的,因?yàn)閏har類(lèi)型會(huì)被提升為int,這就是C中的隱式類(lèi)型轉(zhuǎn)換,將精度較小的轉(zhuǎn)換為大精度的,在這個(gè)意義上講,它并不符合強(qiáng)類(lèi)型語(yǔ)言的定義。

#include

int main(void){

char a='a';

int b=10;

int c=a+b;

return 0;

}

2

C有更多操作符及優(yōu)先級(jí)

C相較于其他的語(yǔ)言有更多的操作符,因此其也有更多不同的操作符優(yōu)先級(jí),其中的大多數(shù)都不是能直觀判斷的,所以通常會(huì)被程序員誤解。

3

C程序一般不為常見(jiàn)問(wèn)題

提供運(yùn)行時(shí)檢查

C程序一般不為常見(jiàn)問(wèn)題提供運(yùn)行時(shí)檢查,例如運(yùn)算異常(如零除),溢出,指針的有效性或者數(shù)組越界。

02

MISRA C編碼規(guī)范

綜上所述,C語(yǔ)言對(duì)于安全性要求很高的汽車(chē)軟件而言是不安全的。汽車(chē)工業(yè)軟件可靠性協(xié)會(huì)(Motor Industry Software Reliability Association,MISRA)在1998年發(fā)布了第一版針對(duì)汽車(chē)工業(yè)軟件安全性的C語(yǔ)言編碼規(guī)范---MISRA C,讓程序員有規(guī)范可循。從1998年發(fā)布的MISRA C:1998,只針對(duì)汽車(chē)制造業(yè)的嵌入式開(kāi)發(fā),到MISRA C:2012,已經(jīng)開(kāi)始擴(kuò)大覆蓋范圍到其他高安全性系統(tǒng)。下面我們就看一下具體的MISRA C:2012規(guī)則內(nèi)容。

03

MISRA C:2012規(guī)則介紹

MISRA C:2012包含159條規(guī)則,其中Directives有16條,Rules有143條。

01

Dir 4.12:動(dòng)態(tài)內(nèi)存分配不應(yīng)被使用。

a009cbba-4a6e-11ed-b116-dac502259ad0.png

圖1 Dir 4.12規(guī)則

原理:任何庫(kù)的動(dòng)態(tài)內(nèi)存分配和進(jìn)程的釋放都可能導(dǎo)致未定義的行為。

02

Rule 10.3:表達(dá)式的值不應(yīng)分配給具有較窄基本類(lèi)型或不同基本類(lèi)型類(lèi)別的對(duì)象。

a03f348a-4a6e-11ed-b116-dac502259ad0.png

圖2 Rule 10.3規(guī)則

原理:C語(yǔ)言允許程序員有相當(dāng)大的自由度,并允許自動(dòng)形成不同算術(shù)類(lèi)型之間的賦值。然而,使用這些隱式轉(zhuǎn)換可能會(huì)導(dǎo)致意外的結(jié)果,可能會(huì)丟失值、符號(hào)或精度。如MISRA基本類(lèi)型模型所強(qiáng)制的,使用更強(qiáng)的類(lèi)型可以降低這些問(wèn)題發(fā)生的可能性。

看到這里,相信大家有許多疑問(wèn):為什么一個(gè)是Dir而另一個(gè)是Rule呢?Category、Analysis這些又是什么呢?下面就來(lái)介紹一下MISRA規(guī)則的分類(lèi)和屬性。

04

MISRA C:2012規(guī)則分類(lèi)

MISRA C:2012的規(guī)則按照性質(zhì)分為兩類(lèi):指令(Directives)和規(guī)則(Rules)。規(guī)則有三種不同類(lèi)別:”強(qiáng)制(Mandatory)”、”要求(Required)”和“建議(Advisory)”;其中具體結(jié)果如下圖所示。

a0506e6c-4a6e-11ed-b116-dac502259ad0.png

圖3 MISRA C:2012規(guī)則分類(lèi)那么,在任何情況下都可以明確地說(shuō)明該條代碼違反了規(guī)則嗎?出于此問(wèn)題,MISRA C:2012規(guī)則的Rules具有可判定性Decidable/Undecidable,他們的區(qū)分標(biāo)準(zhǔn)為是否能在任何情況下明確回答“該代碼是否遵循了這條規(guī)則”?a08f1450-4a6e-11ed-b116-dac502259ad0.png圖4 MISRA C:2012規(guī)則的可判定性要注意的是,可判定性并不適用于Directives規(guī)則。Rules的分析范圍分為Single Translation Unit/System:a0a0ed56-4a6e-11ed-b116-dac502259ad0.png圖5 Rules的分析范圍

05

Helix QAC與MISRA C:2012

很明顯,MISRA C:2012規(guī)則就是為靜態(tài)測(cè)試而生的。Perforce公司的靜態(tài)分析工具Helix QAC,是汽車(chē)行業(yè)中主流的靜態(tài)分析器,其開(kāi)發(fā)團(tuán)隊(duì)是MISRA C&C++編碼委員會(huì)的創(chuàng)始會(huì)員,也是MISRA C&C++委員會(huì)最具影響力的會(huì)員。Helix QAC具有業(yè)界領(lǐng)先的編碼規(guī)范覆蓋度,目前MISRA C:2004的編碼規(guī)范覆蓋度達(dá)到了99%,而對(duì)MISRA C:2012的編碼規(guī)范覆蓋度已達(dá)到100%。是嵌入式靜態(tài)分析領(lǐng)域公認(rèn)的行業(yè)領(lǐng)導(dǎo)及先驅(qū)。a0b7196e-4a6e-11ed-b116-dac502259ad0.png圖6 Helix QAC的編碼規(guī)范覆蓋度下面以開(kāi)源工程wget為例,演示一下Helix QAC是如何定位違反MISRA C:2012規(guī)則的代碼。a0cafb00-4a6e-11ed-b116-dac502259ad0.png圖7 HelixQAC診斷消息0883診斷消息0883:“包含文件代碼不受重復(fù)包含的保護(hù)”正是MISRAC:2012規(guī)則Dir 4.10的映射,通過(guò)診斷消息開(kāi)發(fā)人員就可以了解到代碼違反MISRA C:2012規(guī)則的情況,從而對(duì)代碼進(jìn)行修改使其合規(guī)。a0fe16f2-4a6e-11ed-b116-dac502259ad0.png圖8 Rule 9.1規(guī)則的不同診斷消息Rule 9.1:對(duì)象在初始化前不能被使用。a134044c-4a6e-11ed-b116-dac502259ad0.png圖9 Rule 9.1規(guī)則這里大家或許會(huì)疑惑,為什么同一個(gè)規(guī)則下會(huì)產(chǎn)生兩種診斷消息呢?答案是:數(shù)據(jù)流分析。數(shù)據(jù)流分析是Helix QAC的高級(jí)分析,Helix QAC通過(guò)內(nèi)置的數(shù)據(jù)流分析器分析運(yùn)行時(shí)的行為。數(shù)據(jù)流分析可以識(shí)別各種問(wèn)題,包括可能指示編碼錯(cuò)誤的條件,以及可能導(dǎo)致程序崩潰的關(guān)鍵未定義行為。我們可以看到圖中的診斷消息2962和2963雖然都是Rule 9.1產(chǎn)生的,但是分成了Suspicious和Apparent兩種。我們?cè)诖a中看一下這兩條診斷消息的不同。診斷消息2963的源碼如下:a13ec814-4a6e-11ed-b116-dac502259ad0.png
在226行聲明了數(shù)組saved_lengths,241行對(duì)saved_lengths進(jìn)行賦值操作,在255行使用saved_lengths。但saved_lengths的賦值操作不一定會(huì)進(jìn)行,因?yàn)樵摬僮髟趂or循環(huán)中進(jìn)行,如果for循環(huán)沒(méi)有達(dá)到執(zhí)行條件導(dǎo)致并未執(zhí)行,那么此時(shí)saved_lengths就沒(méi)有初始化。所以此條診斷消息是Suspicious。診斷消息2962源碼如下:a163cf2e-4a6e-11ed-b116-dac502259ad0.png
可以看到,在824行聲明變量dt,但后面并未對(duì)dt進(jìn)行初始化。所以此條診斷消息是Apparent。
由此可見(jiàn)Helix QAC數(shù)據(jù)流分析功能的強(qiáng)大。Helix QAC的數(shù)據(jù)流功能也在不斷地更新,在即將到來(lái)的新版本2022.4中,數(shù)據(jù)流計(jì)劃從Helix QAC引擎中分離出來(lái),成為自己的組件。在近期發(fā)布的最新版本Helix QAC 2022.3中,引入了對(duì)微軟Visual Studio 2022的支持,提供更廣泛的編譯器支持,以及對(duì)C++20和C23的升級(jí)語(yǔ)言支持。此外,此版本具有使用“qainject”自動(dòng)生成 CCT 的功能,可簡(jiǎn)化構(gòu)建理解和編譯器設(shè)置。作為Perforce公司的合作伙伴,北匯信息將為客戶(hù)提供優(yōu)質(zhì)的靜態(tài)代碼測(cè)試工具和服務(wù)。

聲明:本文內(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)投訴
  • 汽車(chē)軟件
    +關(guān)注

    關(guān)注

    0

    文章

    90

    瀏覽量

    3162
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    智慧公交是什么?一文帶你詳解智慧公交的解決方案!

    智慧公交是什么?一文帶你詳解智慧公交的解決方案!
    的頭像 發(fā)表于 11-05 12:26 ?128次閱讀
    智慧公交是什么?一文<b class='flag-5'>帶你</b>詳解智慧公交的解決方案!

    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>策略

    embOS的MISRA-C:2012一致性

    MISRA C是汽車(chē)工業(yè)軟件可靠性協(xié)會(huì)(MISRA)開(kāi)發(fā)的一套針對(duì)C編程語(yǔ)言的軟件開(kāi)發(fā)指南,目的是提升嵌入式系統(tǒng)的安全性和可移植性。2012
    的頭像 發(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 CC
    發(fā)表于 08-08 15:54 ?0次下載

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

    MISRA C++:2023——MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本來(lái)了!為了幫助您了解 MISRA
    的頭像 發(fā)表于 06-18 12:57 ?334次閱讀

    MISRA-C-:2004中文版

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

    天線(xiàn)設(shè)計(jì)攻略簡(jiǎn)要概述 帶你玩轉(zhuǎn)PCB和WIFI

    給大家分享干貨啦!天線(xiàn)設(shè)計(jì)全攻略,帶你玩轉(zhuǎn)PCB和WIFI
    的頭像 發(fā)表于 05-08 14:42 ?1443次閱讀
    天線(xiàn)設(shè)計(jì)攻略簡(jiǎn)要概述 <b class='flag-5'>帶你</b>玩轉(zhuǎn)PCB和WIFI

    帶你走近MISRA C++:2023

    奉為汽車(chē)軟件工程師在開(kāi)發(fā)實(shí)踐中的圭臬。MISRAC++的發(fā)展史MISRAC++的起源可以追溯到MISRAC標(biāo)準(zhǔn)的成功制定和廣泛應(yīng)用。MISRAC是一套針對(duì)C語(yǔ)言的
    的頭像 發(fā)表于 04-30 08:24 ?1701次閱讀
    <b class='flag-5'>帶你</b>走近<b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>++:2023

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

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

    帶你探索穩(wěn)壓器的優(yōu)缺點(diǎn)和選擇技巧

    TOREX特瑞仕(KOYUELEC光與電子):帶你探索穩(wěn)壓器的優(yōu)缺點(diǎn)和選擇技巧
    的頭像 發(fā)表于 01-24 10:35 ?783次閱讀
    <b class='flag-5'>帶你</b>探索穩(wěn)壓器的優(yōu)缺點(diǎn)和選擇技巧

    汽車(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次閱讀

    代碼靜態(tài)測(cè)試工具Helix QAC 2023.4新發(fā)布

    Helix QAC 2023.4 為新的 MISRA C++:2023 指南推出了 100% MISRA C++:2023? 規(guī)則覆蓋率。此版本還包括擴(kuò)展的
    的頭像 發(fā)表于 01-13 12:25 ?426次閱讀
    代碼靜態(tài)測(cè)試工具Helix QAC 2023.4新發(fā)布

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

    MISRA C++:2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本,來(lái)了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工程師 Frank van den Beuke
    的頭像 發(fā)表于 01-11 09:00 ?516次閱讀
    <b class='flag-5'>C</b>++簡(jiǎn)史:<b class='flag-5'>C</b>++是如何開(kāi)始的

    Helix QAC—軟件靜態(tài)測(cè)試工具

    /QAC++、Dashboard(原QA Verify)以及常用行業(yè)規(guī)則包(如MISRA C2012MISRA C++:2008、AUT
    的頭像 發(fā)表于 01-10 17:35 ?617次閱讀
    Helix QAC—軟件靜態(tài)測(cè)試工具

    汽車(chē)行業(yè)軟件代碼滿(mǎn)足功能安全與信息安全的最佳實(shí)踐

    21434信息安全的必要性。這兩種功能標(biāo)準(zhǔn)都需要使用諸如MISRA CC++之類(lèi)的編碼標(biāo)準(zhǔn)。因此,我們將討論最新的MISRA規(guī)則,以及如何使用靜態(tài)分析工具Helix
    的頭像 發(fā)表于 11-23 20:05 ?577次閱讀
    汽車(chē)行業(yè)軟件代碼滿(mǎn)足功能安全與信息安全的最佳實(shí)踐