[英]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.