代码静态扫描和分析的工具比较多,比如 splint, PC-LINT, BEAM 等。因为 BEAM 支持的平台比较多,这以 BEAM 为例,做个简单介绍,其它有类似的处理过程。
BEAM 可以检测四类问题: 没有初始化的变量;废弃的空指针;内存泄漏;冗余计算。而且支持的平台比较多。
BEAM 支持以下平台:
Linux x86 (glibc 2.2.4) Linux s390/s390x (glibc 2.3.3 or higher) Linux (PowerPC, USS) (glibc 2.3.2 or higher) AIX (4.3.2+) Window2000 以上
清单2. 用作 Beam 分析的代码
#include <stdio.h> #include <string.h> #include <stdlib.h> int *p; void foo(int a) { int b, c; b = 0; if(!p) c = 1; if(c > a) c += p[1]; } int LeakTest(char * Para) { char * Logmsg = new char[128]; if((Para==NULL)||(Logmsg == NULL)) return -1; sprintf(Logmsg,"LeakTest routine exit: '%s'.\n", Para); return 0; } int main(int argc,char **argv ) { char szInit [] = "testcase1"; LeakTest(szInit); return 0; }
下面以 X86 Linux 为例,代码如清单 2,具体的环境如下:
OS: Red Hat Enterprise Linux AS release 4 (Nahant Update 2)
GCC: gcc version 3.4.4
BEAM: 3.4.2; https://w3.eda.ibm.com/beam/
可以把 BEAM 看作一个 C/C++ 编译器,按下面的命令进行编译 (前面两个命令是设置编译器环境变量):