簡體   English   中英

Malloc錯誤:釋放對象的校驗和不正確

[英]Malloc Error: incorrect checksum for freed object

我正在為一項任務實施尾部。 我有它正常工作,但我似乎在隨機時間免費獲得錯誤。

我無法看到,追蹤到一個模式或除了它之外的任何東西是一致的。

例如,如果我將我的程序稱為“tail -24 test.in”,我將在多次運行時在同一行中得到錯誤的校驗和錯誤。 但是,使用不同的文件,甚至不同的行數打印回來,我會回來沒有錯誤。

關於如何追蹤問題的任何想法,我一直試圖調試它幾個小時無濟於事。

這是違規代碼:

lines被定義為char **,並且malloc為:

lines = (char**) malloc(nlines * sizeof(char *));

void insert_line(char *s, int len){

  printf("\t\tLine Number: %d Putting a %d line into slot: %d\n",processed,len,slot);
  if(processed > numlines -1){//clean up
    free(*(lines+slot));
    *(lines + slot) = NULL;
  }
  *(lines + slot) = (char *) malloc(len * sizeof(char));
  if(*(lines + slot) == NULL) exit(EXIT_FAILURE);
  strcpy(*(lines+slot),s);
  slot = ++processed % numlines;
}

您的例程正在寫入超出分配的行緩沖區。

作為參數傳遞的行的大小(即“len”)可能不包括NUL終止符。 當你調用malloc復制行(即“s”)時,你需要為字符串終止符分配一個額外的字節:

 *(lines + slot) = (char *) malloc((len + 1) * sizeof(char));

如果您可以使用特定的輸入參數一致地重現問題,則應該像這樣進行調試:

  • 首先調試導致問題的精確自由。
  • 然后弄明白即將被釋放的內存是malloc'ed。
  • 接下來,調試內存為malloc的地方。
  • 在內存查看器中找到已分配的內存塊。 注意塊的開始和結束。 之前和之后可能存在稱為保護塊的特殊值。
  • 現在逐步執行代碼,直到內存空閑。 在某些時候,您的代碼應該錯誤地覆蓋保護塊。 這是令人不快的陳述。

請注意,問題很可能與程序完全不同。 即使報告錯誤是免費的,覆蓋保護塊的代碼也可以在任何地方。

我的第一個問題是你如何計算len? 它只是strlen還是包含\\ 0終止符的空間? 我認為你可能會在你的strcpy中超出你的分配。 不良行為往往會出現在單詞邊界上並且隨機出現。 另外,請檢查以確保源字符串為空終止。 如果你在閱讀方面犯了錯誤並且沒有終止它們。 然后strcpy可能會隨機覆蓋一些東西。

  *(lines + slot) = (char *) malloc(len * sizeof(char));
  if(*(lines + slot) == NULL) exit(EXIT_FAILURE);
  strcpy(*(lines+slot),s);

也許試試:

  lines[slot] = (char *) malloc((len + 1) * sizeof(char));
  if(lines[slot] == NULL) exit(EXIT_FAILURE);
  if(strlen(s) <= len){
    strcpy(lines[slot],s);
  }
  else{
    /* do something else... */
  }

在一般形式方面,我還鼓勵你做一些風格上的改變,使整個事情更具可讀性,更容易遵循和抵抗錯誤。

指針算法是有效且有趣的,但我認為如果使用數組形式,你的意圖會更清晰:

free(lines[slot]);
lines[slot] = NULL;

代替

free(*(lines+slot));
*(lines + slot) = NULL;

我還鼓勵你使用更少的靜力學。 在數據結構中通過它們很容易,並將它們傳遞給您的訪問器和更改器。 事情發生的地方變得更加清楚,這會阻止你做以下事情:

static int numlines = 0;
void insert_line(char *s, int len){
    int numlines = 5;

在那里你可以介紹一些很難調試的范圍問題。

nlines和numlines的值是否相同?

在第二個參數中傳遞長度時,insert_line的調用者是否允許尾隨NUL的空間?

我不確定它是否相關,但這兩行對我來說似乎很可疑:

  *(lines + slot) = (char *) malloc(len * sizeof(char));
  if((lines + slot) == NULL) exit(EXIT_FAILURE);

首先將malloc的返回值分配給lines[slot] ,然后檢查(lines+slot) ,如果后者為NULL,則取消引用NULL指針!

另外,如果行[slot](你的*(行+插槽))不為null,那么當你將malloc()的結果賦給它時,你將泄漏內存。

我假設lineschar * lines []`並且slot在允許的邊界內!

我同意雷莫對這兩條線的懷疑,但不同意雷莫的切線。 我們應該分享信用來發現這個bug。

*(lines + slot) = some value
if((lines + slot) == NULL) then die
should be
if(*(lines + slot) == NULL) then die

暫無
暫無

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

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