【问题标题】:MISRA C++ (rule 18-4-1) and Dynamic Memory Allocation - Is std::string permitted?MISRA C++(规则 18-4-1)和动态内存分配 - 是否允许 std::string?
【发布时间】:2018-06-13 20:42:46
【问题描述】:

MISRA C++ 规则 18-4-1 说:

不应使用动态堆内存分配。

见:http://dist.sonarsource.com/reports/coverage/misra_c++_2008.html

根据这条规则,MISRA C++ 规则允许std::string,因为std::string 确实在字符串变大时分配内存。另外,std::stringstream 这样的类呢?

【问题讨论】:

  • 我无权访问该文档,但是否存在与使用标准库相关的其他规则以及在任何情况下都会排除使用 iostream 的例外情况?根据 MISRA,您可以通过适当的偏差声明程序做任何您认为必要的事情;你应该问自己的是这是否是一个适当的偏差?除非有符合 MISRA 的合同要求,否则您需要自己思考并了解具体应用中的后果。
  • 感谢您的 cmets!
  • std::vector添加到列表中
  • 我问过这个问题是因为 AUTOSAR 规范对 C++ 的要求不如 MISRA 严格。 AUTOSAR 规范可以在这里阅读 - autosar.org/fileadmin/user_upload/standards/adaptive/17-03/…

标签: c++ embedded heap-memory misra


【解决方案1】:

不,不允许托管 std::stringstd::stringstream。而且,如果您是在嵌入式系统上编程的,那么您极不可能使用这些结构。嵌入式系统很少需要完整的标准库(尤其是像 std::stringstream 这样庞大而缓慢的库)及其附带的一切,包括 RTTI、异常、动态内存分配等。

如果您使用的是某种类型的 STL,它要么是手写的,要么是专门针对嵌入式系统的。除非您正在编写操作系统内核,否则它们很可能会使用静态内存分配器或其他策略而不是动态分配。

所以,如果你问“我可以在嵌入式系统中使用 std::stringstream”,那么你的前提已经很糟糕了,不应该为安全关键设备编写软件。


【讨论】:

  • 请注意,MISRA 并非专门用于安全关键或实时要求高的系统。它是当今各种嵌入式系统的事实上的标准。虽然在微控制器实时系统中使用堆分配和标准库功能没有意义,但在一些更高级别的、类似 PC 的嵌入式应用程序中使用它们可能是可以接受的。没有人关心确定性行为或实时性能,但只想使用 MISRA 作为清除错误的一种方式的应用程序。
猜你喜欢
  • 2018-06-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2012-10-29
  • 1970-01-01
相关资源
最近更新 更多