2011-09-04 95 views
0

我在這裏轉貼的問題:的strstr()C和未初始化值

strstr valgrind error

+0

它看起來就像是抱怨,因爲如果str參數進行初始化(進入FUNC2)的valgrind不知道。你可以嘗試像'char * t2 = malloc(1); t2 = str;'看看它是否抱怨? –

+0

此外,避免使用'str = realloc(str,....);' - 如果失敗,'str'將被設置爲'null',並且您將失去指向最初分配的內存的指針到它。這是一個經典的內存泄漏。 –

+0

您的問題可能是由於字符串不正確的空終止引起的,但是如果您發佈了func1()的整個代碼以及valgrind的錯誤消息,那隻能是可診斷的。 – jpalecek

回答

1

第一個問題,我看到的是,FUNC2沒有錯誤檢查。無論valgrind是注意到這一點,還是抱怨別的,我都不確定。

如果你知道,在所有用例FUNC2將永遠std == NULL被調用,那你就不要需要錯誤檢查。但valgrind無法知道,即使這是真的。是否支票如:

func2(str, line) 
{ 
    char * t1 = str, * t2 = str; 

    if (str == NULL) return; 

    ... 
} 

有幫助嗎?

+0

這不太可能。 Valgrind並不關心你是否在代碼中進行任何檢查,因爲它根本不分析代碼。事實上,它只報告運行時在特定運行中發生的事件(如未初始化的數據使用,空值/懸空指針引用等)。 – jpalecek

+0

如果valgrind正在抱怨正在使用未初始化的值,檢查此類錯誤應該防止發生這種情況,因此(間接地)會修復此問題。 – ssube

+0

...除了你不能在C中檢查未初始化的數據。如果它是空的解除引用,valgrind會這麼說;它報告未初始化數據的事實表明錯誤在於別處。 – jpalecek

0

我認爲問題是,Valgrind的指出:

str = realloc(str, ....); //this is within the loop 

可以設置str爲NULL(如果realloc()失敗)。

看看像下面讓Valgrind的快樂:

char* tmp = realloc(str, ...); 
if (!tmp) { 
    abort(); // or some other error handling 
} 
str = tmp;