【问题标题】:Safe coding practices in c : switching from dynamic to static memory allocationc 中的安全编码实践:从动态内存分配切换到静态内存分配
【发布时间】:2021-05-10 09:51:05
【问题描述】:

我正在研究嵌入式系统,我的目标是提高现有代码的安全性。我正在努力遵守美国宇航局的规定:https://en.wikipedia.org/wiki/The_Power_of_10:_Rules_for_Developing_Safety-Critical_Code

现有代码包含动态分配的实例和变量,这很常见,我需要将程序转换为静态内存分配。

是否有通用的实践和模式可以在不破坏代码的情况下成功地从动态内存分配切换到静态内存分配?

特别是,我遇到了这类 malloc 的问题:

unsigned short int * residuals = NULL;
residuals = (unsigned short int *)malloc(sizeof(unsigned short int)*input_params.x_size*input_params.y_size*input_params.z_size);

// in a other file 

block_samples[read_samples] = residuals[x + y*input_params.x_size + z*input_params.x_size*input_params.y_size]

// something else i have trouble with : double pointers 
predictor_params.weight_init_table = (int **)malloc(sizeof(int *)*input_params.z_size); 

当我尝试在 GDB 中使用以下消息静态分配它们时出现段错误:

zero carry parity adjust sign trap INTERRUPT direction overflow RESUME virtualx86 identification

【问题讨论】:

  • 静态分配到底是什么意思?您是否只是在顶层声明一个结构以进入数据段?在这种情况下,您根本无法更改分配的大小——它在编译时是固定的。或者您是在做一个 malloc,然后在整个过程中重用该内存?同样,这里的大小是相对固定的,除非您在需要更多空间时重新分配。 (您的安全规则中是否允许重新分配?)
  • 很明显,如果在编译时不知道最大大小,那么这段代码是不安全的。应该重构它以使用固定大小的缓冲区并在最初不适合的情况下进行多次计算。但也要注意,在嵌入式中,这可能只是溢出时间而不是空间。
  • 我认为当我在声明时分配内存时,分段错误与内存空间不足有关。正如@Lundin 在下面解释的那样,它更多的是关于安全而不是缺乏内存空间。我需要尽可能多地删除不确定的元素,malloc 的内存分配就是其中之一。

标签: c heap-memory


【解决方案1】:

是否有通用的实践和模式可以在不破坏代码的情况下成功地从动态内存分配切换到静态内存分配?

不,不是真的。您必须以非常激进的方式重写所有此类代码。

您必须了解为什么所有与安全相关的嵌入式系统都禁止malloc。主要原因是它是不确定的。您必须为每个此类项目指定最大尺寸,而不是允许完全可变的尺寸,以涵盖应用程序的最坏情况。

此外,像指针指向指针而不是二维数组之类的东西的存在相当肯定地表明,最初的程序员并不完全知道他们在做什么。

此外,您需要为 stdint.h 删除默认类型的 C。这是所有嵌入式系统的标准做法。

一般来说,我强烈建议放弃那些“NASA 规则”并改为实施 MISRA-C。这是一种方式更专业、更深入的文档。一些“NASA 规则”根本没有意义,其余的可以概括为“No s***t Sherlock”初学者级的东西,我们在学校的第一个初学者级 C 编程课上已经被告知.如果这些规则让某人感到意外,那么他们一开始就不应该编写任务关键型固件。

【讨论】:

  • 谢谢,我现在更明白老师要我做什么了!实际上,主要问题是确定内存分配并涵盖最坏的情况。您提到我需要为每个项目指定大小,是否有一个 c 函数可以静态地这样做(以字节为单位为对象分配给定的空间),或者您必须在声明时这样做?
  • @sytrics 必须在声明时完成,并且对象需要足够大以满足产品规范的要求。
猜你喜欢
  • 2014-09-14
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 2015-10-22
  • 2016-02-01
  • 1970-01-01
相关资源
最近更新 更多