[解決済み】「条件付きジャンプまたは移動が初期化されていない値に依存する」というvalgrindメッセージのピンポイント解析
質問
valgrindから謎のuninitialized valuesのメッセージを受け取っていて、その悪い値がどこから来たのか、かなり謎です。
valgrindはユニット化された値が最終的に使用される場所を示すが、初期化されていない値の起源は示さないようだ。
==11366== Conditional jump or move depends on uninitialised value(s)
==11366== at 0x43CAE4F: __printf_fp (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x43C6563: vfprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x43EAC03: vsnprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366== by 0x42D475B: (within /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42E2C9B: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42E31B4: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x42EE56F: std::ostream& std::ostream::_M_insert<double>(double) (in /usr/lib/libstdc++.so.6.0.9)
==11366== by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
==11366== by 0x810B9F1: Snake::Snake::update() (snake.cpp:257)
==11366== by 0x81113C1: SnakeApp::updateState() (snakeapp.cpp:224)
==11366== by 0x8120351: RoenGL::updateState() (roengl.cpp:1180)
==11366== by 0x81E87D9: Roensachs::update() (rs.cpp:321)
特にClass::MethodXで言っている場合は、そのままostreamなどを指していることがあるので、見ての通り、かなり不可解なものになっています。おそらくこれは最適化のためでしょうか?
==11366== by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
ただ、そのようなものです。何か見落としがあるのでしょうか?超長いprintfの検出作業に頼ることなく、悪い値をキャッチする最良の方法は何でしょうか?
更新してください。
しかし、不思議なことに、valgrindはその悪い値が最初に使われたとき、それを報告しませんでした。それは乗算関数で使用されていました。
movespeed = stat.speedfactor * speedfac * currentbendfactor.val;
speedfacがユニット化されたfloatであったところ。しかし、その時は報告されず、値が出力されるまではエラーが発生します。この動作を変更するためのvalgrindの設定はあるのでしょうか?
解決方法を教えてください。
valgrindオプションを使用する
--track-origins=yes
を使用すると、初期化されていない値の原点を追跡することができます。 これはより遅くなり、より多くのメモリを消費しますが、初期化されていない値の起源を追跡する必要がある場合に非常に役に立ちます。
更新してください。 初期化されていない値が報告されるポイントについて。 valgrindのマニュアルには次のように書かれています。 :
プログラムが好きなだけジャンク(未初期化)データをコピーできることを理解することが重要です。Memcheck はこれを観察し、データを追跡しますが、文句を言うことはありません。文句を言うのは、プログラムが初期化されていないデータを、外部から見える動作に影響を与えるような方法で利用しようとしたときだけです。
より ヴァルグラインド FAQ :
初期化されていないメモリ値のコピーの報告については、何度も提案されています。残念ながら、ほとんどすべてのプログラムは初期化されていないメモリ値を合法的にコピーしており (コンパイラはアライメントを保持するために構造体をパッドするため)、Eager チェックでは何百もの誤検出を引き起こしてしまいます。そのため、Memcheck は現在、イーガー・チェックをサポートしていません。
関連
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】'std::cout'への未定義の参照