Библиотека сканирования с открытым исходным кодом С++

Обоснование. В моей повседневной разработке кода на С++ мне часто нужно ответьте на основные вопросы, например, кто называет то, что в очень большом С++-коде которая часто меняется. Но, мне также нужно иметь некоторые автоматизированный способ точно определить, что делает код вокруг определенной области кода. Полезны инструменты "grep", такие как Cscope (и Я использую их сильно уже), но не С++ - знание языков: они не дают возможности идентифицировать типы и виды лексических окружающей среды для данного использования типа или функции таким образом, чтобы способствующей автоматизации (даже если указанная автоматизация ограничена операции "только для чтения", такие как просмотр кода и навигация, но я прося гораздо больше, чем ниже).

Вопрос: существует ли уже существующая на C/С++ библиотека с открытым исходным кодом (родной, не управляемый, а не Microsoft или Linux-специфический), который может статически сканировать или анализировать большое дерево кода С++ и может производить которые отвечают на подробные вопросы, такие как:

  • Какие функции вызывается некоторой поставляемой функцией?
  • Какие функции используют этот поставляемый тип?
  • Не так уж и выше, если задействованы классы С++ или шаблоны классов.

Результирующий набор должен предоставить своего рода "дескриптор". Я должен уметь для подачи этой обработки обратно в библиотеку для выполнения следующих типов интроспекции:

  • Что такое смещение байта в файл, где была сделана ссылка?
  • Какова ссылка на абстрактное синтаксическое дерево (AST) этого ссылку, чтобы я мог проверять окружающие конструкции кода? А также каждый объект АСТ также имеет путь к файлу, смещение по байтам и связанные с ним данные типа-типа, чтобы я мог рекурсивно ходить повернуть график звонящих или рефереров для выполнения полезных операций.

Ответ должен отвечать следующим требованиям:

  • API. Открытый API должен быть одним из следующих:
    • C или С++ и, вероятно, это "C-дескриптор" или С++ - класс-экземпляр (и если это так, должен быть общий код C o С++, а не Microsoft- или Конкретные кодовые конструкции Linux, если только они не соответствуют специфике данная платформа), или
    • Стандартный ввод командной строки и стандартный вывод.
  • Знание С++. Не ограничивается C-кодом, но понимает язык С++. строит в мельчайших подробностях, включая понимание межклассовых наследования и шаблоны С++.
  • Быстрый. Если сканирование больших кодовых баз значительно быстрее, чем скомпилировать всю базу кода с нуля. Это, вероятно, необходимо быть расслабленным, но только если Инкрементный поиск результата и Resilient к небольшим изменениям кода требования полностью выполнены ниже.
  • Укажите количество результатов. Я могу задать вопрос: "Сколько результатов вы бы предоставили какой-либо запрос (и не отправляйте мне все результаты)? ", который реагирует на порядок менее 3 секунд против чтобы получить все результаты по любому заданному вопросу. Если это потребуется слишком долго, чтобы получить этот ответ, а затем тратит время разработки. Это в сочетании со следующим требованием.
  • Инкрементный поиск результатов. Я должен уметь спросить "Дайте мне просто следующие N результатов этого запроса ", а затем дескриптор чтобы я мог задать вопрос повторно, таким образом постепенно вытягивая результаты поэтапно. Это означает, что я не нужно ждать полного набора результатов перед тем, как увидеть некоторые подмножества всех результатов. И что я могу отменить если я видел достаточно результатов. Причина: мне нужно ответьте на вопрос: "Каково влияние создания или развития изменение какой-либо определенной сигнатуры функции? "
  • Отказоустойчивые до небольших изменений кода. Если я изменю заголовок или источник файла, мне не нужно ждать, пока вся база кода будет rescanned, но только этот заголовок или исходный файл перепроверен. Повторное сканирование должно быть быстрым. Например, не делайте то, что cscope вам нужно сделать, чтобы пересканировать всю базу кода для небольшие изменения. Понятно, что если вы измените заголовок, тогда сканирование может занять больше времени, поскольку другие файлы, содержащие этот заголовок должен быть подвергнут сканированию.
  • Агенство IDE. Является ли текстовый редактор агностиком (не заставляйте меня использовать конкретный Текстовый редактор; Я уже сделал свой выбор, спасибо!)
  • Платформа Agnostic: Является платформо-агностиком (не заставляйте меня использовать его на Linux или только на Windows, поскольку я должен использовать оба этих платформы в моем ежедневном измельчении, но мне нужен инструмент, который будет полезен так как у меня есть песочницы на обеих платформах).
  • Небиновое: не стоит мне ничего, кроме времени скачать и скомпилировать библиотеку и все ее зависимости.
  • Не пробная версия.
  • Активно поддерживается. Вероятно, отправка запросов справки в списки рассылки или связанные форумы, скорее всего, получат ответ менее чем за 2 дни.
  • Сетевой агностик. Базы данных: сборники библиотек должны быть доступны напрямую сеть из 32-разрядных и 64-разрядных систем, как Linux, так и Windows взаимозаменяемо, в то же время, и не вставлять жестко установленные пути к файловым системам, которые в противном случае "корнили" базу данных конкретной сети.
  • Агрессивность среды сборки. Не требует интимного знания моей среды сборки. заметное исключение, возможно, требующее знания компилятора заданные макросы CPP (например, -Dmacro = значение).

Ответ 1

Я бы сказал, что CLang Index близок. Однако я не думаю, что он хранит данные в базе данных.

В любом случае инфраструктура CLang предлагает то, что вам действительно нужно, чтобы создать инструмент, адаптированный к вашим потребностям, хотя бы из-за его синтаксического разбора и индексирования C-С++ и Objective-C. И так как он предоставлен в виде набора многоразовых библиотек... он был создан для разработки!

Ответ 2

Я должен признать, что я не использовал либо потому, что я работаю с большим количеством специфичного для Microsoft кода, который использует расширения компилятора Microsoft, которые я не ожидаю, что они поймут, но два анализатора с открытым исходным кодом, которые я знаю из Mozilla Pork и Clang Analyzer.

Ответ 3

Если вы ищете результаты анализа кода (метрики, графики,...), почему бы не использовать инструмент (а не API) для этого? Если вы можете, я предлагаю вам взглянуть на Понять.

Это не бесплатно (есть пробная версия), но я нашел его очень полезным.

Ответ 4

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