質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1957閲覧

メモリリークを検出するツールを教えて欲しい

valgrind_val

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/08/29 12:45

編集2018/08/29 13:25

現在大学でC言語を使って数値計算をしています.
###困っている問題
同じプログラムを僕のPCを使った場合と,
研究室の計算機を使った場合で結果が違うという現象が起きています.
またprintfを特定の場所に挟むと,
違っていたはずの結果が一致しはじめます.

###自分で行ったこと
上のような問題はメモリリークや配列の領域外を参照した際に起こると教えてもらったので,
プログラムを見返したりデバッグツールを使用して解決したいのですが行き詰まっています.

今まで使用したツールやオプションは
●valgrind (オプションは--tool=memcheck --leak-check=full )
●gcc -D_GLIBCXX_DEBUG -fsanitize=address -fsanitize=leak
●cppcheck

等ですが結局エラーが出ませんでした
(valgrindではstill reachableとsuppressed以外は0バイトだったのでエラーなしと判断しています.)

###質問
上記のような問題を解決するツールやオプションをご存知でしたら教えてください.

本当はコードを乗せた方が良いのかもしれませんが,
かなり冗長なので止めておきます.
ふわふわした質問で申し訳ありません.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2018/08/29 13:26

最適化のオプションで挙動は変化しますか?
valgrind_val

2018/08/29 13:31 編集

返信ありがとうございます.大学の計算機では上記のツールは今のところ使用できないので,わかりません。確かにそのチェックはしてみるべきかもしれませんね!
yumetodo

2018/08/29 13:31

いや、大学のツールにも最適化オプションくらいあるでしょう?Cコンパイラなんですよね?あと手元でも例えばgccなら-O0と-O2で挙動がどうなるとかそういうことです。というのは未定義動作を踏んでいるのではないかと疑っているので。
valgrind_val

2018/08/29 14:14 編集

普段10分ほどで終わるプログラムなのですが,-o0の方がなかなか終わりません.-o2の方は10分程度で終わり,結果は最適化しない場合の結果と同じでした. -o0の方の結果が出たらまたご報告させて頂きます.
valgrind_val

2018/08/29 14:21 編集

遅くなりました.o0をつけた時とo2をつけた時で挙動が違いました... 未定義動作を知らなかったのですが, これはツールやオプションで発見できるものですか? それとも目視で頑張って探すほかないですか?
yutakau8255

2018/08/29 14:24

OSはLinuxですか? 書いてもらっているツールで十分突き止められそうな気がしますが.
valgrind_val

2018/08/29 14:28 編集

いいえMacです.未定義動作は知らなかったので,これからよく調べてみます
yutakau8255

2018/08/29 14:31

冗長なコードを削って、問題のある部分を絞り込んでいくのもよくやるやり方です.
valgrind_val

2018/08/29 14:34

それが一番良さそうですね.ありがとうございます!
t_obara

2018/08/29 14:36

コードによるのではないでしょうか。意図していない場所にデータ等を書き込んでしまう、参照してしまうことで問題が発生する可能性がありますが、静的解析ツールでは限界があります。UnitTestを使って機能ごとに確認したり、冗長と言われるコードをリファクタリングして見通しをよくしたり、問題確認のために最小限のコードにしてみて試す等地道に進めることが結局は早道になるかもしれません。
valgrind_val

2018/08/29 14:44 編集

わかりました.Unittestというのは知らなかったので調べてみます.また,冗長なプログラムを改善していこうと思います.
yohhoy

2018/08/30 04:21 編集

計算過程や結果は、浮動小数点数(float, double)でしょうか?計算結果の差異はかなり大きいものなのでしょうか?浮動小数点演算は(プログラムに全くバグが無い場合でも)、動作環境(CPU,OS)やコンパイラ最適化レベルの影響をうけることがあります。
valgrind_val

2018/08/30 04:21 編集

doubleを使用しています.差異は結構あります (100倍くらい違う箇所があります)
yohhoy

2018/08/30 04:26

アルゴリズム次第ですが、途中の演算精度が少しずれるだけで最終結果が大きく変わるような計算であれば、浮動小数点数がらみのトラブルも疑ってみてもよいかもしれません。http://d.hatena.ne.jp/sumii/20070604/p1 など。
valgrind_val

2018/08/30 04:29

うわぁ...こんな恐ろしい事が起こる可能性もあるのですね.大変有用な情報ありがとうございます!
yohhoy

2018/08/30 04:32

実は「printfを特定の場所に挟むと, 違っていたはずの結果が一致しはじめます. 」は、float/double精度問題でよく見られる事象なのでした。役に立てて頂ければ何よりです:D
yumetodo

2018/08/31 10:02

あー精度か・・・見落としていた
guest

回答1

0

ベストアンサー

追記要請欄にてはなしたとおりUBじゃないかなと。

未定義動作(Undefined Behavior, UB)やその周辺のC++の用語のあまりにも詳しすぎてかえってわからないかもしれない解説は

あたりに譲るとして、ざっと未定義動作とされるものを踏むとなにがまずいかというと、コンパイラは何をしても許されるということです。

具体例としては

などが有名です。

C/C++において未定義動作を踏むのは極めて容易で

などを初めキリがありません。

未定義動作を踏む定番パターンのうち、いくつかについては、コンパイラの警告を最大限出させたり、コード解析をさせるなどする、UndefinedBehaviorSanitizerを利用する、などによって検出できることがありますが、結局の所大量のprintfと地道な試行錯誤をするよりほかないことが多いです。

これを少しでも減らすためには、単体テスト(UnitTest)を実施しコードを疎結合にしていって、少しづつ確実に安全なコードを増やしていくことが重要です。

UnitTestのフレームワークはいろいろあって有名なのはGoogleTestだと思いますが、私はiutestを使っています。

投稿2018/08/29 15:07

編集2018/08/29 15:17
yumetodo

総合スコア5852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

valgrind_val

2018/08/29 15:14

丁寧な回答ありがとうございます。 行き詰まっていたのが解消されそうです。助かりました
mkgrei

2018/08/29 15:16

O2とO0の挙動が異なる場合、わりかしお手上げの記憶がありましたが、その場合でもgdbでメモリを引っ掛ける事は可能でしょうか?
yumetodo

2018/08/29 15:18

いやぁ、gdbで追うのはきついんじゃないかなぁと。そもそも最適化された状態でgdb掛けてもさっぱりわからないでしょうし(読める人はいるだろうし、必要に迫られてVSのデバッガで追いかけたこともあるけど正直きつすぎて無理)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問