精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

MISRA C編寫更安全清晰的C代碼

李靜 ? 來(lái)源:sayhealer ? 作者:sayhealer ? 2022-07-15 14:36 ? 次閱讀

嵌入式開發(fā)人員經(jīng)常抱怨沒(méi)有一種編程語(yǔ)言能完美滿足他們的特定需求。在某種程度上,這種情況并不令人驚訝,因?yàn)楸M管有很多開發(fā)人員在開發(fā)嵌入式應(yīng)用程序,但他們?nèi)匀恢皇鞘澜缇幊躺鐓^(qū)的一小部分。然而,一些語(yǔ)言在開發(fā)時(shí)就考慮到了嵌入式。值得注意的例子是 PL/M、Forth 和 Ada,它們都已被廣泛使用,但從未被普遍接受。其他語(yǔ)言,如 Rust,正在獲得支持,但尚未成為主流。幾乎被普遍采用的折衷方案是 C。如何才能使這種折衷方案最有效地發(fā)揮作用?

C 語(yǔ)言簡(jiǎn)潔、富有表現(xiàn)力且功能強(qiáng)大。它為程序員提供了編寫高效、可讀和可維護(hù)的代碼的方法。所有這些功能都說(shuō)明了它的受歡迎程度。不幸的是,該語(yǔ)言還使粗心的開發(fā)人員能夠編寫危險(xiǎn)的、不安全的代碼,這些代碼可能會(huì)在開發(fā)項(xiàng)目的所有階段和部署中導(dǎo)致嚴(yán)重的問(wèn)題。對(duì)于安全性和/或安全性是主要優(yōu)先事項(xiàng)的應(yīng)用程序,語(yǔ)言的這些缺點(diǎn)是一個(gè)主要問(wèn)題。

正是在這種背景下,在 1990 年代后期,汽車工業(yè)軟件可靠性協(xié)會(huì) (MISRA) 推出了一套在車輛系統(tǒng)中使用 C 的指南,即后來(lái)的 MISRA C。從那時(shí)起,該指南一直在穩(wěn)步推進(jìn)。完善,不時(shí)發(fā)布更新。還建立了使用 C++ 的類似方法。盡管該指南最初針對(duì)的是汽車軟件開發(fā)人員,但很快就意識(shí)到它們同樣適用于安全至關(guān)重要的許多其他應(yīng)用領(lǐng)域,并且該標(biāo)準(zhǔn)現(xiàn)在已被許多行業(yè)廣泛采用。

盡管 MISRA C 不是風(fēng)格指南——事實(shí)上,許多用戶在應(yīng)用風(fēng)格指南和標(biāo)準(zhǔn)的同時(shí)——許多規(guī)則也促進(jìn)了清晰、可讀、可維護(hù)的代碼的編寫。這是非常有益的,因?yàn)橐子诶斫獾拇a不太可能包含細(xì)微的錯(cuò)誤或未定義的行為。

MISRA C 的完整詳細(xì)信息可從https://misra.org.uk獲得,并且有許多可用的工具支持該方法。

我將在這里簡(jiǎn)單介紹一下指南。我的參考資料來(lái)自 MISRA C:2012 第三版,第一版。MISRA C 正在不斷審查中,增量更改解決了指南的清晰度和準(zhǔn)確性以及對(duì)新版本 C 語(yǔ)言標(biāo)準(zhǔn)的支持。盡管細(xì)節(jié)發(fā)生了變化,但整體理念和方法沒(méi)有變化。

規(guī)則 13.2 – 在所有允許的評(píng)估順序下,表達(dá)式的值及其持續(xù)的副作用應(yīng)相同

C 語(yǔ)言標(biāo)準(zhǔn)在表達(dá)式中的求值順序方面為編譯器提供了非常廣泛的自由度。因此,任何對(duì)評(píng)估順序敏感的代碼都是依賴于編譯器和依賴于編譯器的代碼,因此應(yīng)始終將其視為不安全的。

例如,遞增和遞減運(yùn)算符的使用可能會(huì)很麻煩:

val = n++ + arr[n];

訪問(wèn)arr的哪個(gè)元素程序員是否期望用于索引數(shù)組的n的值是在增量之前還是之后?盡管看起來(lái)好像在數(shù)組索引之前執(zhí)行了增量,但它假設(shè)了左右表達(dá)式評(píng)估,這不是一個(gè)有效的假設(shè)。所以,代碼不清楚,應(yīng)該重寫如下:

