源代码如下:
char checkSum(char fn, char *pcontent, unsigned int contentLen)
{
char checksum=0, i;
char tmp[3]={0};
sprintf(tmp, "%02X", (BYTE)fn);
checksum=tmp[0]+tmp[1];
for(i=0;i<contentLen;i++)
{
checksum = checksum + pcontent[i];
}
return checksum;
}
咋看这段代码是没有问题的,其实这段代码存在很大的隐患,如果不仔细看是看不出来的。
那么,如果我告诉你是由于数据类型引起的bug, 那么你肯定会很快找到的。
不绕圈了,我来说说,这个bug的在什么情况下会发生。
出现bug的情况:
条件:
pcontent is "12344 jkkkkkkkkkkkkkkkkkkkkkkkkkk kikkdddddddddddddddddddddd***************** dfddddddddddddddd sddddddddddddddddddddddddddddddddddllllllllllllllllllllllllllllllllfffffffffffffff ooooooooooooooooooooo"
contentLen是pcontent的长度
结果:
checksum 跟预期的值不一样。
bug:
i是char类型,而pcontent是unsigned int类型
i的最大值是127 远远小于contentLen的值所以出现了bug
结论:在写循环代码时一定要注意循环变量(i)与条件变量(contentLen)的类型相匹配。