0

char*初期化とstrstrC で助けが必要です。これは一般的な問題です。

私には機能がありますfunc1

func1() func2();

問題は、valgrind が基本的に strstr が初期化されていない値を使用している可能性があるというエラーを出すことです。これを修正するには、 のようなことをしなければなりませchar* str = "hello world";んが、それができませんrealloc。これが問題です。

私は自分のプログラムをランダムな文字列でテストしましたが、問題は valgrind がstr初期化されていないものとして扱っているという事実ですが、再割り当てする機能を取り除かずに初期化する方法がわかりません。助言がありますか?

エラーは次のとおりです。

==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 

編集:実際の機能に追加、名前などを変更。

4

2 に答える 2

0

あなたfunc1には次のものがあります:

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

の両側で同じ文字列を使用することsprintfは、おそらく悪い考えです。出力が書き込まれると、入力(str)が上書きされ、予期しない動作が発生する可能性があります。 realloc必要なコピーをすべて処理するため、sprintfをいくつかのstrcatに置き換えることができます。

        str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2);
        strcat(str, " ");
        strcat(str, currExp);
于 2011-09-04T19:38:22.483 に答える
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);

memmovenull ターミネータをコピーしません (位置stringLenは ですが、最後にコピーされたバイトは (最初のバイトがコピーされていないことをrpcIndx+2+stringLen-rpcIndx-2-1 = stringLen-1思い出してください) になりsrc[len]ます)。これはつまり、

  • null ターミネータの位置が初期化されていません
  • 文字列が正しく終了していない可能性があります

ところで、可能であれば、asprintf多くの文字列操作タスクを実行するための安全で簡単で確実な方法を使用しますが、効果は少し劣るかもしれません。

于 2011-09-04T20:34:33.053 に答える