原标题:为啥美军方禁止在嵌入式C中使用malloc()?99%的人都不知道
想在C语言程序员之间开始一个激烈的,或者说有争议的讨论很简单,只需要问:“使用动态内存分配安全吗?”,由此可见这个问题的争议性之大。
那么,使用动态内存分配安全吗?
在C语言程序开发中,动态内存分配允许程序在运行时向系统申请内存使用,只不过在使用完毕后,需要显式的释放之,这就要求程序员对动态分配的内存了然于胸。
在非常重视安全(safety-critical)的嵌入式C语言程序开发中,动态内存分配广泛被认为是禁忌。使用C语言的malloc和free库函数可能会带来灾难性的副作用,例如内存泄漏或者碎片。此外,malloc常常会表现出极其不可预测的特性,这使其成为在多核系统上进行多线程C语言程序开发的瓶颈。
事实上,由于malloc存在安全风险,美国军方按照DO-178B标准,在safety-critical的嵌入式航空电子设备代码中禁止动态内存分配。
禁止动态内存分配
嵌入式行业的C语言程序员似乎对这个话题有着发自内心的反应。在最近的一次互联网技术小组讨论中,当提到问题:“在嵌入式C语言程序设计种是否使用动态内存分配?”时,77条回复称“使用动态内存分配是对系统容错性的最大危害之一”,还有5条回复称“如果希望系统正常运行时间能够达到‘5个9’(即99.999%),答案就是‘永远不会’使用动态内存分配”。
甚至有相关部门在招聘嵌入式C语言程序员时,会问求职者是否会使用动态内存分配,如果他们使用,就不会被雇用了。
为了通过相关的工作面试,也为了提升C语言代码安全,更好的办法是自定义一套内存分配器,一般分为两种:基于栈的分配器,以及基于本地线程的分配器。写出更安全稳定的C语言代码,就不该再使用标准库提供的malloc和free函数了。
为什么美国军方认为C语言标准库函数提供的动态内存分配管理函数malloc和free是个糟糕的选择呢?这其实要从malloc和free的设计上考虑,通常,它们是基于列表分配器算法的,该算法将内存池组织到单个链表中的连续位置,分配器管理该链表,每次分配实际上就是寻找空闲位置。这种分配器在各种情况下都能相当好的分配和释放内存,但是在极端的safety-critical系统中。返回搜狐,查看更多
责任编辑: