在日常的 C++ 后台开发工作中,很少会动态生成 Zip 包,所以对 C++ 的 libzip 并不熟悉。最近刚好有个场景,需要将后台生成的一份数据压缩为一个 Zip 包以便下载。这里其实之前已经有生成 Zip 包的代码,只是需要在 Zip 包里面增加一个文件。本来是一个简单的需求,但是实现中遇到了一个诡异的问题,解压生成的 Zip 包里,里面文件开头部分有错乱。问题的排查过程中,绕了一些弯路,最后发现是 C++ 的内存问题导致的,这里记录下问题的排查和修复,以及对第三方库 Zip 的源码解读。对 C++ 不熟悉的读者也可以放心阅读,来感受下 C++ 的内存问题有多难调试。问题复现业务中是通过一个RPC请求拿到了部分数据,然后把这些数据进行处理后,生成一个 Zip 包,最后返回给前端。前端解码 zip 包后发现部分内容乱码,不符合事先约定的协议内容。由于是个必现的问题,比较好定位,直接加日志调试,发现 RPC 拿回来的数据并没有问题,但是生成 Zip 包之后,里面的内容就会多了些乱码内容。这里为了能够方便地复现问题,直接把生成 Zip 包部分抽离出来,写了一个简单的示例,核心代码如下:1234567891011121314151617181920zip* archive =zip_open(tmpFile, ZIP_CREATE | ZIP_TRUNCATE, &error;);i
...
继续阅读
(94)