MISRA C指令4.6

问题描述 投票:0回答:1

表示大小和签名的typedefs应该用来代替基本的数字类型。

请问,您能帮帮我吗?为什么我的工具检测到这段代码有违规现象。

typedef int int_t;

我该如何解决这个问题?

misra
1个回答
2
投票

符号的位宽 int 取决于硬件架构(有时也取决于其他参数,如工具链的选择和配置).该类型只有一个最小的位宽值范围,但并不要求具有某些确切的属性。

与此相反的是,该类型的 int8_t, int16_t, int32_t, int64_t 和它们相应的无符号对应物(类型名称相同,但有一个 u 前缀)中定义的。stdint.h来提供一个精确的位宽值范围--但留下了一个问题,即当移植到不同平台时,它们的使用效率如何。

在嵌入式系统中(尤其是那些对安全、保安和可用性有要求的系统),主要关注的是对于一个给定的变量类型,每个平台都支持程序员所期望的位宽(或者反过来说,每个程序员都认识到所使用类型的限制)。优化是必要的和使用非固定宽度类型所引起的风险可以通过其他措施来防止(这时MISRA规则的偏离是合法的)。


1
投票

MISRA-C:2012支持C90及以后的标准。在现代 C 语言中,我们应该简单地使用 stdint.h 而不 typedef所以这是我强烈建议的。烹饪自己的自定义类型是不好的做法。

如果你只能使用C90,那么你需要制作 中的类型定义相同。stdint.h. 类似这样。

#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之前的所有内容。

上述内容需要放在某个项目的通用头中。

做同样的事情 bool, falsetrue 既然你没有 stdbool.h 在C90也。

© www.soinside.com 2019 - 2024. All rights reserved.