2009-07-24 6 views
3

Существует собственный API, который построен поверх C++. Таким образом, он использует все возможности C++, а затем имеет свои собственные API. Существуют некоторые API, которые работают точно так же, как C++ API (например, для malloc есть Stralloc), эти API предоставляются по соображениям производительности.Разработка инструмента для анализа статического исходного кода для собственного API?

Хотя для C++ существует множество статических анализаторов кода, мы не можем использовать ни один из них. Необходимо иметь статический анализатор кода, который может быть запущен на коде с проприетарными API.

Я хотел бы знать, как начать разработку анализатора кода. Возможно, он не должен быть очень ориентированным на функции, как те, которые доступны для C++. Я хочу начать с основных вещей, таких как сообщение неиспользуемых переменных, переполнение буфера, утечки памяти.

Любое руководство будет оценено по достоинству.

[UPDATE] Я нашел следующий вопрос, который я искал, только разница в том, что вместо Java моя озабоченность связана с проприетарными API-интерфейсами. Пока у меня есть несколько хороших ответов, но я бы очень хотел узнать больше от людей, которые прошли через такое развитие.

Introduction to Static Analysis

ответ

2

Я запутался:

Является ли это реализация языка поверх C++ или просто набор API, на вершине C++?

Если последний, любой обычный профилировщик C++ будет захватывать такие вещи, как утечки памяти и переполнения.

+1

Но, безусловно, такой профайлер будет путать с вещами, такими как boost :: bind, сигналы и другие конструкции, которые добавляют необязательные парадигмы к C++. – EFraim

+0

Как я уже упоминал, существуют API, которые используются вместо C++ API. Например, вместо использования free() используется API Strfree(), который точно такой же, как и free(), но используется по соображениям производительности. Поэтому любой обычный анализатор C++ не может это распознать. – user32262

1

Не пытайтесь писать это с нуля. C++, как известно, трудно даже разобрать, и я не думаю, что вы далеко продвинулись по этому маршруту.

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

  • ССАГПЗ C++ передний конец (GCC теперь имеет плагины)
  • ЭДГ C++ анализатор
  • Rose (использует EDG)
  • LLVM (возможно, используя clang, но он может быть не готов для прайм-тайма)
  • Microsoft Phoenix Framework (я предполагаю, что он может это сделать, я не проверял).

Наилучший ответ, скорее всего, clang or rose.

2

Решения, такие как Coverity и Klocwork, имеют расширяемый набор правил, где вы можете писать свои собственные правила. Вы также можете настроить инструмент так, чтобы их стандартные проверки памяти понимали пользовательские распределители памяти. Хотя некоторые ограничения применяются.

Полезно использовать эти инструменты, потому что тогда вы можете одолжить один и тот же рабочий процесс. Опять же, это зависит от того, что у вас есть, и что именно вы хотите сделать.

+0

Да, лучше использовать существующий инструмент, чем изобретать велосипед. Документация Coverity не является общедоступной, но Klocwork's; см. для примера создания записи базы знаний для функции, которая ведет себя как malloc. (Хотя, если ваш исходный код в конечном итоге вызывает malloc, вам может и не понадобится это делать, Klocwork может понять это сам). –

1

Синтаксический анализ C++ на практике очень прост. Если у вас расширенный диалект C++, вам нужен полный анализатор C++, который «легко» наклонен к вашему диалекту и имеет средства для создания инструментов анализа.

DMS Software Reengineering Toolkit - это полностью настраиваемая общая инфраструктура анализа и преобразования, обеспечивающая общий синтаксический анализ, построение дерева, построение таблицы символов и возможности анализа потока. Он используется для создания полностью настраиваемых анализаторов.

У этого есть C++ Front End, который обрабатывает несколько стандартных диалектов C++ и может быть настроен для обработки других расширений. Передняя часть C++ имеет полные возможности препроцессора, анализирует и строит AST, и делает полный анализ имен и типов C++.

Смежные вопросы