网络通信数据较大,用到了zlib.
最近碰到一个崩溃的问题,追踪后发现zlib的使用有问题。
而后自己写了一段测试代码,确实是使用有问题。
BYTE pCompressData[3] = {0};
DWORD dwAfterCompressSize = 1024;
BYTE* pBitmapData = (BYTE*)malloc(1024*1024);
int iRet = compress( pCompressData, &dwAfterCompressSize, pBitmapData, 1024*1024);
比较容易让人误解的是,iRet的返回值是Z_BUF_ERROR,让人以为zlib正常运行了。
实际上对于zlib来说,它确实正常运行了,但是它访问了不该访问的内存,造成了不可预知的问题;而后程序崩溃,并且定位不到错误,那也就是顺理成章的事情了。
这件事有两个教训:
作为接口的提供者,尽可能多的作参数的合法性检查;当然在这次崩溃的情况下,不是合法性检查不严谨引起的;
作为借口的调用者,尽可能多的作参数的合法性检查;因为一不小心,会访问到不改访问的内存地址。