libfprint-Programm: malloc() und andere speicherallokierende Fkt bringen Segfault
-
Hallo,
ich nutze Kubuntu 32bit mit Kernel 2.6.22 auf einem Notebook.
und benutze die libfprint (http://www.reactivated.net/fprint) um ein paar kleinere Programme für einen Fingerabdruck-Scanner zu schreiben.Ich habe ein Programm geschrieben, welches seit einigen eigentlich unwesentlichen Änderungen Segfaults bei malloc bzw. Bibliotheksfunktionen bringt - offenbar wenn mehr als 500 Bytes reserviert werden.
Zuerst ist es mir bei folgendem Code aufgefallen:
#define _GNU_SOURCE #include <sys/types.h> #include <sys/stat.h> unsigned char* ucData=NULL; // da rein soll der Inhalt einer Fingerabdruck-Datei eingelesen werden, die Datei wurde vorher mit einer Bibliotheksfunktion von libfprint gespeichert unsigned uFilesize; struct fp_print_data ** print_data_gallery = NULL; [...] stat(filename, &buf); // buf.st_size ist dann 2414, hab ich überprüft uFilesize=buf.st_size; ucData = (unsigned char*) malloc(uFilesize); // bringt hier Segfault
Setze ich uFilesize=500, geht malloc() noch gut, ab 501 gibt es nen Segfault!
Es wird also auch kein NULL-Pointer zurückgeliefert.
Da die Dateien offenbar immer gleichgross sind hab ich mir das malloc() dann geschenkt:#define FILESIZE 2414 unsigned char ucData[FILESIZE]; // Speicher fuer Dateiinhalt
Aber dann gibt mir die libfprint-Funktion, die ucData in einen speziellen Datentyp umwandeln soll, einen Segfault.
Funktionsprototyp:
struct fp_print_data * fp_print_data_from_data (unsigned char *buf, size_t buflen)Load a stored print from a data buffer.
Parameters:
buf the data buffer
buflen the length of the bufferReturns:
the stored print represented by the data, or NULL on error. Must be freed with fp_print_data_free() after use.// uAnzFp ist Anz der Fingerabdruck-Dateien print_data_gallery = (struct fp_print_data **) malloc(uAnzFp+1); // uAnzFp ist die Anzahl der gespeicherten Fingerabdrücke die von der Platte gelesen werden und mit dem neu gescannten Fingerabdruck verglichen werden print_data_gallery[uAnzFp] = NULL; // der Array muss NULL-terminiert sein uIndex=0; while(uIndex < uAnzFp) { // Fingerprint-Daten-Datei oeffnen fh_fp = fopen(FilenameArray[uIndex], "r"); if(NULL == fh_fp) { puts("..."); exit(1); } // Größe der Datei feststellen, stat(FilenameArray[uIndex], &buf); if(FILESIZE != buf.st_size) { puts("..."); exit(6); } // Datei einlesen nach "unsigned char ucData" bis EOF, res = fread(ucData, sizeof(unsigned char), FILESIZE, fh_fp); if (res != FILESIZE) { printf("..."); exit (3); } fclose(fh_fp); // Fingerabdruck-Datei schliessen print_data_gallery[uIndex] = fp_print_data_from_data(ucData, FILESIZE); ++uIndex; } // while
Auch diese Funktion muss ja offenbar Speicher reservieren, und liefert auch keinen NULL-Pointer zurück sondern macht einen Segfault.
Der gdb sagt:
Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1268741952 (LWP 7491)] 0xb4f5e116 in ?? () from /lib/tls/i686/cmov/libc.so.6
Wäre dankbar fuer jeden Tipp!
-
Compilier mit -g, damit du bessere Tracebacks erhälst.
Und dann lass es mir valgrind laufen.
-
Könnte (theoretisch) ein Gültigkeitsproblem sein.
Versuch mal:
1.new[] statt malloc (Cpp-dynalloc)
2.boost::shared_array (http://boost.org)