簡體   English   中英

免費通話時出現段故障

[英]Seg fault on free call

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(),則會遇到段錯誤,並且無法弄清(我在函數內分配了變量,然后將其釋放)。 有任何想法嗎?

您正在修改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()不返回任何內容,這些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. */

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM