Какие бесплатные инструменты я могу использовать для создания графика зависимости программы для кодов c

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

Есть ли свободные инструменты или проекты с открытым исходным кодом, которые могут выполнять эту работу?

Ответ 1

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

Обратите внимание, что нарезанные фактические программы, написанные на реальном языке программирования, такие как C, включают в себя множество особых случаев и понятий, которые просматриваются в научных публикациях. Тем не менее, я уверен, что вы не найдете ничего проще, чем вычисление PDG Frama-C, во-первых, потому что оно является единственным открытым исходным кодом, доступным (что я знаю), а во-вторых, потому что любое другое вычисление 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 -dot-pdg 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()

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

С другой стороны, слайсер, использующий этот 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;
}

Ответ 2

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

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

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