读取 gzip 的 zlib 错误时访问冲突

Posted

技术标签:

【中文标题】读取 gzip 的 zlib 错误时访问冲突【英文标题】:Access Violation while reading error on zlib for gzip 【发布时间】:2020-01-08 09:28:53 【问题描述】:

我正在尝试使用 zlib 解压缩 c 中的二进制缓冲区

BOOL gzipInflate(char* lpFileIn, DWORD lpFileInSize) 
    z_stream strm;
    char* uncomp, * uncomp2;
    unsigned int uncompLength, half_length;
    int err;
    bool done = false;

    uncompLength = lpFileInSize;
    half_length = lpFileInSize / 2;

    uncomp = (char*)calloc(sizeof(char), uncompLength);

    memset(&strm, 0, sizeof(strm));

    strm.next_in = (Bytef*)lpFileIn;
    strm.avail_in = (uInt)lpFileInSize;
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    strm.total_out = Z_NULL;


    if (inflateInit2(&strm, 16 + MAX_WBITS) != Z_OK) 
        free(uncomp);
        return FALSE;
    

    while (!done)
    

        if (strm.total_out >= uncompLength) 
            uncomp2 = (char*)calloc(sizeof(char), uncompLength + half_length);
            memcpy(uncomp2, uncomp, uncompLength);
            uncompLength += half_length;
            free(uncomp);
            uncomp = uncomp2;
        

        strm.next_out = (Bytef*)(uncomp + strm.total_out);
        strm.avail_out = uncompLength - strm.total_out;


        err = inflate(&strm, Z_SYNC_FLUSH);

        if (err == Z_STREAM_END) 
            done = true;
        
        else if (err != Z_OK) 
            break;
        
    

    if (inflateEnd(&strm) != Z_OK) 
        free(uncomp);
        return FALSE;
    

    free(uncomp);

    return TRUE;

使用随机地址读取时出现访问冲突 我也使用 .NET 中的“GZipStream”来压缩缓冲区并使用 C 解压缩它

原始码:https://windrealm.org/tutorials/decompress-gzip-stream.php

【问题讨论】:

哪一行代码触发了访问冲突?在调试器中运行程序会立即告诉您这一点。然后您可以继续使用调试器来跟踪和检查代码。这是进行调试的最佳方式。如果您确实需要 *** 的帮助,请提供minimal verifiable example。 膨胀(&strm, Z_SYNC_FLUSH);触发访问冲突 那么为什么不进入函数inflate 并更准确地查看它发生在哪里呢? @GuillaumePetitjean:很抱歉,这是一个个人项目,我在下班后试图通过套接字学习 gzlib,我几乎没有 1.5 或 2 个小时,而且我不太擅长 asm 【参考方案1】:

事实证明,在 windows 的 Visual Studio 上编译 zlib 时使用“ReleaseWithoutAsm”而不是“Release”,因为 inflate_fast() 在 asm 中是错误的

【讨论】:

以上是关于读取 gzip 的 zlib 错误时访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

异常错误:访问冲突读取位置 0xDDDDDDDD

访问冲突读取位置 0xcccccccc

创建链表时访问冲突错误

访问冲突读取位置和错误读取字符串的字符

Vector::push_back() 给出读取访问冲突

C0000005: 读取位置 0xCCCCCCCC 时发生访问冲突