国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

李靜 ? 來源:sayhealer ? 作者:sayhealer ? 2022-07-15 14:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式開發人員經常抱怨沒有一種編程語言能完美滿足他們的特定需求。在某種程度上,這種情況并不令人驚訝,因為盡管有很多開發人員在開發嵌入式應用程序,但他們仍然只是世界編程社區的一小部分。然而,一些語言在開發時就考慮到了嵌入式。值得注意的例子是 PL/M、Forth 和 Ada,它們都已被廣泛使用,但從未被普遍接受。其他語言,如 Rust,正在獲得支持,但尚未成為主流。幾乎被普遍采用的折衷方案是 C。如何才能使這種折衷方案最有效地發揮作用?

C 語言簡潔、富有表現力且功能強大。它為程序員提供了編寫高效、可讀和可維護的代碼的方法。所有這些功能都說明了它的受歡迎程度。不幸的是,該語言還使粗心的開發人員能夠編寫危險的、不安全的代碼,這些代碼可能會在開發項目的所有階段和部署中導致嚴重的問題。對于安全性和/或安全性是主要優先事項的應用程序,語言的這些缺點是一個主要問題。

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

盡管 MISRA C 不是風格指南——事實上,許多用戶在應用風格指南和標準的同時——許多規則也促進了清晰、可讀、可維護的代碼的編寫。這是非常有益的,因為易于理解的代碼不太可能包含細微的錯誤或未定義的行為。

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

我將在這里簡單介紹一下指南。我的參考資料來自 MISRA C:2012 第三版,第一版。MISRA C 正在不斷審查中,增量更改解決了指南的清晰度和準確性以及對新版本 C 語言標準的支持。盡管細節發生了變化,但整體理念和方法沒有變化。

規則 13.2 – 在所有允許的評估順序下,表達式的值及其持續的副作用應相同

C 語言標準在表達式中的求值順序方面為編譯器提供了非常廣泛的自由度。因此,任何對評估順序敏感的代碼都是依賴于編譯器和依賴于編譯器的代碼,因此應始終將其視為不安全的。

例如,遞增和遞減運算符的使用可能會很麻煩:

val = n++ + arr[n];

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

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

或者

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

甚至

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

您選擇哪個選項取決于個人風格。它們都執行相同的操作,事實上,優化編譯器很可能會生成完全相同的代碼。

一個表達式中使用的多個函數調用可能會出現類似的問題。函數調用可能具有影響另一個函數的副作用。例如:

val = fun1() + fun2();

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

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

現在很清楚fun1()是首先執行的。

規則 17.2 – 函數不得直接或間接調用自己

有時,表達算法的一種優雅方式是使用遞歸。但是,除非對遞歸進行非常嚴格的控制,否則存在堆棧溢出的危險,這反過來又會導致非常難以定位錯誤。在安全關鍵代碼中,應避免遞歸。

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的每個字節都可以作為 a 的元素訪問但是,我們不能確定a[0]是否是最不重要的字節,因為這是一個實現問題。(本質上與處理器的字節序有關。)替代方法可能是使用移位和屏蔽,因此:

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

