4

私が欲しいのは、どの関数が特定の関数 A() (C プロジェクト内) を呼び出すか、どの関数がそれらの関数を呼び出すかなどを教えてくれるツールです。それらが呼び出されると、関数 A() が呼び出される可能性があります。

たとえば、次の関数がプロジェクトに散らばっています。

 void A()
 { /*does something*/ }

 void B()
 {
   A();
   /*and more stuff*/
 }

 void C()
 {
if(unlikely_to_be_false)
    A()
/* moar stoff */
 }

 void D()
 {
/* code that does not refer to A() at all */
 }

 void E()
 {
C()
 }

素晴らしいツールをパラメータ A で実行すると、関数 BC と E が何らかの形で返されます。

これに近いですが、正確には達成したくありません。プロジェクトのどこかに変数がある場合、それに対するすべての読み取り/書き込み操作(直接または間接)を見つけます。

例えば:

void A()
{
    char* c; // this is our little variable

    B(c); // this is in the resulting list
}

void B(char* x)
{
    printf("%c", x); // this is definately in the list

    *x='d' // this is also in the list

    C(x); // also in the list
}

void C(void* ptr)
{
    ptr = something; // also in the list
}

上記が emacs でうまく動作することができれば、私は非常に喜んでいます!

4

2 に答える 2

7

cscopeツール(http://cscope.sourceforge.net/)を見ることができます。それは非常に大規模なプロジェクトと多くの異なるクエリタイプをサポートします:

  • このC記号を探す
  • このグローバル定義を見つける
  • この関数によって呼び出される関数を検索する
  • この関数を呼び出す関数を検索します...
于 2012-02-25T15:50:08.790 に答える
2

まず、異なるコンパイル単位間の呼び出しの問題があります。たとえば、foo.c定義された関数foo1を呼び出す関数をbar2定義するbar.c(そして、定義された inまたは別の fileをbar2呼び出す可能性があります) 。foobarfoo.cfoofoo.c

次に、ニーズに合わせてGCC プラグインまたはMELT拡張機能を開発することを検討してください。

高価な静的アナライザー ツールを購入することもできます。

Emacs には、興味があるかもしれないcedeがあります。

于 2012-02-25T15:44:59.380 に答える