2010-11-13 4 views
6

Часто я мог бы использовать некоторые инструменты для статического анализа моего кода, чтобы помочь мне сделать его более чистым. Что-то вроде предупреждений компилятора, но этого недостаточно. Время от времени я мечтаю написать один (используя библиотеки clang или gccxml), но, я думаю, это потребует слишком много работы.C++: инструменты для статического анализа кода (и/или препроцессора)

Некоторых вещей, которые выскакивают на мой взгляд, являются:

  1. ищет магические числа (например: жестко вписан постоянные числа, отличные от 0).

  2. Проверка правильности правила трех (каждый класс должен был определить либо весь деструктор, экземпляр-конструктор и оператор присваивания, либо ни один из них).


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

  1. расширьте шаблонные псевдонимы, чтобы я мог их иметь в C++ (ну, с C++ 0x это больше не нужно)

  2. перемещать встроенные функции в конце файлов, так что мне не нужно уважать объявить-bef правило использования руды и умею писать классы inline, как в Java.

  3. предлагает расширенный синтаксис, например, поддержку пользовательских операторов (которые будут расширены при вызове функций) или какой-либо специальный синтаксис/ключевое слово, чтобы легко реализовать некоторые шаблоны.


Есть ли какой-либо инструмент там, в состоянии сделать подмножество этих вещей?

В других библиотеках вы бы предложили реализовать эти задачи (clang libs, gccxml, ...) и сколько работы, по вашему мнению, потребуется?

+1

-WeffC++ сделает 2. для вас. – James

+0

Возможный дубликат [Какие инструменты с открытым исходным кодом C++ для статического анализа доступны?] (Http: // stackoverflow.com/questions/141498/what-open-source-c-static-analysis-tools-are-available) –

ответ

1

clang может выполнять статический анализ.

+0

Согласно [документации] (http://clang-analyzer.llvm.org/) , clang может выполнять только статический анализ для C и Objective-C. Вы когда-нибудь использовали его для C++? –

+0

Я не использовал его сам. Я предполагаю, что анализ C++ находится в процессе написания, поддержка компилятора для C++ только недавно. –

+0

фактически http://clang-analyzer.llvm.org/dev_cxx.html –

0

Что касается нахождения констант, наш SD Source Code Search Engine (SCSE) может сделать это с полки. SCSE предоставляет интерфейс GUI для поиска по большим наборам файлов смешанного программирования langauge с использованием языка запросов, который точно понимает лексический синтаксис каждого языка.

Типичный запрос:

'for' ... I=index* '=' N<10 

найти для ключевых слов вблизи I dentifier, название которого должен начинаться с последовательностью индекса сразу за оператором = с последующим N Умбер, значение которого меньше 10. Поскольку SCSE понимает структуру языка, это не беспокоит пробелы или форматирование ограничений. Он также будет соответствовать шестнадцатеричным значениям для N; он понимает различный формат для литералов и предлагает запросы с точки зрения фактического значения числа, а не как строки.

Учитывая такой запрос, GUI найдет все совпадения во всех ваших файлах и покажет набор обращений; щелчок по удару берет на себя исходный код с выделенной линией попадания.

Чтобы найти все константы, которые не равны нулю, вы пишете следующий очень простой запрос:

N>0 

То, что вы действительно хотите, все константы, которые не определены в каком-то постоянном определении. Итак, вы хотите, чтобы удалить любые постоянные-определения из списка совпадений, которые осуществляется с помощью «вычитания запроса» оператор:

N>0 - 'const' 'int' I '=' N 

Это находит ненулевые константы, и удаляет любые, которые также соответствуют по константным декларации ,


Ваши другие мечты требуют гораздо более сложного двигателя. По сути, вы хотите проанализировать код на C++ (ваше правило из трех) или расширить язык C++ с помощью некоторых новых функций, а затем реализовать эти функции с использованием стандартных возможностей C++. Вы можете выполнить это, используя program transformation system , который может работать с C++.

Наш DMS Software Reengineering Tookit может это сделать. Он имеет полный C++ front end, который анализирует C++ для внутренних структур данных компилятора и строит полные таблицы символов (и может регенерировать исходный код C++ со всеми деталями из его внутренних структур). Используя этот интерфейс и встроенные возможности DMS для сопоставления шаблонов, вы можете реализовать свою проверку правильности трех.

Для языковых расширений вы можете изменить внешний интерфейс DMS C++, изменив его грамматику, включив дополнительные конструкции, которые считаете идеальными. Затем вы можете записывать преобразования программ, которые ищут такие конструкции, и преобразовывать их в желаемый код. (Эта идея называлась intentional programming Чарльзом Симиони из MS-славы, но это всего лишь частный случай преобразования программы.)

DMS был использован для проведения массивных автоматических преобразований на реальных приложениях на C++. Это может сделать вашу задачу довольно легко с технической точки зрения. Однако понимание определения C++ и того, как все сочетается и как DMS поддерживает преобразования, требует значительной сложности в стиле компилятора. То, что вы предлагаете сделать, - это не работа на день или неделю. Это потребует значительных инвестиций в образование и усилия. Но намного меньше, чем пытаться делать с помощью только YACC.

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