2009-02-09 2 views
49

Какие хорошие инструменты для быстрого запуска анализа и анализа кода на C/C++?Хорошие инструменты для создания анализатора/анализатора C/C++

В частности, я ищу инструменты с открытым исходным кодом, которые обрабатывают препроцессор и язык C/C++. Предпочтительно, эти инструменты будут использовать lex/yacc (или flex/bison) для грамматики, а не быть слишком сложными. Они должны обрабатывать последние определения ANSI C/C++.

Вот что я нашел до сих пор, но не смотрел на них подробно (мысли):

  • CScope - Старая школа анализатор C. Тем не менее, похоже, что он не выполняет полный анализ. Описан как прославленный «grep» для нахождения функций C.
  • GCC - Все любимые компиляторы с открытым исходным кодом. Очень сложно, но, похоже, все это. Существует связанный с этим проект для создания расширений GCC под названием GEM, но не обновлен с GCC 4.1 (2006).
  • PUMA - PUre MAnipulator. (со страницы: «Цель этого проекта - - предоставить библиотеку классов для анализа и управления источниками C/C++. Для этого цель PUMA предоставляет классы для сканирования, анализа и, конечно же, управления C/C++ источников ".). Это выглядит многообещающим, но не обновлялось с 2001 года. По-видимому, PUMA была включена в AspectC++, но даже этот проект не обновлялся с 2006 года.
  • Различные грамматики C/C++. Вы можете получить c-c++-grammars-1.2.tar.gz, но это было поддержано с 1997 года. Небольшой поиск в Google подтягивает другие базовые грамматики lex/yacc, которые могут служить отправной точкой.
  • Любые другие?

Я надеюсь использовать это как отправную точку для перевода источника C/C++ в новый язык игрушек.

Спасибо! -Matt

(Добавлено 2/9): Просто пояснение: Я хочу извлечь семантическую информацию из препроцессора в дополнение к самому C/C++-коду. Я не хочу, чтобы «#define foo 42» исчезал в целое число «42», но оставался прикрепленным к имени «foo». Это, к сожалению, исключает несколько решений, которые сначала запускают препроцессор, и только доставляют дерево разбора C/C++)

+0

Мэтт, я думаю, что это скорее назойливая надежда; препроцессор по определению работает над источником, прежде чем он попадает в анализ. По крайней мере, старые компиляторы трубопроводов имели предварительный источник в трубе перед разбором. по первому пропуску. Может быть, вы могли бы использовать встроенные комментарии cpp? –

+0

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

+0

Просмотрено 42 000 раз? Я думаю, что это нужно снова открыть. Если вы, прочитайте, согласитесь, затем нажмите «повторно открыть» выше. –

ответ

34

Синтаксический анализ C++ чрезвычайно сложный, поскольку грамматика неразрешима. Цитирую Yossi Kreinin:

Невероятно сложная грамматика

"Невероятно" следует толковать буквально, потому что все популярные языки имеют context-free (или "почти" контекстно-свободной) грамматик, в то время как C++ имеет undecidable грамматику. Если вам нравятся компиляторы и парсеры, вы, вероятно, знаете, что это значит. Если вы не занимаетесь этим, есть simple example, показывающий проблему с синтаксическим анализом C++: AA BB(CC); определение объекта или объявление функции? Оказывается, ответ в значительной степени зависит от кода до утверждение - «контекст». Это показывает (на интуитивном уровне), что грамматика C++ вполне контекстно-зависимая.

+0

Хорошая ссылка Yossi. Очень освежающий блог! – Ketan

+12

Как и многие его цитаты, этот тоже неправильный. «Undecidable» означает, что вы вообще не можете указать *, что A B (C); означает. На самом деле, с контекстом вы знаете, если и как A, B и/или C определены ранее. Это делает его тривиально разрешимым. Вам просто нужно знать, является ли C типом или выражением. – MSalters

+0

И это «с контекстом, который вы знаете, если и как A, B и/или C определены раньше» уже было встречено: [http://yosefk.com/c%2B%2Bfqa/web-vs-c++.html# misfeature-2], [http://www.reddit.com/r/programming/comments/5z7jr/c_frequently_questioned_answers/c02bmog]; –

6

Грамматика для C++ - это своего рода печально известный волосатый. Есть a good thread at Lambda about it,, но суть в том, что грамматика C++ может потребовать сколь угодно большого внимания.

Для того, что я могу себе представить, я подумал бы о взломе Gnu CC или Splint. Gnu CC, в частности, довольно подробно выделяет часть генерации языка, поэтому вам может быть лучше создать новый g ++-сервер.

+0

Приятно слышать от вас Чарли и в таком случайном месте! Моей главной мотивацией является то, что C++ волосатый, и трудно подвергнуть статическому анализу и обеспечить кодекс при редактировании. Мне нужен новый язык, который легко анализировать, но изоморфно эквивалентен C++. –

+1

Вы не сможете «легко анализировать» и «изоморфно C++». C++, независимо от его синтаксиса, трудно анализировать. Лучшее, на что вы можете надеяться, это какие-то инструменты анализа для самого C++. –

2

, как о чем-то легче понять, как tiny-C или Small C

+0

Спасибо за ссылки! Это те проекты, которые определенно помогут начать сканирование на создании парсера. –

+0

Нет, это даже не приблизится. –

8

Посмотрите, как Doxygen работы, полный исходный код доступен, и это прогибается основе.

Недопустимый кандидат GOLD, который является бесплатным набором инструментов для анализа на базе Windows, явно предназначенным для создания переводчиков.Их список поддерживаемых языков относится к языкам, на которых можно реализовать парсеры, а не список поддерживаемых грамматик синтаксического анализа.

У них есть только грамматики для C и C#, нет C++.

+0

Я надеюсь использовать платформы, отличные от Windows (Mac, Linux или Solaris), но у меня есть система Windows. Раньше я использовал Doxygen и хотел бы поближе рассмотреть под капотом. –

+0

Я понимаю, что Gold является генератором парсеров LALR. Это не будет анализировать C++. –

+0

Черт возьми, ты прав. Их список «поддерживаемых языков» относится к языкам, которые могут вызывать парсер, а не синтаксические языки. –

15

В зависимости от вашей проблемы GCCXML может быть вашим ответом. В основном он анализирует источник с помощью GCC, а затем дает вам легко усваиваемый XML дерева синтаксического анализа. С GCCXML вы делаете раз и навсегда.

+1

Поскольку на самом деле он не создает дамп шаблонов (только экземпляров шаблонов), это довольно сложно, особенно в той области, которая вызывает большинство проблем с синтаксическим разбором. См. ключевое слово «typename» внутри шаблонов. – MSalters

+1

Это очень хорошая ссылка и предложение, но в моем конкретном случае это не совсем работает, потому что мне нужно извлечь семантическую информацию из препроцессора. GCCXML работает на результирующем дереве после выполнения магии предварительной обработки. Кроме того, похоже, что этот проект недавно не обновлялся. –

+3

Желание было gcc-json;) – hasen

17

Генератор ANTLR анализатор имеет grammar для C/C++, а также препроцессор. Я никогда не использовал его, поэтому не могу сказать, насколько полным будет его синтаксический анализ C++. ANTLR сам по себе полезный инструмент для меня несколько раз для анализа более простых языков.

+0

Модифицируйте упоминание ANTLR. Я немного посмотрел на это, но забыл использовать его в качестве замены lex/yacc. Если грамматика C/C++ хороша, это может быть мой любимый путь ... –

+11

Я не знаю, почему это принятый ответ сейчас или почему он был принят первоначально. Насколько я знаю, грамматика ANTLR для C++ никогда не использовалась на практике, и я отслеживаю такие вещи. Автор грамматики оставил следы в документах, говоря: «Неполный, я покончил с этим, вы можете исправить его, если хотите». C++ 98 - жесткий язык, а C++ 11 хуже, а затем есть куча диалектов (GCC, Microsoft, Sun, ...). Если у вас нет права парсера, то то, что у вас есть, просто бесполезно. Тогда вам нужно полное имя и разрешение типа, чтобы что-либо сделать. Здесь ничего нет. –

1

Некоторое время назад я попытался написать инструмент, который будет автоматически генерировать модульные тесты для c-файлов.

Для preprosessing я помещал файлы через GCC. Результат является уродливым, но вы можете легко отслеживать, где в исходном коде из предварительно обработанного файла. Но для ваших нужд вам может понадобиться что-то еще.

Я использовал Metre в качестве основы для анализатора C. Он является открытым исходным кодом и использует lex и yacc. Это упростило работу в течение короткого времени без полного понимания lex & yacc.

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

3

Elsa бьет все остальное, что я знаю, руки для синтаксического анализа C++, хотя он не соответствует 100%. Я - фанат. Там есть модуль, который печатает C++, так что это может быть хорошей отправной точкой для вашего игрушечного проекта.

+0

Спасибо за ссылку! Я посмотрю ... –

+0

Когда я попробовал это на своих файлах на C++ и перестал говорить, что это не реализовано или что-то в этом роде. – Aftershock

+0

Эти инструменты появляются по датам на сайте, которые в последний раз были обновлены в 2005 году; автор утверждает, что «пытается проанализировать C++ (as), определяемый спецификацией C++ 03». Это зависит от чего-то еще, чтобы сделать предварительную обработку. –

21

Вы можете посмотреть clang, который использует llvm для разбора.

Поддержка C++ полностью в настоящее время link

+4

Обновление: «В настоящее время Clang реализует все стандарты ISO C++ 1998 (включая дефекты, указанные в стандарте ISO C++ 2003), за исключением« экспорта »(который был удален из черновика C++« 0x ») и считается производственным качеством C++ compiler "Дата: 2011-07-27 http://clang.llvm.org/cxx_status.html –

6

Parsing C++ is a very complex challenge.

Существует основа Boost/Spirit, и пару лет назад они сделали play with the idea of implementing a C++ parser, но это far from complete.

Полностью и правильно разбор ISO C++ далек от тривиального, и на самом деле было много связанных усилий. Но это сложная задача, которая нелегко выполнить, не переписывая полный интерфейс компилятора, понимая все препроцессоры C++ и. Предпроцессорная реализация, называемая «волной», доступна от людей Spirit.

При этом вы можете взглянуть на pork/oink (elsa-based), который представляет собой набор инструментов синтаксического анализатора C++, специально предназначенный для использования в целях преобразования исходного кода, он используется проектом Mozilla для выполнения больших -scale статический анализ исходного кода и автоматическое переписывание кода, самая интересная часть заключается в том, что он не только поддерживает большую часть C++, но и сам препроцессор!

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

Лично я бы рассмотрел комплект свиноводства/oink, основанный на elsa, который используется в Mozilla, кроме того, FSF теперь одобрила работу над gcc plugins с использованием лицензии библиотеки времени выполнения, поэтому я бы предположил, что все быстро изменится, как только люди смогут легко использовать парсер C++ на основе gcc для таких целей, используя бинарные плагины.

Итак, в двух словах: если вы Бакс: EDG, если вам нужно что-то бесплатно/с открытым исходным кодом Теперь: еще/хрю справедливо многообещающим, если у вас есть какое-то время, вы можете использовать GCC для вашего проект.

Другой вариант только для кода C: cscout.

+0

См. Другой ответ здесь для более подробной информации о Elsa. –

13

pycparser - полный синтаксический анализатор для C (C99), написанный на Python. Он имеет полностью настраиваемую базу данных AST, поэтому он используется в качестве основы для любого вида обработки языка, который может вам понадобиться.

Не поддерживает C++. Конечно, это гораздо сложнее, чем C.


Update (2012): в это время ответ, без всякого сомнения, будет Clang - это модульный, поддерживает полный C++ (со многими C++ - 11) и имеет относительно дружественную базу кода. Он также имеет API C для привязки к языкам высокого уровня (то есть for Python).

2

См. Наш C++ Front End для полнофункционального анализатора C++: строит AST, таблицы символов, имеет название и тип разрешения. Вы можете даже разобрать и сохранить препроцессор . Передняя часть C++ построена поверх нашего DMS Software Reengineering Toolkit, что позволяет использовать эту информацию для выполнения произвольных изменений исходного кода с использованием преобразований источника в источник.

DMS - идеальный двигатель для реализации такого переводчика.

Сказав это, я не вижу большого смысла в вашей воображаемой задаче; Я не вижу большую ценность при попытке заменить C++, и вы найдете здание полным переводчиком огромного количества работы, особенно если ваша цель - это «игрушечный» язык.И, вероятно, мало смысла в синтаксическом анализе C++ с использованием сильного парсера, если его единственная цель - создать изоморфную версию C++, которая проще анализировать (подождите, мы постулировали надежный C++ уже!).

EDIT май 2012 г. Передняя часть DMS CMS теперь обрабатывает GCC3/GCC4/C++ 11, Microsoft VisualC 2005/2010. Надёжная.

EDIT Feb 2015: теперь обрабатывает C++ 14 в диалектах GCC и MS.

EDIT Август 2015: теперь анализирует и фиксирует как код, так и директивы препроцессора в едином дереве.

+3

Повторите ответ из другого источника вопроса http://stackoverflow.com/questions/792454/most-effective-way-to-parse-c-like-definition-strings...shameless plug для продвижения коммерческого программного обеспечения ... . – t0mm13b

+0

Повторный класс вопроса: «Как я могу построить сложный процессор langauge (легко)?» а) вы не можете, б) этот движок разработан, чтобы сделать это так же просто, как практически (я не сказал, что это легко). –

+2

Цитирование OP: 'В частности, я ищу инструменты с открытым исходным кодом' - это DMS с открытым исходным кодом ?. –

1

Как насчет использования такого инструмента, как GNU's CFlow, который может анализировать код и создавать диаграммы графиков вызовов, вот что может сказать о cflow. opengroup (справочная страница). Версия GNU cflow поставляется с источником и с открытым исходным кодом ...

Надеюсь, это поможет, С уважением, Tom.

4

На самом деле PUMA и AspectC++ по-прежнему активно поддерживаются и обновляются. Я изучал использование AspectC++ и задавался вопросом об отсутствии обновлений самостоятельно. Я отправил электронное письмо автору, который сказал, что и AspectC++, и PUMA все еще разрабатываются. Вы можете получить исходный код через SVN https://svn.aspectc.org/repos/ или вы можете получить регулярные бинарные сборки на http://akut.aspectc.org. Как и в настоящее время с множеством отличных проектов на C++, у автора нет времени, чтобы не отставать от обслуживания веб-страниц. Имеет смысл, если у вас есть полная работа и жизнь.

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