2011-09-04 22 views
0

我需要一些幫助,在C. char*初始化和strstr這是普遍的問題:的valgrind的strstr錯誤

我有一個函數func1

FUNC1()FUNC2();

問題是,valgrind給出了一個基本上說strstr可能使用未初始化值的錯誤。爲了糾正這一點,我不得不做一些像char* str = "hello world";,但我不能realloc,這是一個問題。

我用隨機字符串測試了我的程序,問題在於valgrind將str視爲未初始化的事實,但我不知道如何在不擺脫realloc能力的情況下對其進行初始化。有什麼建議麼?

的錯誤是:

==14356== Conditional jump or move depends on uninitialised value(s) 
==14356== at 0x4C29313: strstr (in path) 
==14356== by 0x401983: func2 (in path) 
==14356== by 0x401B06: func1 (in path) 
==14356== by 0x4013D7: main (in path) 
==14356== 
==14358== Syscall param execve(argv[i]) points to uninitialised byte(s) 
at 0x4ECFCB7: execve (in path) 
==14308== by 0x4E6A76C: do_system (in path) 
==14308== by 0x4013ED: main 

編輯:已在實際的功能,改變了名稱和這樣。

+0

你能告訴你用哪個參數調用func1和func2嗎? – Nubok

+0

沒有足夠的信息。顯示調用func2的代碼。 – cnicutar

+0

對不起,我更新了。 func1的最後一行應該是'str = func2(path,str);'。調用func1的代碼是'char * cmd = func1(&i,len,arr,path);',其中'i'是一個有效整數,'len'是'arr'的有效長度,'arr'是字符串數組,「路徑」是單個字符串。 – anonymous

回答

0

在你func1您有以下:

 str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2); 
     sprintf(str, "%s %s", str, currExp); 

上的sprintf雙方使用相同的字符串可能是一個壞主意。由於輸出被寫入將會破壞輸入(str),這可能導致任何意想不到的行爲。 realloc照顧無論複製可能需要的,所以你的sprintf可以通過一些strcats替代:

 str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2); 
     strcat(str, " "); 
     strcat(str, currExp); 
+0

這是一個很好的建議,我已經實現了,所以非常感謝,但這不是我的問題。據我所知,問題在於valgrind認爲'strstr()'正在傳遞未初始化的值,但我無法弄清楚原因。 – anonymous

0

我相信這是你的問題:

在FUNC2:

str = realloc(str, (stringLen + pathLen+1)*sizeof(char)); 

    memmove(&str[rplcIndx + pathLen], &str[rplcIndx+2], stringLen-rplcIndx-2); 
    memcpy(&str[rplcIndx], path, pathLen); 

memmove不復制空終止符(位於stringLen,但最後複製的字節爲rpcIndx+2+stringLen-rpcIndx-2-1 = stringLen-1(記住src[len]是第一個字節不被複制),這意味着

  • 空終止的位置沒有初始化
  • 字符串可能是不正確終止

順便說一句,如果可以的話,使用asprintf是安全,方便,防呆做的方式很多字符串操作任務,儘管它可能有點不太有效。