MISRA C ++(规则18-4-1)和动态内存分配-是否允许std :: string?

Xof*_*ofo 3 c++ embedded heap-memory misra

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

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

请参阅:http : //dist.sonarsource.com/reports/coverage/misra_c++_2008.html

根据此规则,std::stringMISRA C ++规则允许std::string这样做,因为当字符串变大时确实会分配内存。另外,什么样的课程std::stringstream呢?

use*_*101 5

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

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

因此,如果您在嵌入式系统中询问“我可以使用std :: stringstream”,则说明您已经从一个糟糕的前提出发,不应为安全关键型设备编写软件。


  • 请注意,MISRA并非仅用于安全关键型或实时需求型系统。如今,它已成为各种嵌入式系统的事实上的标准。尽管在微控制器实时系统中使用堆分配和标准库功能没有任何意义,但在某些更高级别的,类似于PC的嵌入式应用程序中使用它们可能是可以接受的。没有人关心确定性行为或实时性能,而只想使用MISRA作为清除错误的一种方式的应用程序。 (3认同)