1

根据 MISRA 规则 13.5,逻辑 && 或 || 的右手操作数 运算符不应包含持久的副作用。我们的代码使用 PC-Lint 检查,消息 9007 ( http://gimpel-online.com/MsgRef.html#9007 )。

我们有表格的代码

if((GET_SIGNAL1() < CONST_1) || (GET_SIGNAL2() == CONST_2) ) { dostuff(); }

GET_x 是宏,好吧,通过一些错误处理来获取信号 x,后者会导致预期的副作用。给出了对 MISRA 13.5 的规则偏差,现在的问题是如何抑制相应的消息。

到目前为止的努力:由于这是自动生成的代码,我不能直接放入 lint 注释,通过生成器放入注释虽然并且主要是难以追踪的。

宏定义中的 --e{(9007))} 可以工作,但我们也有类似的代码 foo = GET_SIGNAL1(); 会导致函数范围的停用。

也考虑过 -ecall,但它只是检查调用本身,而不是宏的上下文(如我所愿)。

编辑:

我不能影响模型和工具链。只有我能影响的部分是 lint 配置或“胶水代码”,如宏定义

4

2 回答 2

1

你可以修改生成器以输出一个新的宏,如下所示:

#define TEST_SIGNALS(a,b,c,d)   ((a<b) || (c<d))

if (TEST_SIGNALS(GET_SIGNAL1(), CONST_1, GET_SIGNAL2(), CONST_2))
{
   dostuff()
}

并像这样禁用警告:

//lint -emacro(9007, TEST_SIGNALS)
于 2014-08-21T13:43:24.107 回答
0

我们打算通过两次 Lint 运行来解决上述问题:

  • 第一次运行生产代码和全局停用消息 9007
  • 第二次使用存根宏运行,没有预期的副作用,但只有消息 9007 被激活
于 2014-09-03T05:59:45.610 回答