gpt4 book ai didi

C++ Libzip + 删除 = 核心转储

转载 作者:太空狗 更新时间:2023-10-29 20:58:50 26 4
gpt4 key购买 nike

我在使用 libzip 时遇到问题。我在 linux 上并使用 sudo apt-get install libzip2 libzip-dev 安装了库(所以它不是最新版本)。

这是我的代码:

#include <iostream>
#include <zip.h>
#include <unistd.h>
#include <sys/stat.h>

#define ZIP_ERROR 2

using namespace std;

bool isFilePresent(string const& path)
{
struct stat *buf;
return(stat(path.c_str(), buf)==0);
}

int main(void)
{
struct zip *zip;
struct zip_source *zip_source;
int err(0);
string zipFile("filesZip/zipTest");
string fileToZip("filesToZip/test1");
string fileToZip2("filesToZip/test2");
char tmp[] = "filesZip/zipTest\0";

// Test if the file is present
if(isFilePresent(zipFile))
{
// if(remove(tmp) != 0)
if(remove(zipFile.c_str()) != 0)
{
return ZIP_ERROR;
}
}
// Open a zip archive
zip = zip_open(zipFile.c_str(), ZIP_CREATE, &err);

// if there is an error on the opening
if(err != ZIP_ER_OK)
{
cout << "error when opening" << endl;
return ZIP_ERROR;
}

// If the zip file is not open
if(zip == NULL)
{
zip_close(zip);
cout << "error when zip opens" << endl;
return ZIP_ERROR;
}

// zip_source_file zip a file so that it can be added to the zip
if((zip_source = zip_source_file(zip, fileToZip.c_str(), (off_t)0, (off_t)0))== NULL)
{
zip_close(zip);
zip_source_free(zip_source);
cout << "pb when zipping file1" << endl;
return ZIP_ERROR;
}

// Add the zipped file to the zip
if(zip_add(zip, fileToZip.c_str(), zip_source)==-1)
{
zip_close(zip);
zip_source_free(zip_source);
cout << "pb when adding file1" << endl;
return ZIP_ERROR;
}

// zip_source_file zip a file so that it can be added to the zip
if((zip_source = zip_source_file(zip, fileToZip2.c_str(), (off_t)0, (off_t)0))== NULL)
{
zip_close(zip);
zip_source_free(zip_source);
cout << "pb when zipping file2" << endl;
return ZIP_ERROR;
}

if(zip_add(zip, fileToZip2.c_str(), zip_source)==-1)
{
zip_close(zip);
zip_source_free(zip_source);
cout << "pb when adding file2" << endl;
return ZIP_ERROR;
}

// sleep(180);

// Closing the archive
zip_close(zip);

return 0;
}

此代码应该获取 filesToZip 文件夹中的两个文件,并将它们压缩到 filesZip 文件夹中的 zipTest 文件中。

为此,它首先检查 zipTest 文件是否已经存在。如果是这样,则将其删除。然后它打开一个 zip 存档,压缩要添加的文件并在关闭存档之前将它们添加到存档中。

所以我的问题是:

当 zip 存档文件 Zip/zipTest 不存在时,它就可以正常工作。 当 zip 存档文件 Zip/zipTest 确实存在时,我得到了一个核心转储。

到目前为止我尝试了什么:

  • 我认为这是因为我使用字符串作为文件名。我尝试使用 char,它没有改变任何东西
  • 然后我认为这是因为删除任务未完成,然后可能会遇到冲突。所以我在每次函数调用后放置 sleep(180) (以秒为单位)。它没有改变任何东西
  • 我也试过只在存档中放一个文件。没有改变任何东西
  • 我运行 gdb 看看发生了什么。当 zip 存档已经存在并且不存在时,我都尝试过。
    • 如果存档不存在:一切顺利,直到返回 0,然后我看到程序重新定义了 fileToZip 和 fileToZip2,然后再返回 0 然后停止。
    • 如果存档已经存在:它做同样的事情但是然后说找不到当前函数的边界。 (我读过 here 这意味着 gdb 没有调试信息并且对此不满意..)

有人知道我的问题是什么吗?

最佳答案

这很危险:

bool isFilePresent(string const& path)
{
struct stat *buf;
return(stat(path.c_str(), buf)==0);
}

您没有为您的 struct stat* 分配任何内存,因此在调用该函数时会写入随机内存 - 可能会导致崩溃。

试试这个:

bool isFilePresent(string const& path)
{
struct stat buf; // memory is allocated on the stack for this object
return(stat(path.c_str(), &buf)==0); // pass its address to the function
}

它创建一个本地 struct stat 对象并将其地址传递给函数。

关于C++ Libzip + 删除 = 核心转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26335692/

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