2009-07-15

Even when one byte matters

前几天读了一篇文章,``Even When One Byte Matters''。然而今天我就犯了个指针越界的错误,虽然也仅仅是越界了一个字节,其效果就像上帝显灵一样,令人印象深刻。

是一段算字符串md5值的程序,主函数中的变量声明如下:
int i;
char asc_buf[MD5_DIGEST_LENGTH * 2];


``asc_buf'' 中存放的是字符串md5的值转成ascii的形式。MD5摘要的长度是16,而字符串形式的长度是它的两倍,也就是32。然而,一个粗心,这个数组少定义了一个字节 -- C的字符串以一个额外的'\ 0'结尾。然后,在另外一个md5_to_ascii( )函数中,有这样一句:
asc_buf[MD5_DIGEST_LENGTH * 2] = '\ 0';


于是,它的结果是把i的值设为了0 (精确一点的说,是i的最低或者最高字节为0,取决于大端还是小端)-- 想想堆栈的布局便很明白了。如果这段程序没有测试,便提交到了一个很大的项目里,这个bug还是比较隐蔽的。C的强大得益于指针,而指针也恰恰是万恶之源。双刃剑。

标签:

1 Comments:

At 15:10, Anonymous yechun said...

Luck enough!!
幸好前面还有个i,如果没有把i写0,哪天把其他地方给写了麻烦就更大了,都不知道如何找起
而且这种问题Klocwork之类的软件不见得能找出来,因为asc_buf可以是作为char *的参数

 

发表评论

<< Home