【问题标题】:Inhibit lint message 9007禁止 lint 消息 9007
【发布时间】: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 但这将是按位比较,而不是强制执行第二面。我想我知道你的意思,但那是一种不同的语言

标签: c misra pc-lint


【解决方案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)

【讨论】:

  • 好主意,但我不能影响包括生成器在内的模型和工具链
【解决方案2】:

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

  • 第一次运行生产代码和全局停用消息 9007
  • 第二次使用存根宏运行,没有预期的副作用,但只有消息 9007 被激活

【讨论】:

  • 不接受这个作为答案,如果您有类似的问题,仅供参考
猜你喜欢
  • 2021-05-15
  • 2019-10-03
  • 2014-11-26
  • 1970-01-01
  • 2023-04-02
  • 2021-03-21
  • 2018-12-02
  • 2019-02-28
  • 2021-05-11
相关资源
最近更新 更多