【发布时间】: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