c – 使用Valgrind检查时,Libzip示例包含未初始化的值

c – 使用Valgrind检查时,Libzip示例包含未初始化的值,第1张

概述我一直在使用libzip来处理zip文件,并根据rodrigo对 this question的回答找到了我的代码.这是他的代码,供快速参考: #include <zip.h>int main(){ //Open the ZIP archive int err = 0; zip *z = zip_open("foo.zip", 0, &err); //Sear 我一直在使用libzip来处理zip文件,并根据rodrigo对 this question的回答找到了我的代码.这是他的代码,供快速参考:
#include <zip.h>int main(){    //Open the ZIP archive    int err = 0;    zip *z = zip_open("foo.zip",&err);    //Search for the file of given name    const char *name = "file.txt";    struct zip_stat st;    zip_stat_init(&st);    zip_stat(z,name,&st);    //Alloc memory for its uncompressed contents    char *contents = new char[st.size];    //Read the compressed file    zip_file *f = zip_fopen(z,"file.txt",0);    zip_fread(f,contents,st.size);    zip_fclose(f);    //And close the archive    zip_close(z);}

我追踪了我随后从Valgrind得到的错误回到了这段代码 – 当使用’zip_fopen()`打开压缩的“file.txt”时,它会抱怨未初始化的值.

==29256== Conditional jump or move depends on uninitialised value(s)==29256==    at 0x5B4B290: inflatereset2 (in /usr/lib/libz.so.1.2.3.4)==29256==    by 0x5B4B37F: inflateInit2_ (in /usr/lib/libz.so.1.2.3.4)==29256==    by 0x4E2EB8C: zip_fopen_index (in /usr/lib/libzip.so.1.0.0)==29256==    by 0x400C32: main (main.cpp:24)==29256==  Uninitialised value was created by a heap allocation==29256==    at 0x4C244E8: malloc (vg_replace_malloc.c:236)==29256==    by 0x5B4B35B: inflateInit2_ (in /usr/lib/libz.so.1.2.3.4)==29256==    by 0x4E2EB8C: zip_fopen_index (in /usr/lib/libzip.so.1.0.0)==29256==    by 0x400C32: main (main.cpp:24)==29256====29256====29256== HEAP SUMMARY:==29256==     in use at exit: 71 bytes in 1 blocks==29256==   total heap usage: 26 allocs,25 frees,85,851 bytes allocated==29256====29256== 71 bytes in 1 blocks are definitely lost in loss record 1 of 1==29256==    at 0x4C24A72: operator new[](unsigned long) (vg_replace_malloc.c:305)==29256==    by 0x400BEE: main (main.cpp:19)

我无法在此代码中看到未初始化值的来源.任何人都可以追踪这个,或者libzip本身的错误是什么?我应该切换到另一个zip库 – 例如,Minizip吗?

编辑:71字节是file.txt的内容,读取in-delete []内容;在最后标记将消除这一点.

(我已经对最初的答案留下了评论,以引起对这个问题的关注,但我没有必要的代表.)

解决方法 你让我看:)

是的,这是zlib中的一个错误(由libzip使用),因为内存的分配和使用都在同一个调用的inflateInit2_内.你的代码甚至没有机会进入那段记忆.

我可以使用zlib 1.2.3重复这个问题,但它在1.2.7中不再出现了.我没有1.2.3的代码可用,但是如果你正在查看它,我会检查状态的初始化以及它在inflatereset2中的使用方式.

编辑:追踪问题,我下载了Ubuntu的zlib源代码包(1.2.3.4)和违规行;

if (state->wbits != windowBits && state->window != Z_NulL) {

wbits在此之前未初始化,并将导致警告.奇怪的是原始的zlib 1.2.3或1.2.4都没有这个问题,它似乎对Ubuntu来说是独一无二的. 1.2.3甚至没有函数inflatereset2,而1.2.4也没有;

if (state->window != Z_NulL && state->wbits != (unsigned)windowBits) {

由于窗口先前已初始化为Z_NulL,因此不会发生未初始化的wbits读取.

总结

以上是内存溢出为你收集整理的c – 使用Valgrind检查时,Libzip示例包含未初始化的值全部内容,希望文章能够帮你解决c – 使用Valgrind检查时,Libzip示例包含未初始化的值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1238533.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存