5

私はCコードを生成するコンパイラを書いています。生成されるプログラムはmain関数のみで構成され、malloc()で割り当てられる大量のメモリを使用します。割り当てられたメモリのほとんどはプログラムのごく一部でしか使用されません。また使用されることはないので、使用後にfree()することをお勧めします。それなら、プログラムの最後にfree()dされていないメモリ、つまりまだ到達可能なメモリについてvalgrindが報告してくれたら嬉しいです。この種の問題を自動的にチェックするために、Makefile内で--error-exitcode=1のvalgrindを使用しています。

問題は、到達可能な割り当てがまだある場合に、valgrindを1で終了させる方法はありますか?

4

4 に答える 4

2

valgrindのマニュアルには次のように書かれています。

--show-reachable = yesが指定され、それらが出力された場合でも、間接的に失われ、まだ到達可能なブロックは真の「エラー」としてカウントされません。これは、そのようなブロックをプログラマーが直接修正する必要がないためです。

valgrindレポートをエラーとして「まだ到達可能」にする方法が見つかりませんでした。これを行うための唯一のオプション(valgrindにパッチを適用する以外)は、valgrindの出力をキャプチャし、「まだ到達可能な」行を解析することであるようです。

于 2011-05-20T12:31:55.000 に答える
2

Valgrind出力をgrepする代わりに:コンパイラーを変更して、以下を出力します。

int main() { return foo_main(); }
int foo_main() {  /* whatever you've emitted before */ }

割り当てられたブロックをグローバル変数に割り当てていないと仮定すると(関数が1つしかないため意味がありません)、「まだ到達可能」を「確実にリーク」に変換しただけです。

おそらくさらに良い変革:exit(0)メインを呼び出さないでください。return 0;代わりにに変更してください。正味の効果は上記と同じである必要があります-__libc_mainこれであなたが呼び出さexitれ、その時点でのすべてのローカル変数mainはスコープ外になります。

于 2011-05-22T20:02:42.517 に答える
2

終了時に到達可能なブロックがある場合にエラーで終了するために使用するporoperオプション:

valgrind --tool=memcheck --leak-check=full --show-reachable=yes --errors-for-leak-kinds=all

Valgrindマニュアルから:

重大度の異なるさまざまな種類のリークがあるため、興味深い質問は、どのリークを真の「エラー」としてカウントする必要があるのか​​、どのリークをカウントしないのかということです。

この質問への回答は、ERRORSUMMARY行に出力される数値と--error-exitcodeオプションの効果に影響します。まず、-leak-check = fullが指定されている場合にのみ、リークは真の「エラー」としてカウントされます。次に、オプション--errors-for-leak-kinds =は、エラーと見なすリークの種類のセットを制御します。デフォルト値は--errors-for-leak-kinds=define、possibleです。

于 2015-07-23T14:59:35.193 に答える
1

または、makefileに小さなシェルスクリプトを含めて、valgrindの出力ログをgrepし、それに応じて終了することもできます。

于 2011-05-21T01:11:17.880 に答える