val = n + arr[n+1];
n++;

或者

val = n++;
val += arr[n];

甚至

val = n;
n++;
val += arr[n];

您選擇哪個(gè)選項(xiàng)取決于個(gè)人風(fēng)格。它們都執(zhí)行相同的操作,事實(shí)上,優(yōu)化編譯器很可能會(huì)生成完全相同的代碼。

一個(gè)表達(dá)式中使用的多個(gè)函數(shù)調(diào)用可能會(huì)出現(xiàn)類似的問(wèn)題。函數(shù)調(diào)用可能具有影響另一個(gè)函數(shù)的副作用。例如:

val = fun1() + fun2();

在這種情況下,如果任何一個(gè)函數(shù)都可以影響另一個(gè)函數(shù)的結(jié)果,那么代碼就是模棱兩可的。要編寫安全代碼,必須消除任何可能的歧義:

val = fun1();
val += fun2();

現(xiàn)在很清楚fun1()是首先執(zhí)行的。

規(guī)則 17.2 – 函數(shù)不得直接或間接調(diào)用自己

有時(shí),表達(dá)算法的一種優(yōu)雅方式是使用遞歸。但是,除非對(duì)遞歸進(jìn)行非常嚴(yán)格的控制,否則存在堆棧溢出的危險(xiǎn),這反過(guò)來(lái)又會(huì)導(dǎo)致非常難以定位錯(cuò)誤。在安全關(guān)鍵代碼中,應(yīng)避免遞歸。

Rule 19.2 – The union keyword should not be used

Although C is a typed language, typing is not very strictly enforced, and developers may be tempted to override typing to “simplify” their code. Adhering to the constraints of data types is essential to create safe code, as any attempts to get around data types can produce undefined results. The union keyword can be used for a number of purposes, which generally result in unclear code, but can also be a means to circumvent typing.

One example would be using a union to “take apart” an unsigned integer, thus:

union e
{
unsigned int ui;
unsigned char a[4];
}f;

在這種情況下, ui的每個(gè)字節(jié)都可以作為 a 的元素訪問(wèn)但是,我們不能確定a[0]是否是最不重要的字節(jié),因?yàn)檫@是一個(gè)實(shí)現(xiàn)問(wèn)題。(本質(zhì)上與處理器的字節(jié)序有關(guān)。)替代方法可能是使用移位和屏蔽,因此:

unsigned char getbyte(unsigned int input, unsigned int index)
{
input >>= (index * 8);
返回輸入 & 0xff;
}

