Извлечение определений функций из исходного кода

У меня есть большое рабочее пространство, содержащее множество исходных файлов (*.cpp, *.c, *.h, *.hpp и т. д.), и я хочу провести для него автоматический анализ.

У меня уже есть анализ покрытия с использованием формата cobertura, который сообщает мне строки кода, которые были выполнены во время теста, но теперь я хочу выполнить анализ на функциональном уровне, поэтому мне нужно отобразить выполненные строки кода. к его функциям.

Я пытался реализовать список функций самостоятельно, но очень сложно найти все различные типы функций (встроенные, виртуальные, де-/конструкторы, конструкторы структур и т.д.)

Итак, кто-нибудь знает инструмент, который можно использовать для создания списка функций, содержащихся в данном исходном файле, чтобы я мог сопоставить с ним анализ строки кода?

Большое спасибо

В качестве альтернативы вы можете получить инструмент покрытия, который предоставит вам это отображение напрямую.

Ответы (2)

Для этого можно использовать наш набор инструментов для реинжиниринга программного обеспечения DMS с интерфейсом C++14 .

DMS — это инструмент общего назначения для анализа и преобразования программ, основанный на технологии компилятора. Он анализирует исходный код на основе используемого внешнего интерфейса для компиляции структур данных, таких как AST с информацией о местоположении источника, таблицами символов и графами потоков управления. Он предоставляет множество библиотек и DSL для указания действий над этими структурами данных компилятора, включая прохождение AST, сопоставление шаблонов с AST с использованием шаблонов поверхностного синтаксиса, изменение AST и, наконец, красивую печать любого измененного кода обратно в компилируемую исходную форму с комментариями.

Чтобы справиться с задачей OP, можно настроить DMS на «просто» анализ исходного кода (вы можете пропустить разрешение имен и анализ потока для этой задачи) для создания AST для интересующих файлов. Затем, используя номера строк, можно пройтись по AST в поисках узлов, соответствующих номерам строк, выбрать поддерево функции, соответствующее узлу, и красиво распечатать только эти поддеревья, чтобы увидеть полное определение функции, или красиво распечатать только сигнатуру функции. Вуаля.

В качестве альтернативного подхода можно было бы проанализировать файлы, а затем выполнить разрешение имен. Обход таблицы символов прост и обеспечивает доступ к сигнатуре функции и местоположению благодаря ссылкам на AST функции.

В любом случае, вместо того, чтобы просто печатать имена/подписи/тела функций, можно использовать DMS для реализации выбранного статического анализа.

DMS используется для анализа и преобразования больших баз кода C++ уже более десяти лет.

Я автор, так что не считайте это рекомендацией. Я документирую его существование как решение.

Первым вариантом может быть использование инструмента для создания документации по коду, такого как doxygen . Если вы скажете ему включить недокументированные функции, он может дать вам такие жемчужины, как то, какие функции находятся в каких файлах, а также карты вызовов и вызывающих абонентов.

Особенности Доксигена:

  • Свободно
  • Кроссплатформенность OS-X, Linux и Windows
  • Множество вариантов построения диаграмм
  • Может обрабатывать C++, C, Objective-C, C#, PHP, Java, Python, IDL (разновидности Corba, Microsoft и UNO/OpenOffice), Fortran, VHDL, Tcl и в некоторой степени D
  • Также можно документировать ваш код из комментариев, создавая документацию в HTML, Latex, RTF, PostScript, PDF, сжатом HTML или man.

Я также использую SourceMonitor , который может отслеживать сложность вашего кода и дает список, какие функции в каких файлах.

Возможности SourceMonitor:

  • Свободно
  • Только Windows - XP..
  • Собирает метрики за один быстрый проход через исходные файлы.
  • Измеряет показатели для исходного кода, написанного на C++, C, C#, VB.NET, Java, Delphi, Visual Basic (VB6) или HTML.
  • Включает метрики уровня методов и функций для C++, C, C#, VB.NET, Java и Delphi.
  • Экспорт в формате XML или CSV.