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 buffer

    Returns:
    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)


Anmelden zum Antworten