- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我违反了 MISRA-C 2012 规则 10.5,以下是示例代码:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
typedef long long sint64;
typedef unsigned long long uint64;
typedef unsigned long uint32;
#define ntohll(x) ( ( (uint64)(ntohl( ((x << 32) >> 32) )) << 32) | ntohl( ((uint32)(x >> 32)) ) )
void main()
{
sint64 pul_total;
sint64 a;
pul_total = ntohll(a); /* Rule 10.8 Violation*/
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++解决我在下面尝试的问题:
#define ntohll(x) ( ( (uint64)(ntohl( ((x << 32) >>(uint32)32) )) << (uint32)32) | ntohl( ((uint32)(x >>(uint32) 32)) ) )
但是,如果我像下面这样,违规行为就会被删除:
#define ntohll(x) ( ( (uint64)(ntohl( ((x << 32) >> 32) )) << 32) | ntohl( ((uint32)((uint32)x >> 32)) ) )
但根据我的理解,在移位操作的情况下,将有符号变量转换为无符号变量可能不是一个好主意。
需要一些帮助来解决同样的问题...
最佳答案
这整个代码绝对不符合 MISRA-C 标准。
首先,有一些不太重要的挑剔。指令 4.9 规定应完全避免类似函数的宏。规则 7.2 规定您必须在所有整型常量上使用 u
后缀。
这里最严重的是违反了 10.1,其中规定“移位和按位运算只能对本质上无符号类型的操作数执行”。
您左移了一个有符号的操作数 - 如果该操作数为负数,您的代码将调用未定义的行为,并且您有一个严重的错误。然后,您还可以右移一个有符号操作数,如果操作数为负数,则会调用实现定义的行为。这些不仅仅是一些误报,而是您必须修复的实际错误。最简单的修复方法是在进行任何移位之前将 x
转换为 uint64_t
。
我认为没有违反 10.5,这会强制转换为不适当的类型。从有符号转换为无符号是可以的。
但是,正如您的评论所示,违反了 10.8 - 该规则不允许将“复合表达式”的结果转换为不同的类型类别,在您的情况下来自 sint64_t
到 uint64_t
或 uint32_t
。这也可以通过在执行其他操作之前转换为 uint64_t
来解决。
10.8 的(相当奇怪的)基本原理是,一些初学者认为 (uint32_t)(u16a + u16b);
之类的强制转换意味着 + 操作在 上执行uint32_t
,这是不正确的。
现在真正的问题是所有这些转变实际上想要实现什么目标;我不清楚。宏相当困惑。如果目的是清除变量的某些位,则应使用位掩码(按位 &
)来完成。如果由于原因必须使用未知的有符号变量并且必须保留符号,则位掩码可以简单地跳过符号位。
修复此代码的最佳方法是完全重写该宏。就目前情况而言,它永远不会通过 MISRA-C,这是一件好事。
关于c - MISRA-C 2012 规则 10.8 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50372279/
我无法解决此行中的 Misra 规则 11.6 警告: uint32_t * delay = (uint32_t *)0x40086D0C ; [仅供引用: typedef long unsigned
MISRA 标准不允许在宏定义中使用字符串化运算符在不使用 # 运算符的情况下实现相同概念的替代方法是什么? 最佳答案 实际上并没有任何直接的替代方案——只有变通办法。此建议规则与建议不要使用类似函数
MISRA 标准不允许在宏定义中使用字符串化运算符在不使用 # 运算符的情况下实现相同概念的替代方法是什么? 最佳答案 实际上并没有任何直接的替代方案——只有变通办法。此建议规则与建议不要使用类似函数
我对misra和按位运算有一些理解问题。 我有以下操作: ((in >> bit) & 1u) 这里in有类型 unsigned short和 bit有类型 int . 1u应该是 unsigned
根据 MISRA 规则,我遇到此错误:不能对有符号整数执行按位运算。 typedef unsigned __int8 gUBYTE; typedef gUBYTE gBORDER;
C标准要求,在表达式中使用时,排名低于“int”且其值在“int”范围内的无符号类型的值总是提升为“signed int”。因此,假设如下: uint8_t a,b; if ((a-b) > (uin
我有这个功能: void InitS(unsigned int &numS){ // this function returns a container for unsigned int
我需要一些关于 C++ 内存管理和 MISRA 指南的说明.. 我必须实现一个与 MISRA 兼容的程序,所以我必须遵守一条重要规则:不可能使用"new"运算符(动态内存堆)。 在这种情况下,对于任何
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
我了解 MISRA-C 标准适用于嵌入式固件。当嵌入式 Linux 是您的产品平台时,您的嵌入式应用程序能否/应该开发为符合 MISRA-C 标准?有没有人考虑过这样的练习? 我的一般感觉是,您必
我写了下面一段 MISRA 不喜欢的代码: UartPtr->C &= ((uint8_t)(~SIO_C2_SBK)); 与 #define SIO_C2_SBK ((uint8_t)0x01u)
MISRA 中的规则 2.2 规定“源代码应仅使用 /* ... */ 样式注释”。有谁知道这条规则的基本原理是什么? //出了什么问题风格评论? 最佳答案 MISRA 1998 和 2004 仅支持
类函数宏是 #define ARRAYSIZE(_Array) ((sizeof(_Array)) / (sizeof(_Array[0]))) 显示的错误是: Error[Pm154]: in t
是否可以禁用外部库的 MISRA 检查?我已经尝试过这个,但它似乎不起作用(此 header 使用 C++ 风格的注释和不兼容的 @ 标签)。 #pragma ghs startnomisra #in
我创建了一个函数来添加数组中的下一个数字。代码很简单,如下 int math(int *address, int size) { int sum = 0; for (int i = 0
我遇到了有关环绕错误的 MISRA 标准问题。我试图通过查看互联网上可用的选项来解决它,但仍然无法解决它,因为仍然无法找到一些可行的解决方案。 我提供一个简单的例子来解释我的情况。 由于 MISRA
我正在尝试读取之前写入 NVM 闪存的变量的值。 我的代码是: uintptr_t address = getAddress(); //[MISRA C++ Rule 5-2-8] cast from
MISRA C++ 规则:5_0_3 尝试使用一种符合 MISRA 标准的静态工具分析器,但无法解决。 #include #include using namespace std; int main(
我有以下行(减少到最低限度地展示问题): char version_text[64U] = {'\0'}; 此行生成以下 MISRA 错误: Error[Pm023]: missing element
我有一个读/写一些内存映射寄存器的裸机程序(驱动程序)。例如: void foo_read(uint64_t reg_base, uint32_t *out_value) { *out = R
我是一名优秀的程序员,十分优秀!