根据MISRA规则13.5,逻辑&&or | |运算符的右手操作数不应包含持续的副作用。我们的代码是用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配置或“粘合代码”,如宏定义
最佳答案
是否可以修改生成器以输出如下新宏:
#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)