2011-12-31 58 views
1

我正在編譯這個程序,編譯進行得很好。我執行它的那一刻,它失敗了free(): invalid pointer錯誤。GCC中是否有編譯選項在編譯時檢查內存錯誤?

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char *p = NULL; 
    if ((p = (char *) malloc((int)sizeof(char) * 100)) == NULL) { 
     printf("ERROR: unable to allocate memory\n"); 
     return -1; 
    } 
    p += 50; 
    free(p);  
    return 0; 
} 

我使用gcc -o memtest m.c命令編譯。

是否有任何GCC編譯器選項會在編譯期間給出關於這些無效指針錯誤的警告/錯誤/指示?

+5

無法靜態檢測到大部分重新分配錯誤。 – 2011-12-31 06:46:17

+1

ISO/IEC 9899:1999§7.20.3.2'free'函數說: _'free''函數會導致'ptr' [它的參數]指向的空間被釋放,也就是說,使得 可用於進一步的分配。如果'ptr'是一個空指針,則不會發生任何操作。否則,如果 參數與先前由「calloc」,「malloc」或「realloc」函數返回的指針不匹配,或者如果通過調用「free」或「realloc」釋放空間,則返回 行爲是未定義的。由於'malloc()'沒有返回'p + 50',所以你會得到未定義的行爲;核心轉儲就是這樣一個未定義的行爲。 – 2011-12-31 08:40:12

+0

運行時版本:http://stackoverflow.com/questions/8080046/gcc-flags-to-improve-run-time-error-catching谷歌「靜態分析」。 – 2016-06-06 15:01:21

回答

5

編號用途Electric FenceValgrind

+0

http://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging – Anycorn 2011-12-31 07:05:23

+0

Valgrind的+1。 – selbie 2011-12-31 07:09:53

+1

Electric Fence和Valgrind非常棒,但也能在運行時工作(就像OP已經獲得的錯誤),而不是編譯時。 – caf 2011-12-31 07:55:14

1

不,不是因爲在實踐中這種檢測在編譯時檢測到這樣的錯誤會只觸發最瑣碎的情況,就像你的例子。