gpt4 book ai didi

c - MISRA-C 2012 规则 10.8 查询

转载 作者:行者123 更新时间:2023-11-30 14:48:29 28 4
gpt4 key购买 nike

我违反了 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_tuint64_tuint32_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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com