微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

安全编码实践

如何解决安全编码实践

我正在启动一个新的 C/C++ 嵌入式应用程序,并试图让自己了解 MISRA、AUTOSAR 和我目前最喜欢的安全编码实践,这可能是因为它是最短的,NASA 所谓的 10 次幂 ({{3} })。我可以看到许多规则背后的逻辑。但他们都试图消除或限制动态内存分配。例如,MISRA C++ 规则 18-4-1 说:“不应使用动态堆内存分配”,而 NASA 的规则 3 是“避免堆内存分配”。 AUTOSAR 的限制较少。我理解他们的意图是确保系统不会耗尽内存,但我不太清楚 C 或 C++ 编译器将什么分配为“动态堆内存分配”或“堆内存分配”。我会编辑这篇文章以提出具体问题

  1. 这是否意味着例如所有变量都需要是静态的? (已经由@klutt 回答
  2. 为了确保我理解正确,根据 MISRA、AUTOSAR 和 NASA 指南,临时变量是否在堆栈上声明的方法中定义并因此是“安全的”?
  3. 根据 AUTOSAR 和 NASA 指南,初始化后不能使用“new”?
  4. C++ 库数组是否符合 MISRA、AUTOSAR 和 NASA 指南?
  5. 但是根据 AUTOSAR 和 NASA 指南,不能使用字符串和向量等 C++ 库?
  6. 根据准则的“不安全”动态内存分配的任何其他示例 将不胜感激

谢谢 - 基因

解决方法

MISRA 规则的核心是动态内存分配问题

  1. 程序员天生就是懒惰的,不会检查 malloc() 的返回状态,从而导致使用空指针。
  2. 堆碎片的一般问题
  3. malloc() 及其同级的不完整标准定义,其中充斥着未定义、未指定和实现定义的行为,这使得编译器和实现之间具有可移植性,因此具有一定程度的不可预测性行为。

MISRA C/C++ 的一些派生类(例如 JSF、NASA JPL、AUTOSAR)允许在初始化阶段使用 malloc()(但不允许使用 realloc() 等或随后的 free())消除了所有碎片问题 - 但没有解决不完整的定义。

当然,自定义解决方案可能是完全可以证明的,在这种情况下,偏离 MISRA 规则是可以的。

但总的来说,使用动态内存的弊端超过了任何潜在的好处。

免责声明:是的,我与 MISRA 有关联……查看个人资料

,

这是否意味着例如所有变量都需要是静态的?

不,它们也可以是本地范围(自动存储)。如果在文件范围内声明,它们通常应该是 static(受 MISRA-C 和其他人的鼓励)。

为了确保我理解正确,根据 MISRA、AUTOSAR 和 NASA 指南,临时变量是否在堆栈上声明的方法中定义并因此是“安全的”?

是的。虽然您需要考虑堆栈溢出,但那是另一回事了。

根据 AUTOSAR 和 NASA 指南,初始化后不能使用“new”?

是的。

根据 MISRA、AUTOSAR 和 NASA 指南,C++ 库数组是否可以?

完全没有,您可以使用标准库的哪些部分会受到限制,尤其是在 MISRA-C++ 中。 MISRA 指南中有一个章节说明了不应使用哪些标头的规则。不过这些都非常松懈,只禁止最疯狂的东西,比如 setjmp.h 和其他托管系统的东西,比如 signal.h。

对于更高级别的安全关键系统,如果可能,您最终会要求标准库本身也遵循 MISRA。这种情况很少发生,所以大多数情况下,您会尝试完全远离标准库。

但是根据 AUTOSAR 和 NASA 指南,不能使用字符串和向量等 C++ 库?

不,他们不能。 C++ 库一般不适合嵌入式系统。就我个人而言,我永远不会将 C++ 用于任何远程安全关键的事情,而且我在将 C++ 用于一般嵌入式项目方面的经验非常糟糕。

可以很好地使用它,但是它需要 C++ 程序员的很多东西,本质上你需要充分了解哪些部分构成了安全子集,哪些部分没有,以及每个 C++ 行会产生什么样的汇编结果。一般的 C++ 程序员没有足够的技能来做到这一点,所以如果 C++ 可用,他们很快就会在项目中引入危险或臃肿的功能。

此外,该语言从 C++11 及更高版本开始变得更加混乱,变得越来越不适合具有更糟糕定义行为、更多类型双关规则和指针别名等的嵌入式系统。为了记录所有糟糕的情况——在 C++ 中定义的行为,你可以写一本厚书。

任何其他根据指南的“不安全”动态内存分配示例将不胜感激

主要是 doesn't make any sense 在嵌入式系统中使用。如果您知道如何在 MCU 中实现堆,那么常识就足以了解为什么堆不能满足任何目的。但也因为动态分配假设某种方式的非确定性行为是可以的,这在安全相关软件中绝非如此。


关于这些 NASA 规则,它们非常肤浅和幼稚。其中大多数不言而喻,而 MISRA-C 则要深入得多。您可以将 NASA 规则视为初学者级别的东西而不予理会:直到 2006 年才提出这些规则的人似乎都错过了 1990 年代有关开发更安全的 C 子集的所有研究。

此处讨论了 NASA 从未管理过的关于“无函数指针”的愚蠢规则:State Machine with no function pointer

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。