c 中的安全编码实践:从动态内存分配切换到静态内存分配

Safe coding practices in c : switching from dynamic to static memory allocation

我从事嵌入式系统方面的工作,我的目标是提高现有代码的安全性。我正在努力遵守 Nasa 的规则:https://en.wikipedia.org/wiki/The_Power_of_10:_Rules_for_Developing_Safety-Critical_Code

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

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

特别是,我对这些类型的 mallocs 有疑问:

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

Is there generic practices and patterns to succesfully switch from dynamic to static memory allocation without breaking the code ?

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

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

此外,诸如指向指针而不是二维数组之类的东西的存在非常肯定地表明最初的程序员一开始并不太清楚他们在做什么。

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

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