有人可能會爭辯說,這些規則(以及 MISRA C 的大多數,如果不是全部的話)只是常識,任何優秀的程序員都會采用這種方法。這可能是真的,但一套明確的指導方針讓機會更少。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5198

    文章

    20449

    瀏覽量

    334122
  • C語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145614
  • MISRA
    +關注

    關注

    0

    文章

    22

    瀏覽量

    7437
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    軟件編程規范(MISRA-C)

    MISRA-C是一種汽車制造業嵌入式C編碼標準。FreeRTOS符合MISRA-C編程規范,就連大名鼎鼎的uCOS也宣稱基本符合MISRA-C編程規范。
    發表于 11-02 18:29 ?29次下載

    如何使用GCC實現支持MISRA-C安全編譯器的資料概述

    MISRA-C是基于C89標準抽取出的安全C語言子集,已經逐漸成為安全關鍵嵌入式領域的軟件編碼標準。作為在嵌入式領域被廣泛使用的編譯器,GC
    發表于 11-07 10:46 ?18次下載
    如何使用GCC實現支持<b class='flag-5'>MISRA-C</b>的<b class='flag-5'>安全</b>編譯器的資料概述

    單片機C語言代碼編寫技巧

    下面發一些我在網上看到的單片機C語言代碼編寫技巧和自己的一些經驗來和大家分享;
    發表于 07-14 11:02 ?3410次閱讀

    汽車電子行業的MISRA C標準分享

    的、高可靠性的嵌入式軟件。MISRA C則是由MISRA提出的針對嵌入式C語言開發標準,目的是提高嵌入式系統的安全性、可讀性和可移植性
    的頭像 發表于 05-11 13:43 ?2479次閱讀

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

      從本質上講,MISRA C 追求的所有目標都在 SPARK 中得到了最好的實現,結合了更強大的基礎語言 (Ada) 和強大的分析工具 (GNATprove)。
    的頭像 發表于 06-20 16:07 ?1785次閱讀
    <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 語言的可預測子集并為開發人員提供指導,MISRA C 為嵌入式控制系統和獨立軟件的安全應用提供了最佳實踐指南。
    發表于 06-30 09:27 ?1223次閱讀

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

      由于 C 仍將是 Linux 內核等大型程序的基礎語言,我們可以預見兩種趨勢的共存,以更好地防止 C 程序中的錯誤,其中 MISRA C 可以發揮作用,并用
    的頭像 發表于 07-01 10:07 ?1544次閱讀
    <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編程語言的普及,以及它的許多陷阱和陷阱,導致了MISRA CC用于高完整性軟件的領域取得了巨大的成功。這一成功促使工具供應商提出了許多MISRA
    的頭像 發表于 11-23 11:55 ?1636次閱讀
    <b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>在<b class='flag-5'>安全</b>可靠編程中的地位

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

    了解最新的MISRA指導方針,以確保其客戶繼續使用C/C++test進行自動化合規測試,以提供最安全、最可靠的C應用程序。關注我們了解更多關
    的頭像 發表于 02-06 14:15 ?1964次閱讀

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

    Helix QAC 2023.2 提供 100% 的 MISRA C:2012 和 MISRA C:2023 規則覆蓋率,并更新相應的合規性模塊以支持
    的頭像 發表于 07-31 22:53 ?2098次閱讀
    靜態<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 規則覆蓋率

    MISRA-C-:2004中文版

    MISRA-C-:2004 中文版
    發表于 06-04 11:52 ?3次下載

    whitepaper-perforce-what-is-misra

    如果您熟悉嵌入式軟件的世界,您可能聽說過安全關鍵系統的MISRA編碼準則和合規性。最初為在汽車嵌入式軟件行業,MISRA C for C
    發表于 08-08 15:54 ?0次下載

    embOS的MISRA-C:2012一致性

    MISRA C是汽車工業軟件可靠性協會(MISRA)開發的一套針對C編程語言的軟件開發指南,目的是提升嵌入式系統的安全性和可移植性。2012
    的頭像 發表于 08-20 11:35 ?1406次閱讀

    C2000? MISRA-C策略

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

    C語言安全編碼指南:MISRA C、CERT C、CWE 與 C Secure 標準對比與Perforce QAC應用詳解

    如何編寫真正安全C語言代碼?指南涵蓋MISRA C、CERT、CWE等國際安全編碼標準對比,以
    的頭像 發表于 01-26 17:38 ?818次閱讀
    <b class='flag-5'>C</b>語言<b class='flag-5'>安全</b>編碼指南:<b class='flag-5'>MISRA</b> <b class='flag-5'>C</b>、CERT <b class='flag-5'>C</b>、CWE 與 <b class='flag-5'>C</b> Secure 標準對比與Perforce QAC應用詳解