PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : zLib - Ich geh kaputt an Segfaults!!!



mrsuicide
06-01-2004, 11:57
Hier mein Code:

zlib_stuff.cpp


#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))re turn;
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))br eak;
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


#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:


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()...

Trillian
06-01-2004, 17:01
Bin grad zu faul, den Code zu lesen, aber du solltest dir mal valgrind angucken (und lieben lernen...):
http://valgrind.kde.org

brotzi
06-01-2004, 18:55
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

mrsuicide
08-01-2004, 05:41
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???