API статического анализа? - PullRequest
4 голосов
/ 06 августа 2010

Мне интересны инструменты статического анализа, которые там есть.Или скорее API, которые поддерживаются, чтобы позволить мне писать свои собственные инструменты, используя эти API.За эти годы на моей нынешней работе я написал десятки, которые тщательно анализируют наш исходный код (C ++).Но я хочу знать одну вещь: есть ли другие API статического анализа, которые доступны.Итак

У меня вопрос

  1. Какие API статического анализа вы используете?
  2. Почему вы используете его?
  3. Назовите одну вещь, которую вы написали с ней?

Что касается меня, мои ответы:

Что: я использую API для понимания 4 c ++.

Почему: я использую его, потому что:

  1. API C для него - это один заголовочный файл (очень маленький)
  2. API C практически не требует управления памятью
  3. Я написал управляемую оболочку, чтобы я мог использовать с ним c #!
  4. API очень маленький, но мощный для поиска различных вещей.

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

Примечание: я также поиграл с моделью кода C ++, которая доступна в Visual studio и успешно писал макросы для этой цели.

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

Ответы [ 4 ]

6 голосов
/ 06 августа 2010

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

Зачем его использовать? Это полноценный компилятор, так что вы можете full видимость кода, с которым вы работаете. API-интерфейсы (по крайней мере, в основном) довольно красиво разработаны на C ++.

Я еще ничего особо серьезного не написал. В настоящее время я работаю над инструментом, который использует Индексную библиотеку , чтобы найти заголовки, которые включены, но на которые никогда не ссылаются, но они еще не закончены (и, возможно, никогда не будут - я действительно задумал это как оправдание попробуйте, не очень полезный инструмент).

4 голосов
/ 17 сентября 2010

Наш инструмент с именем CodeSonar - это коммерческий расширенный инструмент статического анализа для программ на C / C ++.Он предлагает несколько API, которые можно использовать для расширения его функциональности.Обратите внимание, что он предназначен для выполнения анализа, а не для выполнения программных преобразований.

Существуют API (как на C, так и на Схеме), которые обеспечивают доступ к AST программы (которые содержат таблицы символов), CFG для каждой подпрограммы., граф вызовов всей программы, блоки компиляции, включаемые файлы и т. д. Все эти представления перекрестно связаны с информацией о положении, поэтому можно вернуться к строке ответственного кода.

Механизм анализапосещает все эти структуры данных, и пользователь может написать средство проверки, указав обратный вызов, который будет вызываться во время посещения.

CodeSonar - это инструмент анализа с учетом пути.Исследование пути сложно, потому что некоторые пути неосуществимы, и исключение их из рассмотрения требует определенных усилий.Важно исключить невозможные пути, чтобы ложные срабатывания оставались на низком уровне.CodeSonar позволяет пользователям подключаться к своему исследованию пути, снова используя шаблон посетителя, который позволяет им писать чувствительные к пути средства проверки без необходимости самостоятельно выполнять исследование допустимого пути.

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

Другой способ написания чеков - использовать другой специализированный API, цель которого не в том, чтобы его выполнять, а в том, чтобы обучить механизм анализа свойствам программы.,Грубо говоря, вы можете использовать этот API для написания кода, который похож на тот, который вы написали бы для динамической проверки свойства, но который вместо этого «интерпретируется» символическим механизмом выполнения.Вы можете украсить свой собственный код вызовами этого API или оставить все это в стороне.

Многие из встроенных контроллеров CodeSonar для использования API определены именно таким образом.

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

Надеюсь, это поможет!

2 голосов
/ 04 сентября 2010

NDepend - это статический анализатор .NET, который поставляется с полным NDepend.API для написания собственного статического анализатора.

Отказ от ответственности: я один из разработчиков инструмента

NDepend.API дружит с LINQ. Предлагается более 200 кодовых правил . Они основаны на запросах LINQ через NDepend.API, который мы называем CQLinq . Эти правила кода охватывают широкий спектр потребностей (API, эволюция / различия, именование, архитектура / дизайн, метрика / качество кода, мертвый код, покрытие кода, ООП ...). Вы можете адаптировать их к своим потребностям и создать свои собственные из них.

14 Электроинструменты * Предлагается 1028 * база с открытым исходным кодом на NDepend.API. Электроинструменты на самом деле пользовательские статические анализаторы . Здесь также вы можете адаптировать их или создать свои собственные. Если вы загружаете биты NDepend, источник кода этих Power Tools находится в решении VisualStudio: $ NDependInstallPath $ \ NDepend.PowerTools.SourceCode \ NDepend.PowerTools.sln

NDepend Power Tools List

2 голосов
/ 06 августа 2010

Наш DMS Software Reengineering Toolkit является коммерчески доступным, универсальным оборудованием для анализа / анализа / преобразования исходного кода для многих языков, включая C, C ++, C #, Java, COBOL, ...

Он использует явные определения языка (например, BNF) для управления механизмом синтаксического анализа для непосредственного создания AST; DMS поддерживает несколько диалектов для некоторых языков. Имеются встроенные анализаторы для поддержки построения таблицы символов, анализа и анализа потока данных, анализа точек, анализа диапазона символов ...

Для C, Java и COBOL встроенный механизм анализа привязан к определениям языка, так что вы можете использовать эти анализаторы в качестве основы для пользовательского анализа, который вы, возможно, захотите построить. C ++ имеет таблицы символов, но еще не привязан к другим внутренним анализаторам, но механизм есть.

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

Ваши три вопроса:

1.Какой API статического анализа вы используете?

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

2. Почему вы используете это?

  • В основном для поддержки создания пользовательских инструментов. Удивительно, сколько у людей разных вопросов о коде, и сколько способов они хотят изменить в большом приложении.

3. Назовите одну вещь, которую вы написали с ней?

  • B-2 Stealth Bomber Переводчик JOVIAL-C (серьезно, см. Веб-сайт).
  • Извлечение архитектуры приложения IBM Mainframe.
  • Автоматическая реструктуризация компонентов C ++.
  • Обнаружение клонов.
  • Тестовое покрытие и профилировщики
  • Smart Differencer
  • (Более подробный список см. На сайте)
...