gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:36:07 25 4
gpt4 key购买 nike

我一直在使用 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);

//Search for the file of given name
const char *name = "file.txt";
struct zip_stat st;
zip_stat_init(&st);
zip_stat(z, name, 0, &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 中读取的内容- delete[] contents; 标记在末尾将消除它。

(我会在原始答案上留下评论以提请注意这个问题,但我没有必要的代表。)

最佳答案

你让我看起来:)

是的,这是 zlib 内部的一个错误(由 libzip 使用),因为内存的分配和使用都在 inflateInit2_ 中的同一调用中。您的代码甚至没有机会访问该内存。

我可以使用 zlib 1.2.3 重复这个问题,但它不再出现在 1.2.7 中。我没有 1.2.3 的可用代码,但如果您正在查看它,我会检查 state 的初始化以及它在 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) {

由于 window 之前已初始化为 Z_NULL,因此不会发生未初始化的 wbits 读取。

关于c++ - 使用 Valgrind 检查时,Libzip 示例包含未初始化的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12483612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com