根据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激活之外什么也没有