2

プログラムをvalgrindで実行すると、エラーが1つ発生します。問題は、初期化されていないバイトがどこに割り当てられたかを教えてくれないことです。

==22141== Syscall param write(buf) points to uninitialised byte(s)
==22141==    at 0x5B68900: __write_nocancel (syscall-template.S:82)
==22141==    by 0x5AFB882: _IO_file_write@@GLIBC_2.2.5 (fileops.c:1289)
==22141==    by 0x5AFB749: new_do_write (fileops.c:543)
==22141==    by 0x5AFCEB4: _IO_do_write@@GLIBC_2.2.5 (fileops.c:516)
==22141==    by 0x5AFDD3E: _IO_switch_to_get_mode (genops.c:189)
==22141==    by 0x5AFBA96: _IO_file_seekoff@@GLIBC_2.2.5 (fileops.c:999)
==22141==    by 0x5AF4F25: rewind (rewind.c:37)
==22141==    by 0x567D149: CBFileAppend (CBFileEC.c:69)
==22141==    by 0x5473AFA: CBDatabaseCreateDeletionIndex (CBDatabase.c:270)
==22141==    by 0x5473195: CBInitDatabase (CBDatabase.c:112)
==22141==    by 0x54721A1: CBNewAddressStorage (CBAddressStorage.c:37)
==22141==    by 0x401F67: main (testCBAddressManager.c:226)
==22141==  Address 0x402a009 is not stack'd, malloc'd or (recently) free'd
==22141==  Uninitialised value was created by a stack allocation
==22141==    at 0x546F750: ??? (in /media/sf_BitEagle_Projects/cbitcoin/bin/libcbitcoin-storage.2.0.so)

これがスタックへのある種の無効なポインタを意味すると仮定するのは正しいでしょうか?これはrewind()で発生し、巻き戻しがこのようになる理由がわかりません。valgrindプロセスをgdbにアタッチしてみて、ftell()の結果をファイルポインターに出力しようとしました。これにより、valgrindは次のように終了しました。

valgrind: m_syswrap/syswrap-main.c:1296 (vgPlain_client_syscall): Assertion 'sci->status.what == SsIdle' failed.
==22938==    at 0x3804CA36: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==22938==    by 0x3804CBDC: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==22938==    by 0x38091F55: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==22938==    by 0x3808E5DF: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==22938==    by 0x3808F739: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==22938==    by 0x3809F7D5: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)

sched status:
  running_tid=1

Thread 1: status = VgTs_Runnable
==22938==    at 0x5B68900: __write_nocancel (syscall-template.S:82)
==22938==    by 0x5AFB882: _IO_file_write@@GLIBC_2.2.5 (fileops.c:1289)
==22938==    by 0x5AFB749: new_do_write (fileops.c:543)
==22938==    by 0x5AFCEB4: _IO_do_write@@GLIBC_2.2.5 (fileops.c:516)
==22938==    by 0x5AFDD3E: _IO_switch_to_get_mode (genops.c:189)
==22938==    by 0x5AFBA96: _IO_file_seekoff@@GLIBC_2.2.5 (fileops.c:999)
==22938==    by 0x5AF1AA5: ftell (ioftell.c:41)
==22938==    by 0x40133F: ??? (in /media/sf_BitEagle_Projects/cbitcoin/bin/testCBAddressManager)
==22938==    by 0xF75E467: ???
==22938==    by 0x7FEFFF3BF: ???
==22938==    by 0xF75E467: ???
==22938==    by 0x546DE87: ??? (in /media/sf_BitEagle_Projects/cbitcoin/bin/libcbitcoin-storage.2.0.so)
==22938==    by 0x7FEFFF3DF: ???

このエラーの原因を特定するにはどうすればよいですか?

編集:私が抱えていた他の問題を修正しましたが、これは解決しません。

これはここのコードからです:https ://github.com/MatthewLM/cbitcoin/blob/master/test/testCBAddressManager.c

ファイルIOコードはここにあります:https ://github.com/MatthewLM/cbitcoin/tree/master/dependencies/storage

ありがとうございました。

4

1 に答える 1

2

システムコール パラメータ write(buf) が初期化されていないバイトを指しています

必ずしもそれが間違っているわけではありません。検討:

int main() {
  struct Foo { int a; int b; int c; } x;
  x.a = 1; x.c = 3;
  write(1, &x, sizeof(x));  // part of x is not initialized
  return 0;
}

後でデータを読み込んで.aメンバー.cのみを使用する場合、プログラムは適切に定義されています。

これがスタックへの何らかの無効なポインタを意味すると仮定するのは正しいでしょうか?

いいえ。

データのどの部分が初期化されていないかを本当に知りたい場合は、Valgrindの組み込み gdbserverを使用し、 monitor check_memory defined commandを発行します。

于 2013-02-04T04:21:54.470 に答える