[解決済み] valgrind使用時のサイズ1の無効な読み取り
2022-02-02 20:14:39
質問
valgrindを使用すると、このような出力が得られます。
==19923== Invalid read of size 1
==19923== at 0x52CCCC0: vfprintf (vfprintf.c:1632)
==19923== by 0x52F4772: vasprintf (vasprintf.c:59)
==19923== by 0x52D3A56: asprintf (asprintf.c:35)
==19923== by 0x400D77: addToList (pa1.c:124)
==19923== by 0x4010AF: md5Hash (pa1.c:220)
==19923== by 0x401138: newFile (pa1.c:244)
==19923== by 0x401260: searchDirects (pa1.c:280)
==19923== by 0x401451: main (pa1.c:339)
==19923== Address 0x585b720 is 0 bytes inside a block of size 27 free'd
==19923== at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==19923== by 0x401144: newFile (pa1.c:246)
==19923== by 0x401260: searchDirects (pa1.c:280)
==19923== by 0x401382: directoryCheck (pa1.c:312)
==19923== by 0x4012CD: searchDirects (pa1.c:290)
==19923== by 0x401451: main (pa1.c:339)
==19923== Block was alloc'd at
==19923== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==19923== by 0x52F47D7: vasprintf (vasprintf.c:73)
==19923== by 0x52D3A56: asprintf (asprintf.c:35)
==19923== by 0x40112C: newFile (pa1.c:239)
==19923== by 0x401260: searchDirects (pa1.c:280)
==19923== by 0x401382: directoryCheck (pa1.c:312)
==19923== by 0x4012CD: searchDirects (pa1.c:290)
==19923== by 0x401451: main (pa1.c:339)
ここで、私のコードの問題であることを絞り込みました。
else
{
currentList = headList;
printf("This is where I will put the code to create the Linked list!\n");
if(currentList != 0)
{
while(currentList->nextList != 0)
{
if(currentList->key = key)
{
asprintf(&buff, "%s %s", currentList->value, dirValue); // PROBLEM IS HERE
printf("Here is the new string that holds the directory paths: %s\n", buff);
currentList->value = buff;
free(buff);
printf("Here is the new string that holds the directory paths: %s\n", currentList->value);
return;
}
currentList = currentList->nextList;
}
currentList->nextList = malloc(sizeof(struct List));
printf("Adding a new node\n");
//Reached the end of the Linked list and didn't find the
//same key so create a new node.
currentList = currentList->nextList;
currentList->key = key;
currentList->nextList = NULL;
currentList->value = dirValue;
}
}
私は多くのエラーを持っており、valgrindの出力全体を提供することは過剰であると感じています。私が得ているすべてのエラーは、私がasprintf()を使用しているところに戻ってきます。
("addToList (pa1.c:124)" line in the report)
. このコードの上では
char *buff = NULL;
と
currentList->value
には、asprintf を使って追加したい文字列があります。なぜInvalid read size 1というエラーが多発するのか、その理由を教えていただけると幸いです。また、asprintf()の結果をプリントアウトすると、文字列は期待通りに追加されます ありがとうございます。
どうすればいいですか?
無効な読み取りは、すでに解放されたメモリブロックの開始点にあります。
currentList->value = buff;
free(buff);
printf("Here is the new string that holds the directory paths: %s\n", currentList->value);
return;
あなたは
currentList->value = buff;
の中に
printf()
を解放したところです。
buff
. これは災難としか言いようがない。 もし
currentList->value
の後に関数を呼び出す際に使用されます。
return
となると、大きな問題が発生します。
を移動させることで、1つの警告を修正することができます。
printf()
の前に
free()
が、このコードでは大きな問題が発生しそうです。 を削除したほうがいいかもしれません。
free(buff);
- しかし、その代わりにデータが実際に解放される場所を特定する必要があります。
関連
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み] テスト
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み] struct has no member named
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み] テスト
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン