【问题标题】:Misra standard for embedded software嵌入式软件的 Misra 标准
【发布时间】:2010-09-08 22:37:12
【问题描述】:

我需要使大量代码符合 MISRA。
第一个问题:有人可以根据经验给出一个估计,以通过嵌入式系统编写良好的代码。我知道“写得好”的定义不明确且含糊不清,因此我要求进行原始估计。
第二个问题:对可定制(即允许抑制特定警告)并用于自动构建环境(即命令行界面)的工具的任何建议
任何其他有助于完成此任务的有用建议。
谢谢伊利亚。

【问题讨论】:

  • 这个问题很大程度上取决于您需要哪个版本的 MISRA。最新的 2012 版本仍然缺乏许多公司的工具支持。

标签: c code-analysis embedded misra


【解决方案1】:

我也强烈推荐 PC-Lint。如果您碰巧使用 Visual Studio 编译代码,我推荐 Riverblade 的插件“Visual Lint”。如果无法在 Visual Studio 中编译代码,仍然可以从命令行运行 PC-Lint,效果很好。

一些嵌入式系统编译器提供 MISRA 合规性测试作为编译器警告。我使用 IAR 编译器进行 Arm7/Arm9 开发。它在编译器设置中提供了一个易于配置的 MISRA 合规性检查表。

很难想出一个经验法则来估计使一些编写良好的代码符合 MISRA 所需的时间。很大程度上取决于程序员现有的编码习惯以及他们首先遵循 MISRA 规则的程度。

粗略估计:
2 - 3 天后熟练使用 PC-Lint。
使现有代码符合 MISRA 的初步阶段:首先花费 10% 到 25% 的时间编写代码。
保持代码符合 MISRA:代码开发增加了 5% 到 10%。其中一半的成本是改变编码人员的习惯,以遵循“MISRA 方式”做事。另一半是代码测试和检查的额外成本,以确保符合 MISRA。

【讨论】:

  • 请注意,这些工具都不支持 MISRA-C:2012。我最近问 IAR 他们是否支持它,他们似乎甚至不知道有一个新版本出来......
  • 话虽如此,我还是建议您购买便宜的工具,例如 Lint。它会发出数百个错误警告,但所谓的“最先进”的静态分析器也会如此。在 MISRA 检查方面,像 LDRA och Klocwork 这样的昂贵工具与 Lint 一样有缺陷。
【解决方案2】:

如果您遵循相当好的编程实践,则使代码符合 Misra 并不是一件苦差事。你可能会发现一些指针规则有点棘手,如果你试图让代码符合一些奇怪而美妙的指针算法。

我对 Greg 的 PC Lint 推荐第二,但开源 Splint 也值得一看,尽管在它们(和编译器的警告系统)之间,我估计你仍然只能覆盖 80% Misra 规则 - 其余的可能需要手动审查代码。

【讨论】:

    【解决方案3】:

    我使用 PC Lint 对 C 和 C++ 代码进行静态分析。它可以配置为显示违反了哪些 MISRA 规则,并且它具有命令行界面。

    【讨论】:

      【解决方案4】:

      我使用了一个名为QAC 的商业工具。该工具能够强制执行MISRA

      它有一个命令行界面,因此您可以将其设置为在自动构建环境中运行。要应用的规则是可配置的,但希望有人花一些时间来设置它。 MISRA 的执行非常简单,并且运行良好。有人告诉我(这只是第三手),这是一些机构(例如 FDA)用来评估代码的工具之一。像大多数静态分析工具一样,需要处理噪声(误报)。我上次使用它时,它没有很好的方法来标记/阻止误报再次发生(不更改它所抱怨的代码)。

      我怀疑初级工程师最多需要一周(4-5 天)来设置它(假设他们决心让它按照你的意愿工作)。

      另一方面,其他商业静态分析工具也可能执行 MISRA。据报道(根据他们的销售代表),Klocwork 确实如此。

      【讨论】:

      • 不应指派初级工程师转换代码以符合 MISRA。根据我的经验,他们最终会盲目地遵循该工具的警告,无论使用何种工具,大多数警告都是错误的。它们造成的问题可能比解决的问题多。
      【解决方案5】:

      我们在修改 Misra 规则时遇到了类似的问题。我们在一个大型项目中遇到了一些代码质量问题,因此决定使用 MISRA 来提高代码质量。

      我们使用支持 MISRA C 规则的 Green Hills 编译器。也有独立的检查器可用。根据您想要执行的操作,打开所有规则可能有点过头了。我们一次打开一个规则,让人们有时间解决有限数量的类似问题,否则您会完全被错误的数量所淹没。

      由于我们的警告是由编译器而不是由独立工具生成的,因此您在开发时会看到错误,而不仅仅是在运行检查器时。随着我们继续开发,我们的代码符合要求,而不是一蹴而就。这也可以防止旧习惯破坏新代码,导致您以后不得不再次修改代码。

      有时很难让旧代码兼容,因为没有人确切知道代码是如何工作的。我希望你有单元测试。

      【讨论】:

        【解决方案6】:

        我明白这是一个老问题,但为了任何其他考古学家(或搜索者)的利益,重要的是要记住 MISRA 提供了不应总是盲目遵循的指南

        我建议在编写新代码时考虑 MISRA;因此,保持合规性会容易得多。

        但是,这并不总是可行的 - 尤其是在尝试对代码进行逆向工程以符合准则时。在这种情况下,我建议您专注于必需的规则,并将咨询视为奖励......成本v收益也适用于此!

        另外,请记住存在偏差过程 - 最好保持干净和可维护的代码有偏差,而不是设计一些合规但难以辨认的意大利面条。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-01
          相关资源
          最近更新 更多