gpt4 book ai didi

c++ - 安全编码实践

转载 作者:行者123 更新时间:2023-12-05 09:34:41 25 4
gpt4 key购买 nike

我正在启动一个新的 C/C++ 嵌入式应用程序,并尝试自学安全编码实践,例如 MISRA、AUTOSAR 和我目前最喜欢的可能是因为它是最短的,即 NASA 所谓的 10 的幂 (https://en.wikipedia.org/wiki/The_Power_of_10:_Rules_for_Developing_Safety-Critical_Code) .我可以看到许多规则背后的逻辑。但它们都试图消除或限制动态内存分配。例如,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 指南,不能使用像字符串和 vector 这样的 C++ 库吗?
  6. 根据指南的“不安全”动态内存分配的任何其他示例将不胜感激

谢谢 - 吉恩

最佳答案

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

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

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

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

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

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

关于c++ - 安全编码实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66402881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com