1

この Valgrind 出力を取得します (これが唯一のエラーです)。

==20627== Conditional jump or move depends on uninitialised value(s)
==20627==    at 0x804913A: main (main.c:223)

main.cは大まかに次のようになります。

//other code

char **sets;

//other code

//char** get_char_sets(FILE *source);
sets = get_char_sets(config_file); // I malloc the sets in here

//other code

int i = 0;
while(sets[i]){ // line 223
    free(sets[i]);
    i++;
}
free(sets);

//other code

get_char_sets次のようになります。

char** get_char_sets(FILE *source){

    char **sets = malloc((n + 1) * sizeof(char*));

    for(int i=0;i<=n;i++){
        sets[i] = malloc(1 * sizeof(char));
    }

    //rest of function

    return sets;
}

valgrind は、初期化されていない変数を使用していると言っていることを理解しています。私が見ることができるのは だけですがsets、返されたポインターが割り当てられます。malloc()get_char_sets()

コードを修正するためにその valgrind エラーを取り除くにはどうすればよいですか?

4

3 に答える 3

4
while(sets[i]) { // line 223
    free(sets[i]);
    i++;
}

ある時点で、割り当てられたセットは終了します。次にsets[i]、割り当てられたメモリの外側で、設定していないものを指します。

コードの残りの部分を考えると、次のように修正できます。

for(int i = 0; i < n; i++) /* Note < instead of <=. */
    sets[i] = malloc(1);

size[n] = NULL; /* Add terminator marker. */
于 2012-04-24T15:00:09.347 に答える
4

の値に制限はなく、i最終的に範囲外になります。

while(sets[i]){

(のようなもの)に変更:

int i = 0;
while(i <= n && sets[i]){ /* Ensure check i <= n before accessing sets */
    free(sets[i]);
    i++;
}
free(sets);

NULLセンチネル値を追加することもでき、setsそのwhileままで問題ありません。

于 2012-04-24T15:00:27.367 に答える
3

から割り当てられましmallocた。n+1char*sets

for(int i=0;i<=n;i++){
    sets[i] = malloc(1 * sizeof(char));
}

したがって、 a が失敗しない限りmalloc、それらはすべて non-NULLです。しかし、その後freeNULL

int i = 0;
while(sets[i]){ // line 223
    free(sets[i]);
    i++;
}

これは、割り当てられた (to) メモリの最後を超えてアクセスし、sets未定義の動作を引き起こします。

于 2012-04-24T15:02:12.647 に答える