【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20583

メンバ関数の列挙
投稿者---えんぴつマン(2005/04/10 16:10:45)


Linux上で動作するC++プログラムのファイル群(500ファイル程度)が
あるのですが、この中で、あるクラス(例えばAとする)を使用して
いる全メンバ関数を列挙するツールを作成しようと考えています。
※因みに、このツールの開発言語は、C、C++、Perlのいずれかである
 のが望ましく、Linuxで動作する必要があります。

例えば、Aを利用しているクラスがBであり、
void B::useA()
{
  A objA;
  ・・・以下、省略・・・
}
のように使用しているとすると、"void B::useA()"を特定し、これを
文字列として取得したいのですが、どのように特定すればよいのか方
法が思いつきません。

何かよいアイディアはないでしょうか?




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:メンバ関数の列挙 20584 えんぴつマン 2005/04/10 16:16:09
<子記事> Re:メンバ関数の列挙 20585 GPL software 2005/04/10 16:50:50
<子記事> Re:メンバ関数の列挙 20614 えんぴつマン 2005/04/11 23:34:00


No.20584

Re:メンバ関数の列挙
投稿者---えんぴつマン(2005/04/10 16:16:09)


すみません、追加で書かせて頂きます。

>何かよいアイディアはないでしょうか?

もしくはそのようなツールがすでにありましたら、教えてください。
よろしくお願いします。



この投稿にコメントする

削除パスワード

No.20585

Re:メンバ関数の列挙
投稿者---GPL software(2005/04/10 16:50:50)


doxygen


この投稿にコメントする

削除パスワード

No.20586

Re:メンバ関数の列挙
投稿者---doxygen(2005/04/10 17:01:35)


文字列を取るには、XML 出力させてそっちを解析してね。

ちなみに、自力で完全に実現するには、C++ とプリプロの字句解析、構文解析、意味解析までをほぼフル実装する必要があると思う。
適当に手を抜けば(テンプレートは無視とか)多少楽になるけど、
自力で方法が思いつけない人がゼロから自作するのは非現実的だと思うな。

XML にしても、文字解析はいっしょだけど、ライブラリ使えるし、
構文的にも C++を直接解析するよりは楽なはず。



この投稿にコメントする

削除パスワード

No.20587

Re:メンバ関数の列挙
投稿者---doxygen(2005/04/10 17:44:14)


自力で関数を探す例.....
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200501/05010009.txt
※完全な君の要望を得るにはぜんぜん足りません。
 あくまで、C言語限定、その他制限つきで関数名を探す例です。


更に、呼ばれる関数がどのクラスか、オーバーロードがあるか、オーバライドがあるか、テンプレートのバインドされてるか、マクロ経由で呼ばれてないか、どちらの名前空間が有効か、..........
正確な解釈はコード出力がないコンパイル作業そのもの。


もちろん、doxygen の解釈結果も完全ではありません。


この投稿にコメントする

削除パスワード

No.20590

Re:メンバ関数の列挙
投稿者---えんぴつマン(2005/04/10 21:11:48)


レスポンスをありがとうございます。
以前の書き込みは、かなり言葉が足りなかったと思います。
申し訳ありません。

関数名を取得したかった理由は、あるクラスを修正した際にそれが影響
する範囲(どのクラスで修正したクラスを利用しているのか)を把握し、
その範囲でのテストを行いたかったためです。

現在は手作業でこれを行っていますが、作業に丸2日程度かかってしま
います。さらに仕様変更が発生するたびに、この洗い出しを行っている
ため、こういった作業は機械に任せることはできないかと考えたのです。

ですから、例えば、
 「修正したファイルを削除してコンパイルし、エラーとなったファイル
  名と行番号を得る」
という程度でもよかったのですが、そういったことを容易に行う方法が
あるのか、またはそういったツールがすでにあればそれを教えていただ
きたかったのです。



この投稿にコメントする

削除パスワード

No.20598

Re:メンバ関数の列挙
投稿者---doxygen(2005/04/11 02:41:20)


>関数名を取得したかった理由は、あるクラスを修正した際にそれが影響
>する範囲(どのクラスで修正したクラスを利用しているのか)を把握し、
>その範囲でのテストを行いたかったためです。

予想通りだけど?

>という程度でもよかったのですが、そういったことを容易に行う方法が
>あるのか、またはそういったツールがすでにあればそれを教えていただ
>きたかったのです。

んで、doxygen の call graph で十分楽になると思うけど?


C と違って、オーバロードとか、オーバライドとかある言語だし、「関数名」だけじゃ実際に参照される先は特定できないってのはわかる?

つまり、お望みの機能は簡単にはつくれないし、手を抜くにはある程度、人間の関与は必要ってこと。
支援ツールならともかく、完全な自動化するためにはコンパイラが名前の引き当てするのに匹敵する処理が必要だったりするんだよ。
自作できるレベルの人は、最初から掲示板に質問しないと思うな。

特に C++ として厄介な、演算子のオーバロードとか、テンプレートの特殊化とか、マクロ内に関数あったらどうするかとかを無視したとしても、相当大変なのは一緒でしょ。


UMLとの同期可能なソフトなら、クラス図の依存関係が出せたりするけど、言語が C++ ってのもネックだね。言語に対応するのが難しいからお値段も張るし。それでもリバースエンジニアリング能力は完全とは言いがたいし。
※そのソフトが吐いたコードならほぼ同期取れるけど。

1ライセンスに数十万から百万近い予算がとれるなら、Rational Rose
とか、Borland Together あたりにお望みの機能があるよ。
(Linux 版は直接知らないけど...)

単価100として君の2日分の工数が十万程度と考えれば、一見悪くない相談かもしれない。
ただし、ソフトの習熟工数も考えておこうね。こいつらは取っ掛かり悪いから。開発プロセスをまるまるソフト様に合わせるくらいの覚悟はしよう。

それがむりなら、おとなしくフリーソフトで我慢しとけってことですね。


この投稿にコメントする

削除パスワード

No.20599

Re:メンバ関数の列挙
投稿者---cppunit(2005/04/11 02:54:31)


>ですから、例えば、
> 「修正したファイルを削除してコンパイルし、エラーとなったファイル
>  名と行番号を得る」
>という程度でもよかったのですが、そういったことを容易に行う方法が
>あるのか、またはそういったツールがすでにあればそれを教えていただ
>きたかったのです。

この方向での別回。

CppUnit であらかじめ全クラスに完全な UnitTest を作成。
ソースコードは CVS なりで版管理。(Subversion でもなんでもいい)

んで、とりあえずプロトを組んで暫定的に修正してみて退行テストを流す。
CppUnit に掛かった奴が問題のある影響を受けた奴だから、それから本対応考える。
問題範囲が広すぎたり、破棄するときは版を戻すだけ。

UnitTest の洗い出しと実装に初期投資はかかるけど、頻繁に何度もやるんなら最初から作っておいたほうがいいかもしんない。一回作っとくと楽だよ。
※xUnit の情報はXP関係の資料にあると思う。


この投稿にコメントする

削除パスワード

No.20600

Re:メンバ関数の列挙
投稿者---επιστημη(2005/04/11 10:48:59)


>関数名を取得したかった理由は、あるクラスを修正した際にそれが影響
>する範囲(どのクラスで修正したクラスを利用しているのか)を把握し、
>その範囲でのテストを行いたかったためです。

ソースコードから得られる静的な情報だけでは穴が開きませんか?

class Base {
public:
  virtual void function();
};

class A : public Base {
  virtual void function();
};

void B::useBase() {
  Base* p;
  ...
  p->function();
}

こんなとき、B::useBase()が A::function()を呼んでいるか否かは
動かしてみるまでわかりません。

穴が開いて見逃すくらいなら、毎回すべてのテストを行うほうがまだマシかと。



この投稿にコメントする

削除パスワード

No.20601

Re:メンバ関数の列挙
投稿者---同感(2005/04/11 11:25:16)


>こんなとき、B::useBase()が A::function()を呼んでいるか否かは
>動かしてみるまでわかりません。
>
>穴が開いて見逃すくらいなら、毎回すべてのテストを行うほうがまだマシかと。

「Base::function とその派生クラス一覧」(漏れない最小限)がお望みじゃないでしょか。



> ツールを作成しようと考えています。
※このツール、お望みの機能をきちんと盛り込んだらほぼコンパイラだし、
※まともに実装したら本来のメンテナンス対象よりも規模が大きくなったりして笑


この投稿にコメントする

削除パスワード

No.20602

Re:メンバ関数の列挙
投稿者---επιστημη(2005/04/11 11:44:36)


>「Base::function とその派生クラス一覧」(漏れない最小限)がお望みじゃないでしょか。

モノによっては 漏れない最小限 = ほとんど全部 ってこともあり得るわけやね ^^;



この投稿にコメントする

削除パスワード

No.20614

Re:メンバ関数の列挙
投稿者---えんぴつマン(2005/04/11 23:34:00)


たくさんの回答をありがとうございます。
ツールの作成はどうやら非現実的のようですね。

教えていただいたツール"doxygen"をキーワードで検索したら、
他にもいろいろなツールが引っかかりました。

今回の件は、とりあえずあきらめて手動で洗い出しを行うこと
にしますが、見つかったツールは使用してみて検討してみます。

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



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