C语言 禁止线头消息9007



根据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();这将导致功能大面积停用。

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

编辑:

我不能影响模型和工具链。我能影响的部分只有lint配置或"粘合代码",比如宏定义

您可以修改生成器以输出一个新的宏吗?

#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)

我们打算用两个Lint运行来解决上面的问题:

  • 第一次运行生产代码和全局停用消息9007
  • 第二次使用存根宏运行,没有预期的副作用,但除了消息9007激活之外什么也没有

最新更新