本文件http://pixelscommander.com/wp-content/uploads/2014/12/P10.pdf描述了NASA / JPL实验室用于在C中安全编码的10条内部规则。非常有趣。
规则9说:
规则:应限制指针的使用。具体来说,不超过一个级别 允许解除引用。 (...)不允许使用函数指针。 理由:指针很容易被误用,即使是经验丰富的程序员也是如此。 (...)
我的问题是:
答案 0 :(得分:6)
void*
,在整个代码中不必要地增加void*
,不释放数据,双重释放数据,释放堆栈分配数据...... 答案 1 :(得分:6)
如果只允许1级derefercing,你如何处理元素的二维矩阵?
void foo( int (*matrix)[COLS], size_t rows ) // one level of dereference
{
...
matrix[i][j] = new_value();
}
int main( void )
{
int m[ROWS][COLS];
...
foo( m, ROWS );
}
如果您编写通用算法(数值积分,零或最小查找算法等),如果不允许函数指针,您如何使用它?您是否必须每次使用不同的功能复制粘贴代码?
美国国家航空航天局并非使用C进行数字化工作;有远更好的工具可用。但是,是的,您必须编写非通用代码。
你明白什么"指针经常被滥用"可以参考?
指针误用的一个例子是类型双关语;使用指针强制将位模式解释为不同的类型:
double pi = 3.14159;
unsigned char *bytes = (unsigned char *) π
for ( int i = 0; i < sizeof pi; i++ )
printf( "%02x\n", bytes[i] );
如果您决定通过更改pi
中的一个值来更改bytes
中存储的值,则存在危险:
bytes[1] = 0x00;
虽然在某些情况下很有用,但这种编程会破坏验证代码的能力。任何寻找pi
更改的工具都很可能会错过这一点。
NASA最有可能将C用于低级系统控制器,航空电子设备和类似系统,其中复杂的数据结构和算法确实不是必需的,但可预测性和强大的错误处理是关键的。指针操作打开太多&#34;后门&#34;无法轻易找到并验证。
你忽略了这个理由的重要部分:
理由:指针很容易被滥用,即使是经验丰富的程序员也是如此。他们能 难以跟踪或分析程序中的数据流,尤其是基于工具的数据流 静态分析仪。类似地,函数指针可以严重限制类型 可以由静态分析仪执行的检查,只有在有静态分析器的情况下才能使用 他们使用的充分理由,并提供理想的替代手段来提供帮助 基于工具的检查器确定控制和函数调用层次结构的流程。对于 例如,如果使用函数指针,工具就无法证明 没有递归,因此必须提供替代保证来弥补 因为这种分析能力的损失。
答案 2 :(得分:4)
答案:通过声明固定的数组长度,您不需要多个间接级别。
void blaster(char array [5][50]) {}
答案:使用标识符和case
语句。
switch (rocketfunction) {
case LAND: reversethrust(); break;
case TAKEOFF: fullthrust(); break;
default: convert_Feet_2_Metres(height);
}
答案:只看一下与指针误用有关的过多StackOverflow问题。