Анализатор кода C для отслеживания вызовов функций и доступа к переменным внутри проекта (было бы неплохо совместимость с emacs) - PullRequest
4 голосов
/ 25 февраля 2012

Мне нужен инструмент, позволяющий мне сказать, какие функции вызывают конкретную функцию 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, он каким-то образом возвращает функции B C и 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, я был бы очень рад!

Ответы [ 2 ]

7 голосов
/ 25 февраля 2012

Вы можете взглянуть на инструмент cscope (http://cscope.sourceforge.net/).. Он поддерживает очень большие проекты и множество различных типов запросов:

  • Найти этот символ C
  • Найти это глобальное определение
  • Найти функции, вызываемые этой функцией
  • Найти функции, вызывающие эту функцию ...
2 голосов
/ 25 февраля 2012

Во-первых, существует проблема вызовов между различными модулями компиляции, например, foo.c определяющая функция foo1 вызывающая функция bar2, определенная в bar.c (и что bar2 может вызвать foobar, определенную в foo.c или в другом файле foofoo.c)

Тогда вы можете рассмотреть возможность разработки плагина GCC или расширения MELT для своих нужд.

Вы также можете купить дорогостоящий инструмент статического анализатора.

Emacs имеет cedet , который может вас заинтересовать.

...