Anzeige:
Ergebnis 1 bis 4 von 4

Thema: zLib - Ich geh kaputt an Segfaults!!!

  1. #1
    Registrierter Benutzer Avatar von mrsuicide
    Registriert seit
    11.04.2003
    Beiträge
    38

    Angry zLib - Ich geh kaputt an Segfaults!!!

    Hier mein Code:

    zlib_stuff.cpp
    Code:
    #ifndef ZL_C
    #define ZL_C
     
    #include <zlib.h>
    #include <string.h>
    #include <stdlib.h>
    #include "zlib_stuff.h"
    
    void CompressData(compress_data *input)
    {
    if((input->size==0)||(input->data==NULL))return;
    Byte *uncompressed, *compressed;
    unsigned long cLen;
    int retval;
    input->compressed=false;
    uncompressed = (Byte *) strdup(input->data);
    if((compressed = (Byte *) malloc(input->size+1024)) == NULL)return;
    retval = compress2(compressed, &cLen, uncompressed, sizeof(uncompressed)+1 ,9);
    if((retval==Z_MEM_ERROR)||(retval==Z_BUF_ERROR))return;
    if(input->data!=NULL)free(input->data);
    input->data=strdup((char *)compressed);
    input->size=cLen;
    input->compressed=true;
    return;
    }
    
    void DecompressData(compress_data *input)
    {
    Byte *extracted=NULL;
    unsigned long eLen=input->size;
    int retval = 4;
    Byte *compressed;
    input->compressed=true;
    compressed = (Byte *) strdup(input->data);
    while((eLen < 100000) && (retval != Z_OK)){
    if(extracted != NULL)free(extracted);
    if((extracted = (Byte *) malloc(eLen)) == NULL)return;
    retval = uncompress(extracted, &eLen, compressed, input->size);
    if((retval==Z_MEM_ERROR)||(retval==Z_BUF_ERROR))break;
    if(retval != Z_OK)eLen *= 2;
    }
    free(input->data);
    input->data = (char *) strdup((char *)extracted);
    input->size=eLen;
    input->compressed=false;
    return;
    }
    
    #endif
    zlib_stuff.h
    Code:
    #ifndef ZL_H
    #define ZL_H
     
    struct compress_data
    {
    char *data;
    unsigned long size;
    bool compressed;
    };
    
    void CompressData(compress_data *input);
    void DecompressData(compress_data *input);
    #endif
    Aufruf:
    Code:
    struct compress_data compr;
    compr.compressed=true;
    compr.data=(char *)strdup("Zlib teeeest!\nBla bla bla...\d\nHallo: Zliiib\n");
    compr.size=strlen(compr.data);
    CompressData(&compr);
    printf("Compressed: %s\n",compr.data);
    Mein gesamter Code in der Anwendung funzt problemlos...es crasht immer nur bei Aufruf von compress() oder compress2()...
    Geändert von mrsuicide (06-01-2004 um 12:01 Uhr)
    GreeZ,
    Mr. Suicide!

  2. #2
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    Bin grad zu faul, den Code zu lesen, aber du solltest dir mal valgrind angucken (und lieben lernen...):
    http://valgrind.kde.org

  3. #3
    Registrierter Benutzer
    Registriert seit
    16.09.2002
    Beiträge
    73
    Ich kenne mich mit zlib leider nicht aus aber hier einige gedanken, die mir beim lesen aufgefallen sind:

    1. warum so viele strdups? strdup funktioniert nur mit strings, d.h. Zeichenketten mit "\0" am Ende. Außerdem wird dadurch neuer Speicherbereich mit malloc angefordert, den Du nie wieder freigibst.

    2. cLen sollte (wenn ich die zlib.h richtig verstanden habe) anfangs mit der Größe des puffers initialisiert werden

    3. Wenn compress2 was anderes als Ok zurückgibt, ist was schiefgelaufen. Warum also auf bestimmte Fehler prüfen?

    4. Zieh dir mal den Sourcecode der zlib. Da sind bestimmt Beispiele dabei.

    Grüße
    AB

  4. #4
    Registrierter Benutzer Avatar von mrsuicide
    Registriert seit
    11.04.2003
    Beiträge
    38

    Unhappy

    Original geschrieben von brotzi
    Ich kenne mich mit zlib leider nicht aus aber hier einige gedanken, die mir beim lesen aufgefallen sind:

    1. warum so viele strdups? strdup funktioniert nur mit strings, d.h. Zeichenketten mit "\0" am Ende. Außerdem wird dadurch neuer Speicherbereich mit malloc angefordert, den Du nie wieder freigibst.

    2. cLen sollte (wenn ich die zlib.h richtig verstanden habe) anfangs mit der Größe des puffers initialisiert werden

    3. Wenn compress2 was anderes als Ok zurückgibt, ist was schiefgelaufen. Warum also auf bestimmte Fehler prüfen?

    4. Zieh dir mal den Sourcecode der zlib. Da sind bestimmt Beispiele dabei.

    Grüße
    AB
    1. Gut Ok.
    2. Muss eigentlich nicht sein. Die größe wird von compress2 festgelegt. und in cLen geschrieben.
    3. compress 2 gibt nix zurück. Es crasht, bevor es etwas zurückgeben kann.
    4. Ich habe schon einige Beispiele. Die (und auch mein Code) funktionieren wunderbar IN ANDEREN Anwendungen.

    Bin aus den Debugger-Meldungen auch nicht schlauer geworden.
    Gibt's villiecht 'ne alternative zu zLib mit in-Memory compression???
    GreeZ,
    Mr. Suicide!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •