C/C++代码检视实例代码检视实例
看完上面的评审C/C++代码检视要点后,也许有些读者已经急切地想找一些代码来试验一下看能否通过上面的内容来提高自己
的检视能力。下面就讲几个代码检视的实例,请读者在看这些实例时先不要看后面的分析,自己先拿张纸边看代码边把自己能
够发现的问题记录下来,然后再和后面的分析进行比较。如果能够发现后现分析中没有提及的问题,说明已经将评审检视基本
功学得非常好了。
1. 日志文件函数的检视实例
日志文件函数的代码如下:
/** 写日志函数,实现将日志信息写入日志文件中的功能
@param char *pszLogFile - 日志文件名
@param char *pszLogMsg - 要写入的日志消息字符串
@return int - 失败返回-1, 成功返回0
*/
int WriteLog (char *pszLogFile, char *pszLogMsg)
{
FILE *fp;
fp = fopen(pszLogFile, "w");
fseek(fp, 0, SEEK_END);
if ( fwrite(pszLogMsg, sizeof(char), strlen(pszLogMsg), fp)
!= strlen(pszLogMsg) )
{
return -1;
}
fclose(fp);
return 0;
}
下面按照检视要点来对这个函数进行检视:
从输入校验方面的检视要点来看的话,输入参数没有校验。即没有判断输入的文件名是否合法或是否为空。文件名中有
许多特殊字符是不能使用的,会导致打开文件失败。输入的日志消息字符串是否为空也没有判断。
从函数方面的检视要点可以发现打开文件函数的返回值没有进行校验,即没有判断打开文件是否成功,
从资源释放方面的检视要点来看,打开的文件在return -1;这行之前没有被关闭。
再从系统调用方面的检视要点来看,调用fopen使用不正确的参数,实际上第二个参数不能使用”w”,”w”参数会将文件内
容清空掉,以前写的信息都会丢失,应该改成“a+b”。改掉这个参数后,fseek()那个调用就可以不要删除掉了。
除了上面的检视要点外,还需要使用元素分析法来进行检查,从日志文件这个元素进行分析,两条日志信息间应该有分
隔符分开的,因此需要对pszLogMsg判断是否有分隔符,如果没有的话,程序中应该给它补上分隔符。
所以总共可以得到上面写日志函数的几个主要问题如下:
1) 输入参数pszLogFile, pszLogMsg没有进行校验
2) 打开文件后没有判断是否打开成功
3) fopen()第2个参数使用不正确,应该使用“a+b”作为参数
4) return -1;前没有将打开的文件关闭掉
5) 日志文件中的两条日志信息间的分隔符没有考虑进行处理
2. 求和函数的检视实例