2016-04-05 2 views
1

Ich habe eine ungültige Lese von Größe 1 Ausnahme in meinem C-Dateiprogramm. Ich werde im Anschluss an die von valgrind:C Ungültiger Lesevorgang von Valgrind

==9072== Invalid read of size 1 
==9072== at 0x4C28FB2: __GI_strlen (mc_replace_strmem.c:404) 
==9072== by 0x401FA8: getJsonRecord (in /.autofs/ilab/ilab_users/csd92/Systems_Programming/Indexer/index) 
==9072== by 0x401CF3: jsonWrite (in /.autofs/ilab/ilab_users/csd92/Systems_Programming/Indexer/index) 
==9072== by 0x400BFC: main (index.c:42) 
==9072== Address 0x51d6e80 is 0 bytes inside a block of size 19 free'd 
==9072== at 0x4C27430: free (vg_replace_malloc.c:446) 
==9072== by 0x400F65: file_handler (index.c:110) 
==9072== by 0x400DBB: directory_handle (index.c:82) 
==9072== by 0x400DDC: directory_handle (index.c:84) 
==9072== by 0x400BC3: main (index.c:34) 

definieren:

#define trailing_record() ("},\n\0") 
#define not_trailing_record() ("}\n\0") 
#define record_first() ("\t\t{\"") 
#define record_second() ("\" :") 

Das ist mein getJsonRecord:

char * getJsonRecord (char * token, char * frequency, int trailing) 
{ 

    if(token == 0 || frequency == 0) 
    { 
    return "Token or frequency == 0"; 
    } 

    char * entry = 0; 
    entry = calloc((strlen(token) + strlen(frequency) +30),1); 

    int tokensize= strlen (token); 
    int freqsize = strlen(frequency); 

    strcat(entry,record_first()); 
    strcat(entry,token); 
    strcat(entry,record_second()); 
    strcat(entry,frequency); 

    if(trailing == 0) 
    { 
    strcat(entry,not_trailing_record()); 
    } 

    else 
    { 
    strcat(entry,trailing_record()); 
    } 

    free(frequency); 
    return entry; 

} 

Diese Werte sind immer zu getJsonRecord übergeben, wenn es fehlschlägt:

token Index_Test/3:29:16, frequency 3 trailing 0 
token Index_Test/Temp/cable21.txt, frequency 1 trailing 1 

Irgendwelche Vorschläge?

+2

Sieht aus wie, was Sie übergeben für ' token 'oder' frequency' ist bereits frei() 'd bei 'index.c: 110' –

+1

' getJsonRecord' hat 'frequency' nicht zugewiesen, also sollte es * wahrscheinlich * auch nicht frei sein. Dies ist jedoch möglicherweise nicht Ihr tatsächlicher Fehler. Der tatsächliche Fehler ist genauso wahrscheinlich in Code, den Sie nicht angezeigt haben. Bitte lesen und befolgen Sie die Anweisungen unter https://stackoverflow.com/help/mcve – zwol

+0

Auf den ersten Blick zeigt einer von "Token" oder "Frequenz" auf kürzlich freigegebenen Speicher - und daher sollten Sie nicht immer noch lesen es. Es ist schwer zu sagen, was. –

Antwort

0

Ryan Haining war korrekt, manchmal wurde mein Token bereits in einer bedingten Schleife freigegeben, von der ich nie gedacht hätte, dass sie vor dem Schreiben der Datei aufgerufen würde.

Die bedingte Schleife, bevor festgelegt ist:

if(filepath_index == (filepath_count)) 
{ 

    char ** temp = malloc(filepath_count *2 * sizeof(char *)); 

    int i = 0; 
    for (i = 0; i < filepath_count; i ++){ 
     temp[i] = malloc(strlen(filepaths[i])+1); 
     strcpy(temp[i],filepaths[i]); 
     free(filepaths[i]); 
    } 

    free(filepaths); 
    filepaths = temp; 
    filepath_count = filepath_count * 2; 
} 

Die bedingte Schleife befestigt, nachdem sie: if (filepath_index == (filepath_count)) {

char ** temp = malloc(filepath_count *2 * sizeof(char *)); 
int i = 0; 

for (i = 0; i < filepath_count; i ++){ 
    temp[i] = filepaths[i]; 
} 

free(filepaths); 
filepaths = temp; 
filepath_count = filepath_count * 2; 
}