У меня есть большое рабочее пространство, содержащее множество исходных файлов (*.cpp, *.c, *.h, *.hpp и т. д.), и я хочу провести для него автоматический анализ.
У меня уже есть анализ покрытия с использованием формата cobertura, который сообщает мне строки кода, которые были выполнены во время теста, но теперь я хочу выполнить анализ на функциональном уровне, поэтому мне нужно отобразить выполненные строки кода. к его функциям.
Я пытался реализовать список функций самостоятельно, но очень сложно найти все различные типы функций (встроенные, виртуальные, де-/конструкторы, конструкторы структур и т.д.)
Итак, кто-нибудь знает инструмент, который можно использовать для создания списка функций, содержащихся в данном исходном файле, чтобы я мог сопоставить с ним анализ строки кода?
Большое спасибо
Для этого можно использовать наш набор инструментов для реинжиниринга программного обеспечения DMS с интерфейсом C++14 .
DMS — это инструмент общего назначения для анализа и преобразования программ, основанный на технологии компилятора. Он анализирует исходный код на основе используемого внешнего интерфейса для компиляции структур данных, таких как AST с информацией о местоположении источника, таблицами символов и графами потоков управления. Он предоставляет множество библиотек и DSL для указания действий над этими структурами данных компилятора, включая прохождение AST, сопоставление шаблонов с AST с использованием шаблонов поверхностного синтаксиса, изменение AST и, наконец, красивую печать любого измененного кода обратно в компилируемую исходную форму с комментариями.
Чтобы справиться с задачей OP, можно настроить DMS на «просто» анализ исходного кода (вы можете пропустить разрешение имен и анализ потока для этой задачи) для создания AST для интересующих файлов. Затем, используя номера строк, можно пройтись по AST в поисках узлов, соответствующих номерам строк, выбрать поддерево функции, соответствующее узлу, и красиво распечатать только эти поддеревья, чтобы увидеть полное определение функции, или красиво распечатать только сигнатуру функции. Вуаля.
В качестве альтернативного подхода можно было бы проанализировать файлы, а затем выполнить разрешение имен. Обход таблицы символов прост и обеспечивает доступ к сигнатуре функции и местоположению благодаря ссылкам на AST функции.
В любом случае, вместо того, чтобы просто печатать имена/подписи/тела функций, можно использовать DMS для реализации выбранного статического анализа.
DMS используется для анализа и преобразования больших баз кода C++ уже более десяти лет.
Я автор, так что не считайте это рекомендацией. Я документирую его существование как решение.
Первым вариантом может быть использование инструмента для создания документации по коду, такого как doxygen . Если вы скажете ему включить недокументированные функции, он может дать вам такие жемчужины, как то, какие функции находятся в каких файлах, а также карты вызовов и вызывающих абонентов.
Особенности Доксигена:
Я также использую SourceMonitor , который может отслеживать сложность вашего кода и дает список, какие функции в каких файлах.
Возможности SourceMonitor:
Ира Бакстер