C ++ Libzip + remove =核心转储

时间:2014-10-13 08:26:52

标签: c++ linux libzip

使用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没有调试信息,对此不满意。)

有谁知道我的问题是什么?

1 个答案:

答案 0 :(得分:4)

这很危险:

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对象并将其地址传递给函数。