Самоанализ C ++: перечисление доступных классов и методов в кодовой базе C ++ - PullRequest
4 голосов
/ 31 октября 2011

Я работаю над некоторым нестандартным статическим анализом кода C ++ для моей диссертации.Как часть расширения системы типов C ++, я хочу взять базу кода C ++ и перечислить ее доступные функции, методы и классы вместе с их сигнатурами типов с минимальными усилиями (это всего лишь прототип).Какой лучший способ сделать что-то подобное быстро и легко?Должен ли я взломать Clang, чтобы выкладывать нужную мне информацию?Должен ли я смотреть на анализ заголовочных файлов с чем-то вроде SWIG?Или есть еще более легкая вещь, которую я мог бы сделать?

Ответы [ 5 ]

5 голосов
/ 31 октября 2011

GCCXML , основанный на GCC, может быть билетом. Насколько я понимаю, он собирает и сбрасывает все определения, но не содержимое функций / методов.

Другие, вероятно, будут упоминать CLANG, который, безусловно, анализирует код и должен иметь доступ к определениям символов в модуле компиляции. (У меня нет опыта здесь).

Для полноты вы должны знать о нашем DMS Software Reengineering Toolkit с C ++ Front End . (Ответы CLANG, похоже, гласят: «Пройдите AST»). Решение DMS предоставляет перечислимую таблицу символов, содержащую всю информацию о типе. Вы также можете пройти AST, если хотите.

Часто статический анализ приводит к диагностике и желанию изменить исходный код. DMS может применять программные преобразования «источник-источник» для выполнения таких изменений, обусловленных по анализу.

1 голос
/ 31 октября 2011

На своей работе я использую API из пакета программ под названием "Understand 4 C ++" от scitools .Я использую это, чтобы написать все мои инструменты статического анализа.Я даже написал .NET API, чтобы обернуть их C API.Который я ставлю на codeplex .

Как только вы это сделаете, выгрузить все типы классов легко:

ClassType[] allclasses = Database.GetAllClassTypes()
foreach (ClassType c in allclasses)
{
   Console.WriteLine("Class Name: {0}", c.NameLong);
}

Теперь для небольшой предыстории о моей задаче, которая похожа на вашу.В некоторые годы мы должны поддерживать наш двоичный SDK обратно совместимым с SDK предыдущих лет.В этом случае полезно сравнить код SDK между выпусками, чтобы проверить возможные критические изменения.Однако с парой сотен файлов и десятками тысяч строк комментариев это может быть большой головной болью, если использовать инструмент различий текста, такой как Beyond Compare или Araxis.Так что мне действительно нужно обратить внимание на фактические изменения кода, не переупорядочивание, не перемещение кода вверх и вниз по файлу, не добавление комментариев и т. Д. *

Итак, инструмент, который я написал для выгрузкивесь код.

В одном текстовом файле я сбрасываю все все классы.Для каждого класса я печатаю свое дерево наследования, его функции-члены как виртуальные, так и не виртуальные.Для каждой виртуальной функции я печатаю, какие виртуальные методы родительского класса она переопределяет (если есть).Я также распечатываю его переменные-члены.То же самое относится и к структурам.В другом файле я печатаю все макросы.В другом файле я печатаю все typedefs.

Затем, используя это, я могу различать эти файлы с файлами из предыдущего выпуска.Тогда сразу становится ясно, что изменилось от релиза к релизу.Например, легко увидеть, где параметр функции был изменен с TCHAR * на const TCHAR *, например.

1 голос
/ 31 октября 2011

Я думаю, что ваш лучший выбор - взломать Clang и получить AST. Для этого есть хороший учебник . Его очень легко изменить его синтаксис, и он также имеет статический анализатор .

1 голос
/ 31 октября 2011

От всей души рекомендую LLVM для статического анализа (см. Также Clang Static Analyzer )

0 голосов
/ 02 ноября 2011

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

И GCC MELT - это высокоуровневый предметно-ориентированный язык (который я разработал и реализовал) для легкого расширения GCC.

Статья на семинаре GROW09 Питера Коллингборна и Пола Келли о инфраструктуре времени компиляции для GCC с использованием Haskell может иметь отношение к вашей работе.

...