打印本文 打印本文 关闭窗口 关闭窗口
Linux下的代码淬火技术
作者:武汉SEO闵涛  文章来源:敏韬网  点击数733  更新时间:2009/4/25 0:45:45  文章录入:mintao  责任编辑:mintao
作者:宇文

  【IT168 实用技巧】我们知道,铁匠经常把金属工件加热到一定温度,然后突然浸在水或油中使其冷却,从而有效增加其硬度。类似的,软件开发人员也可以采取某种手段,从而显著提高软件的可靠性和质量,我们形象地称之为代码淬火技术。

    一、代码淬火的好处

    理想中,软件淬火技术首先能够预见代码中的哪些地方可能出错,然后,要么带给我们一种能够完全避免错误的方式编写代码,要么能及时识别出错误,从而更轻松地跟踪源代码。尤其是对于C语言,因为它不是一种安全语言,所以更需要软件淬火技术来提高软件的可靠性。本文将详细介绍Linux下常用的代码淬火方法。

    二、常见的码淬火技术

    代码淬火技术的形式各种各样,我们这里要讲的是帮助我们构建更加强健的代码的各种技术。

    1 .缓冲区溢出问题

    缓冲区是一个非常严重的安全问题,最好的情况下可能导致软件的行为错乱;严重时将会导致被缓冲区利用程序所控制而执行任何攻击者所想要执行的代码。请看下面的示例代码:

static char ourArray[100];
    ...
    int i;
    for ( i = 0 ; i < 100 ; i++ ) {
      ourArray[i] = (char)(0x30+i);
    }
    ourArray[i] = 0;    // 越界,危险!

    上例中,我们的赋值操作已经越过了数组的边界。它并没有在我们的数组内执行写操作,它是在数组边界之后的第一个字节内进行的写操作。换句话说,数组之后的第一个对象,无论它是结构体也好,还是指针也罢,现在已经被破坏了。为了改变这种糟糕的情况,我们只需要养成一种良好的习惯,那就是使用符号常量来指示数组的边界。就像在下例中一样,我们创建了一个常量,来定义数组的长度。这里有一个小技巧,那就是假设我们需要的数组长度为A,那么在定义数组长度时,实际长度是A+1。这时,无论数组长度如何,可以肯定的是,数组[A]一定是该数组的边界。换句话说,我们留了一个元素的余量。如下所示:

#define ARRAY_SIZE    100
    static char ourArray[ARRAY_SIZE+1];
    ...
    int i;
    for (i = 0 ; i < ARRAY_SIZE ; i++ ) {
      ourArray[i] = (char)(0x30+i);
    }
ourArray[ARRAY_SIZE] = 0;  //为数组的最后一个元素赋值

打印本文 打印本文 关闭窗口 关闭窗口