错误的返回值
做为函数的最常见的输出方式,函数的返回值往往扮演者非常重要的角色。然而,在写程序的过程中,却经常不注意返回值的使用。遇到一些错误或者稀奇古怪的写法。下面就是一个经典案例。
UINT ReadDisk(ULONG64 nSectorOff, LPVOID lpSectorData, UINT nCount)
{
if(m_nDiskIndex == INVALID_DISK_INDEX)
return FALSE;
return DioReadPhysicalDisk(*(LPULONG_64)&nSectorOff,lpSectorData,nCount,m_nDiskIndex);
}
显然,第4行返回的FALSE与函数返回值类型是不统一的。通过查阅DioWritePhysicalDisk函数的声明我们也可以知道,其返回的是读取扇区的数量。当然,此处FALSE恰好等于0。歪打正着,也不会出错。但是,并不能否定该函数存在问题的事实。假如日后该函数由另外一个同事来维护一下。需求是,当读取某个特殊扇区时进行一些过滤操作,输出一些特定的值。该同事比较懒,又是新手,没有查阅DioWritePhysicalDisk的声明,也对UINT这个返回值类型多做思考。时间紧任务重,又遇到一个急性子。于是,该同事将代码改成了:
UINT WriteDisk(ULONG64 nSectorOff, LPVOID lpSectorData, UINT nCount)
{
if(m_nDiskIndex == INVALID_DISK_INDEX)
return FALSE;
if (nSectorOff == 1 && nCount == 2)
{
static BYTE byCode[1024] = {0};
....
memcpy(lpSectorData, byCode, sizeof(byCode));
....
return TRUE;
}
return DioWritePhysicalDisk(*(LPULONG_64)&nSectorOff,lpSectorData,nCount,m_nDiskIndex);
}
BUG就此引入。
记住他不是在该一个函数,他在维护一个产品。他不会每没改完一个函数时都验证一下。而要等上2、3个小时后。终于,他将7、8个文件全部改好了。很不幸,该同事记性也不好。他已经对这个小地方已经遗忘了。又或者这个函数时深藏在程序的底部。发现错误的地方跟出现错误的地方有万里之遥。于是,接下来3、5个小时,该同事可能都废在了调试上。如果该同事功力再弱一点,花上1、2天都是有可能的。