我正在try 修复我的代码与misra C的符合性.在静态分析期间,我遇到了以下违规行为:

规则12.1:建议加括号.条件运算是

代码为:

if (CHANNEL_STATE_GET(hPer, channel) != CHANNEL_STATE_READY)
{
    retCode = ERROR;
}

其中CHANNEL\u STATE\u GET是一个宏,如下所示:

#define CHANNEL_STATE_GET(__HANDLE__, __CHANNEL__)\
  (((__CHANNEL__) == CHANNEL_1) ? (__HANDLE__)->ChannelState[0] :\
   ((__CHANNEL__) == CHANNEL_2) ? (__HANDLE__)->ChannelState[1] :\
   ((__CHANNEL__) == CHANNEL_3) ? (__HANDLE__)->ChannelState[2] :\
   ((__CHANNEL__) == CHANNEL_4) ? (__HANDLE__)->ChannelState[3] :\
   ((__CHANNEL__) == CHANNEL_5) ? (__HANDLE__)->ChannelState[4] :\
   (__HANDLE__)->ChannelState[5])

你有什么办法解决这一违规行为吗?

BR,

推荐答案

注(Lundins comments 或多或少暗示了这一点……),我回答了更多关于如何处理MISRA发现的问题(以及我遭受的其他一些分析工具的发现).

首先,我想从一个更好的Angular 来理解这个发现实际上描述了什么.对于如图所示的嵌套 struct ,这需要重新审视.所以

我会应用缩进,只是为了在编辑时更方便,然后,在邀请的地方再添加()个,例如,在本例中,将每个x?y:z个放在一对中.

#define CHANNEL_STATE_GET(__HANDLE__, __CHANNEL__)\
  (        ((__CHANNEL__) == CHANNEL_1) ? (__HANDLE__)->ChannelState[0] :\
    (      ((__CHANNEL__) == CHANNEL_2) ? (__HANDLE__)->ChannelState[1] :\
      (    ((__CHANNEL__) == CHANNEL_3) ? (__HANDLE__)->ChannelState[2] :\
        (  ((__CHANNEL__) == CHANNEL_4) ? (__HANDLE__)->ChannelState[3] :\
          (((__CHANNEL__) == CHANNEL_5) ? (__HANDLE__)->ChannelState[4] :\
                                          (__HANDLE__)->ChannelState[5]  \
          )                                                              \
        )                                                                \
      )                                                                  \
    )                                                                    \
  )

This is to address what the quoted finding is about.
I would not feel bad about sprinkling a few more around e.g. each CHANNEL_N.

(我承认,我没有针对MISRA判断器测试我的代码.我试图提供一种方法.我希望这可以修复提到的发现,可能用另一个发现替代它……根据我的经验,MISRA擅长这一点……我甚至不希望这能解决所有发现.)

C++相关问答推荐

CC crate 示例不会与C函数链接

有效地计算由一组点构成的等边三角形和等腰三角形的数量

从组播组地址了解收到的数据包长度

如何调试LD_PRELOAD库中的构造函数?

使用sscanf获取零个或多个长度的字符串

在基本OpenGL纹理四边形中的一个三角形中进行渲染

GDB输出ARM助记符

获取每个循环迭代结束时的当前时间

错误Cygwin_Except::Open_stackdupfile:正在转储堆栈跟踪是什么?

用C++从外部ELF符号读取值

GTK函数调用将完全不相关的char* 值搞乱

在C语言中,指针指向一个数组

`预期说明符-限定符-列表在‘(三元运算符中的’token`‘之前

C:面筋蛋白';为什么不刷新窗口?

函数指针作为函数参数 - 应该使用 const 吗?

使用复合文字数组初始化的指针数组

malloc 属性不带参数

free后内存泄漏?

C23 中是否有 __attribute__((nonnull)) 的等效项?

文件指针引起的C程序分段错误