2011-10-26 3 views
2

継承されたコードベースで再帰関数呼び出しを検索して除去する必要があります。 これまで静的解析を行い、これらの機能を見つけるツールは見つけられませんでした。Cコードで再帰関数呼び出しを検出するツールはありますか?

+2

なぜこれを行う必要がありますか? – sth

+1

@sth:あなたはなぜ知りたいですか? – duedl0r

+0

@ duedl0r:彼が解決しようとしている問題が再帰関数を避けるよりも良い解決策を持っているかもしれないので、 – sth

答えて

5

あなたはcflowをしようとする場合があります:

CFLOWユーティリティが書き込ま、オブジェクトファイルまたはアセンブラ、C言語、lex、yaccのソースファイルのコレクションを分析し、グラフを構築しようとするもの標準出力、外部参照をグラフ化します。

コールグラフを印刷し、再帰関数をマークする必要があります。

+0

cflowは(私が書いたruby scripの助けを借りて)かなりうまくやってくれました。私は望んでいないので、最大限のカバレッジシナリオを見つけるために深く潜んでください。しかし、GNU cflowはLinuxベースのシステムからしかコンパイルされません。誰でもWindowsのポートを知っていますか? – Sam

4

あなたのコードが関数ポインタを介して間接呼び出しを持っている場合、その中の再帰呼び出しを検出することは非常に難しいかもしれません(一般的な場合は、停止問題と同じです。

しかし、私は再帰を排除することは努力する価値があるとは確信していません。いくつかの再帰的なアルゴリズムや問題については、スタック(ヒープ)でシミュレートするだけで置き換えられますが、あまり役に立たない(コードを読むことができなくなります)。

もっと実用的な解決策(少なくともLinuxでは)は、スタックサイズを制限し、スタックを埋めることによってテストが実行されるまで実行します。次に、デバッガを使用して、デバッガの動作を理解することができます。

私はあなたが再帰についてそれほど気にはならないと思う...

+0

スタックのサイズを制限したり、スタックオーバーフローを引き起こすという考えは決して考えませんでした。素晴らしい提案! – beta

+0

実行中のプログラムをサンプリングするもう1つの方法は、プロファイリングを有効にしてコンパイルし(gccの-pg)、結果に対して(g)profを実行することです。 Gprofは(初歩的な)コールグラフを表示します。 – wildplasser

0

CILは、CプログラムのためのCFGを生成することができますが、それは少し主食に入れてハンマーを使用してのようなものです。

関連する問題