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

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

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

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

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

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

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

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