【问题标题】:Is evaluating C expression in the function argument violating MISRA C guideline?在函数参数中评估 C 表达式是否违反 MISRA C 准则?
【发布时间】:2021-03-10 22:01:09
【问题描述】:

现在考虑以下代码在安全关键嵌入式软件中执行,其中gcc_optimization_level 的大小为 Level2。说一个函数,void foo(float v); 被调用为foo(a/b); 其中说ab 也是float。调用函数 foo 时计算 C 表达式 a/b 是否违反任何 MISRA C 准则?

ps:本题是上周较弱制定的上一版本修改的。现在这个问题确保它是一个单一的问题,而不是一个家庭作业问题,希望不会引起意见。

【问题讨论】:

  • 为什么不编写这段代码并通过 MISRA 检查器运行? MISRA 是一个过于严格的标准,即使这样无辜的事情可能会被标记,我也不会感到惊讶。
  • 无论如何,查看 MISRA-C 指南,我没有看到任何会限制函数调用中表达式评估的内容。
  • “编译器优化”(标记,并提到了一些特定的编译器)与 MISRA 有什么关系?我会说代码违反了建议规则,即您应该使用float32_t 而不是float。但是谷歌上提供了 MISRA 2008 pdf - 你读过吗?您是否尝试过搜索您可能违反的规则?你能展示真正完整的代码而不是片段吗?您担心此类代码可能会破坏哪些特定规则?它与优化有什么关系?
  • a/b 除法中检查溢出或被零除是否有一些要求?也许在函数调用表达式中这样做会更难遵守?
  • 亲爱的@EugeneSh。是否有任何 MISRA 检查器可以插入此代码并进行检查?我曾经有一个可以进行这些检查的 IDE,但我不再拥有该 IDE 的许可证 :(

标签: c compiler-optimization misra


【解决方案1】:

只要类型正确,MISRA C 中就不会阻止调用 foo( a / b )

在 MISRA C 中,essential types 的概念是尝试将更强的类型引入 C 语言 - MISRA C:2012 的附录 D 对此进行了详细说明,并执行了规则 10.x 指南。

同样,除了第 4.2 节“了解编译器”和第 5.3.1 节“编译器配置”讨论必要知识(未详细说明任何指南)之外,MISRA C 中没有任何内容讨论优化级别。这些部分现在构成了(freely downloadable) MISRA Compliance 的一部分。

免责声明:见简介。

【讨论】:

  • 我的看法是,如果函数被声明为 void foo (double);,这将违反 MISRA-C。 a / b 应该是 MISRA 所谓的“复合表达式”,然后有一条规则 10.6 反对将其分配给相同基本类型的更广泛的变量。这假设函数调用被 MISRA 视为赋值,因为这是 C 标准处理它们的方式。
  • 是的,但是 OP 有 void foo( float ) 所以我们没问题?
  • 谢谢@Andrew,我对你的回答很满意。感谢其他人的宝贵意见,我对您的 cmets 感到充实!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多