2013-12-12 45 views
0
char* meminfo() 
{ 
char* buffer = NULL; 
FILE* fp = fopen("/proc/meminfo", "r"); 
ssize_t read; 

char* json = malloc(4096); 
char* original = json; 
json[0] = '\0'; 
json = strcat(json, "{"); 

size_t value = 1024; 

while ((read = getline(&buffer, &value, fp)) != -1) 
{ 
    char name[1024]; 
    name[0] = '\0'; 

    char val[1024]; 
    val[0] = '\0'; 

    sscanf(buffer, "%s:", name); 
    buffer = buffer + strlen(name); 
    name[strlen(name) - 1] = '\0'; 

    sscanf(buffer, "%s kB", val); 

    json = strcat(json, "\""); 
    json = strcat(json, name); 
    json = strcat(json, "\": \""); 
    json = strcat(json, val); 
    json = strcat(json, "\", "); 
} 
int n = strlen(json); 
json[n - 2] = '}'; 
json[n - 1] = '\0'; 

fclose(fp); 
return original; 
} 

所以我有這個函數讀取並生成meminfo文件中的數據的json字符串對象。然而,如果我在這個函數的返回值上調用free(),我會得到一個seg錯誤,我不能弄清楚(我在函數中使用了malloc,然後釋放它)。有任何想法嗎?免費通話的段錯誤

+0

然後,字符* JSON;應該是全球 – Chinna

+0

奇怪的,在我的情況(CentOS 5.3,gcc 4.3)你的代碼與免費()效果很好。沒有seg。故障。無論如何。你爲什麼不用memset()或bzero()初始化'json'? –

+0

您可能溢出了4096緩衝區大小。你應該防守編程,並確保你不會寫入超過緩衝區容量。 –

回答

0

您正在修改buffer指向連續呼叫getline()之間的點。

buffer = buffer + strlen(name); 

隨着內存指向buffer可能被getline()每次來迭代不得之間進行修改過程中被重新分配。

爲了解決這個問題做一個備份如下所示:

char* meminfo() 
{ 
    char * buffer = NULL; 

    ... 

    size_t value = 0; 

    while ((read = getline(&buffer, &value, fp)) != -1) 
    { 
     char * p = buffer; /* save the address, as buffer is modfied below. */ 

     ... 

     buffer = p; /*restore address. */ 
    } 

而且代碼錯過錯誤校驗系統調用。


另一個問題是,該行悲慘的失敗了的情況下,getline()不返回任何內容:

size_t n = strlen(json); 
/* json is "{" so its length would be 1 ... */ 

json[n - 2] = '}'; 
/* ... so here the code would address json[-1]. Which provokes undefinded behaviour. */