簡體   English   中英

MISRA C 指令 4.6

[英]MISRA C Directive 4.6

應該使用指示大小和符號的類型定義來代替基本的數字類型。

拜托,你能幫幫我嗎? 為什么我的工具檢測到此代碼的違規行為:

typedef int int_t;

我該如何解決這個問題?

int的位寬取決於硬件架構(有時還取決於其他參數,如工具鏈的選擇和配置)。 該類型僅具有最小位寬/值范圍,但不需要具有某些確切的屬性。

相比之下,類型int8_tint16_tint32_tint64_t及其對應的無符號對應項(相同的類型名稱但帶有u前綴)在stdint.h中定義,以提供精確的位寬/值范圍 - 但問題是它們的效率如何移植到不同平台時可以使用。

在嵌入式系統中(尤其是那些有安全性、保密性和/或可用性要求的系統),主要關注的是對於給定的變量類型,每個平台都支持程序員期望的位寬(或者相反,每個程序員都認識到所使用類型的限制) )。 因此,一個好的建議是從固定寬度類型開始,只有在確實需要優化並且可以通過其他措施來防止使用非固定寬度類型帶來的風險時才使用其他類型(這在當時是合法的) MISRA 規則偏差)。

MISRA-C:2012 支持 C90 和更高版本的標准。 在現代 C 中,我們應該簡單地使用stdint.h而沒有typedef ,所以這就是我強烈推薦的。 編寫自己的自定義類型是不好的做法。

如果您堅持使用 C90,那么您需要制作stdint.h中存在的 typedef 相同的 typedef 像這樣的東西:

#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)
  typedef unsigned char uint8_t;
  /* and so on... */
#else
  #include <stdint.h>
#endif

C90 沒有定義__STDC_VERSION__而 C94 將其定義為199409L ,因此上述宏涵蓋了 C99 之前的所有內容。

以上需要放在一些全項目通用的header中。

boolfalsetrue做同樣的事情,因為 C90 中也沒有stdbool.h

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM