NASA C编码规则:误用指针

时间:2015-01-13 18:34:14

标签: c pointers

本文件http://pixelscommander.com/wp-content/uploads/2014/12/P10.pdf描述了NASA / JPL实验室用于在C中安全编码的10条内部规则。非常有趣。

规则9说:

  

规则:应限制指针的使用。具体来说,不超过一个级别   允许解除引用。 (...)不允许使用函数指针。   理由:指针很容易被误用,即使是经验丰富的程序员也是如此。 (...)

我的问题是:

  1. 如果只允许1级derefercing,你如何处理元素的二维矩阵?
  2. 如果您编写通用算法(数值积分,零或最小查找算法等),如果不允许函数指针,您如何使用它?您是否每次都使用不同的功能复制粘贴代码?
  3. 你明白“指针经常被误用”是指什么?

3 个答案:

答案 0 :(得分:6)

  1. 手工编制索引。对于mxn矩阵,对于点i,j,索引是[i + j * n]。不适用于锯齿状阵列。
  2. 是的,或使用宏疯狂。
  3. 违反严格别名,访问未初始化数据,访问释放数据,访问越界数据,错误地转换指针所指向的内容,将指针错误地转换为整数,将函数指针强制转换为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)

  1. 如果只允许1级derefercing,你如何处理元素的二维矩阵?
  2. 答案:通过声明固定的数组长度,您不需要多个间接级别。

    void blaster(char array [5][50]) {}
    
    1. 如果您编写通用算法(数值积分,零或最小查找算法等),如果不允许函数指针,您如何使用它?您是否每次都使用不同的功能复制粘贴代码?
    2. 答案:使用标识符和case语句。

      switch (rocketfunction) {
          case LAND:      reversethrust(); break;
          case TAKEOFF:   fullthrust(); break;
          default:        convert_Feet_2_Metres(height);
      }
      
      1. 你明白什么&#34;指针经常被滥用&#34;可以参考?
      2. 答案:只看一下与指针误用有关的过多StackOverflow问题。