какие бесплатные инструменты я могу использовать для создания графика зависимости программы для кодов c - PullRequest
10 голосов
/ 21 марта 2012

Я хочу сгенерировать график зависимости программы (PDG) из исходного кода C.Я нашел документы, объясняющие, как это сделать, но все использовали коммерческий инструмент CodeSurfer.

Существуют ли какие-либо бесплатные инструменты или проекты с открытым исходным кодом, которые могут выполнить эту работу?

Ответы [ 2 ]

17 голосов
/ 22 марта 2012

Frama-C - это платформа статического анализа с открытым исходным кодом с слайсером для программ на C , основанная на вычислении графика зависимости программ.

Обратите внимание, что нарезка реальных программ, написанных на реальныхЯзык программирования, такой как C, включает в себя множество особых случаев и понятий, которые рассматриваются в научных публикациях.Тем не менее, я уверен, что вы не найдете ничего более простого, чем вычисления PDG Frama-C, во-первых, потому что это единственный доступный Open Source (который я знаю), и во-вторых, потому что любые другие вычисления PDG, которые обрабатывают программы на C, будут иметьчтобы решить те же проблемы и ввести те же понятия.

Вот один пример:

int a, b, d, *p;

int f (int x) {
  return a + x;
}

int main (int c, char **v) {
  p = &b;
  a = 1;
  *p = 2;
  d = 3;
  c = f(b);
}

Команда frama-c -pdg -pdg-dot graph -pdg-print t.c создает точечные файлы graph.main.dot и graph.f.dot, содержащие PDG изmain() и f() соответственно.

Вы можете использовать программу dot для красивой печати одного из них таким образом: dot -Tpdf graph.main.dot > graph.pdf

Результат ниже:

PDG of main()

Обратите внимание на ребро от узла c = f(b); до узла *p = 2;.Вычисления PDG, утверждающие, что они полезны для программ на Си, должны обрабатывать псевдонимы.

С другой стороны, срез, использующий этот PDG для нарезки по критерию «входы оператора c = f(b);», сможет удалить d = 3;, который не может влиять на вызов функции, даже через указатель доступа *p.Срез Frama-C использует зависимости, указанные PDG, чтобы хранить только те операторы, которые полезны для заданного пользователем критерия нарезки.Например, команда frama-c -slice-wr c t.c -then-on 'Slicing export' -print создает приведенную ниже сокращенную программу, в которой было удалено присвоение d:

/* Generated by Frama-C */
int a;
int b;
int *p;
int f_slice_1(int x)
{
  int __retres;
  __retres = a + x;
  return (__retres);
}

void main(int c)
{
  p = & b;
  a = 1;
  *p = 2;
  c = f_slice_1(b);
  return;
}
4 голосов
/ 21 марта 2012

Если вы хотите визуализировать зависимости методов, вызывающих друг друга и использующих gcc, то опция -fdump-rtl-expand *1003* может вас заинтересовать.

Для каждого исходного файла, который вы компилируете с помощью опции -fdump-rtl-expand gcc, будет выводиться *.expand файл.

Эти файлы, передаваемые в инструмент Египет , отображают графики, показывающие зависимости метода.

...