有人可能會(huì)爭(zhēng)辯說(shuō),這些規(guī)則(以及 MISRA C 的大多數(shù),如果不是全部的話)只是常識(shí),任何優(yōu)秀的程序員都會(huì)采用這種方法。這可能是真的,但一套明確的指導(dǎo)方針讓機(jī)會(huì)更少。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5071

    文章

    19026

    瀏覽量

    303507
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7601

    瀏覽量

    136251
  • MISRA
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    6960
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MISRA C 2012 學(xué)習(xí)資料

    `MISRA C 學(xué)習(xí)資料 `
    發(fā)表于 09-17 14:55

    軟件編程規(guī)范(MISRA-C)

    MISRA-C是一種汽車制造業(yè)嵌入式C編碼標(biāo)準(zhǔn)。FreeRTOS符合MISRA-C編程規(guī)范,就連大名鼎鼎的uCOS也宣稱基本符合MISRA-C編程規(guī)范。
    發(fā)表于 11-02 18:29 ?26次下載

    如何使用GCC實(shí)現(xiàn)支持MISRA-C安全編譯器的資料概述

    MISRA-C是基于C89標(biāo)準(zhǔn)抽取出的安全C語(yǔ)言子集,已經(jīng)逐漸成為安全關(guān)鍵嵌入式領(lǐng)域的軟件編碼標(biāo)準(zhǔn)。作為在嵌入式領(lǐng)域被廣泛使用的編譯器,GC
    發(fā)表于 11-07 10:46 ?16次下載
    如何使用GCC實(shí)現(xiàn)支持<b class='flag-5'>MISRA-C</b>的<b class='flag-5'>安全</b>編譯器的資料概述

    單片機(jī)C語(yǔ)言代碼編寫技巧

    下面發(fā)一些我在網(wǎng)上看到的單片機(jī)C語(yǔ)言代碼編寫技巧和自己的一些經(jīng)驗(yàn)來(lái)和大家分享;
    發(fā)表于 07-14 11:02 ?2898次閱讀

    汽車電子行業(yè)的MISRA C標(biāo)準(zhǔn)分享

    的、高可靠性的嵌入式軟件。MISRA C則是由MISRA提出的針對(duì)嵌入式C語(yǔ)言開發(fā)標(biāo)準(zhǔn),目的是提高嵌入式系統(tǒng)的安全性、可讀性和可移植性
    的頭像 發(fā)表于 05-11 13:43 ?1888次閱讀

    MISRA C安全安全編程中的位置

      從本質(zhì)上講,MISRA C 追求的所有目標(biāo)都在 SPARK 中得到了最好的實(shí)現(xiàn),結(jié)合了更強(qiáng)大的基礎(chǔ)語(yǔ)言 (Ada) 和強(qiáng)大的分析工具 (GNATprove)。
    的頭像 發(fā)表于 06-20 16:07 ?1162次閱讀
    <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>在<b class='flag-5'>安全</b>和<b class='flag-5'>安全</b>編程中的位置

    MISRA C可用于提高軟件質(zhì)量考慮

      通過(guò)定義 C 語(yǔ)言的可預(yù)測(cè)子集并為開發(fā)人員提供指導(dǎo),MISRA C 為嵌入式控制系統(tǒng)和獨(dú)立軟件的安全應(yīng)用提供了最佳實(shí)踐指南。
    發(fā)表于 06-30 09:27 ?844次閱讀

    MISRA C安全安全編程中的位置

      由于 C 仍將是 Linux 內(nèi)核等大型程序的基礎(chǔ)語(yǔ)言,我們可以預(yù)見(jiàn)兩種趨勢(shì)的共存,以更好地防止 C 程序中的錯(cuò)誤,其中 MISRA C 可以發(fā)揮作用,并用
    的頭像 發(fā)表于 07-01 10:07 ?903次閱讀
    <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>在<b class='flag-5'>安全</b>和<b class='flag-5'>安全</b>編程中的位置

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

    C編程語(yǔ)言的普及,以及它的許多陷阱和陷阱,導(dǎo)致了MISRA CC用于高完整性軟件的領(lǐng)域取得了巨大的成功。這一成功促使工具供應(yīng)商提出了許多MISRA
    的頭像 發(fā)表于 11-23 11:55 ?947次閱讀
    <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>在<b class='flag-5'>安全</b>可靠編程中的地位

    Parasoft支持更新MISRA C:2012,提供最新的安全和合規(guī)編碼指南

    了解最新的MISRA指導(dǎo)方針,以確保其客戶繼續(xù)使用C/C++test進(jìn)行自動(dòng)化合規(guī)測(cè)試,以提供最安全、最可靠的C應(yīng)用程序。關(guān)注我們了解更多關(guān)
    的頭像 發(fā)表于 02-06 14:15 ?1053次閱讀

    靜態(tài)代碼分析器工具Helix QAC 2023.2: 提供 100% 的 MISRA C:2012 和 MISRA C:2023 規(guī)則覆蓋率

    Helix QAC 2023.2 提供 100% 的 MISRA C:2012 和 MISRA C:2023 規(guī)則覆蓋率,并更新相應(yīng)的合規(guī)性模塊以支持
    的頭像 發(fā)表于 07-31 22:53 ?1132次閱讀
    靜態(tài)<b class='flag-5'>代碼</b>分析器工具Helix QAC 2023.2: 提供 100% 的 <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>:2012 和 <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>:2023 規(guī)則覆蓋率

    MISRA-C-:2004中文版

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

    whitepaper-perforce-what-is-misra

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

    embOS的MISRA-C:2012一致性

    MISRA C是汽車工業(yè)軟件可靠性協(xié)會(huì)(MISRA)開發(fā)的一套針對(duì)C編程語(yǔ)言的軟件開發(fā)指南,目的是提升嵌入式系統(tǒng)的安全性和可移植性。2012
    的頭像 發(fā)表于 08-20 11:35 ?428次閱讀

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