【发布时间】:2014-08-21 12:02:11
【问题描述】:
根据 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 cmets 放入,通过生成器放入 cmets 是虽然而且主要是难以追踪的。
--e{(9007))} 在宏定义中可以工作,但我们也有类似的代码
foo = GET_SIGNAL1();
这将导致功能范围内的停用。
也考虑过 -ecall,但它只是检查调用本身,而不是宏的上下文(如我所愿)。
编辑:
我既不能影响模型也不能影响工具链。我唯一能影响的部分是 lint 配置或宏定义之类的“胶水代码”
【问题讨论】:
-
请问您为什么要对生成的文件运行 lint?一般是为了避免手写c的常见问题,生成的c应该是正确的,不需要那么清晰。
-
不确定你会在这里期待什么样的魔法,你已经关闭了所有途径来获得明显的解决方法。最简单的方法是停止违反规则。可以像使用 |而不是||。下一个最好的办法是将此代码隔离在其自己的 TU 中,以便您可以应用全局覆盖。
-
@HansPassant 如果这不会改变行为,我认为这依赖于短路,这样
GET_SIGNAL2只能在GET_SIGNAL1运行时运行 -
@Vality MISRA 也适用于自动生成的代码。唯一的区别是将规则分类为强制性、必需和建议性变更。
-
@HansPassant 但这将是按位比较,而不是强制执行第二面。我想我知道你的意思,但那是一种不同的语言