此类问题比较特殊,程序在运行过程中不停地分配内存, 但是直到结束的时候才释放内存。严格地说这里并没有发生内存泄漏,因为最终程序释放了所有已申请的内存。但是对于一个服务器程序,如果不及时释放内存可能导致最终耗尽系统的所有内存。检查此类问题要从释放内存空间处入手,检查释放过程是否只在调用析构函数时出现。如果是,则再分析程序是否会出现不调用析构函数而再分配内存的路径,从而发现是否会发生隐式内���泄漏。需要说明的是,由于此类问题一般在异常的情况发生时出现,程序本身又往往是正常的,所以不太容易静态地检查出来,因此这种方法也只能分析出已知的特殊情况。
3.3 空指针引用问题的解决途径
此类函数包括 open、fopen。所谓空指针就是没有指向任何合法的存储空间的指针。如果对打开文件的过程未做检查,在打开文件失败的情况下,就会产生空指针,并被黑客利用。
例如下面一段程序:
FILE *in=null, *out=null;
out=fopen("\\Test\testnum1.txt","r"); in=fopen("\\Test\testnum2.txt", "w"); while(! feof(out))
{fputc(fgetc(out),in)};
fopen 打开文件失败时,就会产生空指针。另外,如果文件打开后不检查文件属性,文件属性也容易被修改[5]。分析处理此类问题采用语法分析的方法,检查是否对文件打开过程进行了严格检查。
3.4 随机数问题的解决途径
在C/C++程序中涉及许多随机数的选取,但系统提供的rand 是一个伪随机数。其内部的实现使得根据给定的种子产生的输出值可能重复,从而造成了随机数可能被黑客猜到的结果。分析处理此类函数的方法是:建议用其它的健壮的数据源取代。可能产生伪随机数的函数包括rand、drand48、erand48、jrand48、lrand48、mrand48、random 等。
4 结 论
C/C++ 语言的静态代码安全检查工具能够在程序运行之前发现源程序潜在的安全漏洞,大大降低了出现安全漏洞的概率,对提高程序的安全性具有重要意义。但是代码检查非常耗费时间,而且静态代码安全检查需要知识和经验的积累。对较复杂的问题,静态代码安全检查工具很可能检查不出来。所以,一方面强烈建议程序员时刻保持高质量程序设计的思想,进行主动防错设计。另一方面,对那些比较重要的系统, 提醒使用多种安全检查手段相结合方法。例如,在静态检查的基础上,再采用动态资源监控、漏洞扫描、入侵检测等方法以确保系统安全。