Статический анализ для частичных программ на C ++ - PullRequest
4 голосов
/ 11 июля 2011

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

Тем не менее, я знаю, есть такой инструмент для Java - он в основном "угадывает" недостающую информацию и, таким образом, позволяет проводить статический анализ, даже если он больше не работает .

Есть ли что-нибудь подобное, что можно использовать для преобразования частичного кода C ++ в некоторую промежуточную форму (например, байт-код LLVM)?

Ответы [ 4 ]

6 голосов
/ 12 июля 2011

Как правило, если вы угадываете, вы угадываете неправильно;любые жалобы от статического анализатора, основанные на таких предположениях, являются ложными срабатываниями и, как правило, вызывают высокую вероятность отклонения.

Если вы настаиваете на догадках, вам понадобится инструмент, который может анализировать произвольные фрагменты C ++.(«Угадай статический анализ этого метода ....»).Большинство синтаксических анализаторов C ++ анализируют только полные исходные файлы, а не фрагменты.

Вам также понадобится способ создания частичных таблиц символов.(«I указан в качестве аргумента FOO, но не имеет информации о типе, и это не тот же самый I, который объявлен в операторе после вызова FOO»).

Наша DMSSoftware Reengineering Toolkit с его C ++ Front End может обеспечить синтаксический анализ фрагментов и может использоваться в качестве плацдарма для частичных таблиц символов.

DMS обеспечивает общий анализ / анализ / преобразование длякод, как определено явным языковым определением, предоставленным DMS.Интерфейс C ++ предоставляет полный и надежный интерфейс C ++, позволяющий DMS анализировать C ++, создавать AST и создавать таблицы символов для таких AST с использованием грамматики атрибутов (AG), в которой кодируются правила поиска C ++.AG является вычислением функционального стиля, закодированным по узлам AST;построитель таблицы символов C ++ - это по сути большая функциональная программа, части которой присоединены к правилам грамматики BNF для C ++.

Как часть универсального механизма синтаксического анализа, учитывая определение языка (например, интерфейс C ++), DMS можетанализировать произвольные (не) терминалы этого языка, используя его встроенный шаблон языка.Таким образом, DMS может анализировать выражения, методы, объявления и т. Д. Или любой другой правильно сформированный фрагмент кода и создавать AST.Если предоставляется плохо сформированный фрагмент, в настоящее время возникает синтаксическая ошибка при разборе фрагмента;можно было бы расширить восстановление после ошибок DMS, чтобы сгенерировать достоверное исправление AST и, таким образом, проанализировать произвольные элементы.

Частичная таблица символов сложнее, так как большая часть механизма построения таблицы символов зависит от других частей таблицы символовв процессе постройки.Однако, поскольку все это закодировано как AG, можно выполнить часть AG, относящуюся к анализируемому фрагменту, например, логику построения таблицы symobl для метода.AG необходимо будет, вероятно, значительно изменить, чтобы он мог оперировать «допущениями» относительно отсутствующих определений символов;это фактически станет препятствием.Конечно, отсутствующий символ может быть любой из нескольких вещей, и вы можете получить конфигурации возможных таблиц символов.Подумайте:

{ int X;
  T*X;
}

Не зная, что такое T, тип фразы (и даже ее синтаксическая категория) не может быть однозначно определен.(DMS проанализирует T * X; и сообщит о неоднозначном синтаксическом анализе, поскольку существует множество возможных совпадающих интерпретаций, см. Почему C ++ не может быть проанализирован с анализатором LR (1)? )

Мы уже проделали некоторую работу с этим частичным анализом и частичными таблицами символов, в которых мы экспериментально использовали DMS для захвата кода, содержащего условные выражения препроцессора, с некоторым условным статусом неопределенным.Это заставляет нас строить записи таблицы условных символов.Обратите внимание:

#if  foo
   int X;
#else
   void X(int a) {...}
#endif
...
#if foo
  X++;
#else
   X(7);
#endif

С условными символами этот код может проверять тип.Запись таблицы символов для X говорит что-то вроде: «X ==> int if foo else ==> void (int)».

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

1 голос
/ 12 июля 2011

Понимание 4 C ++ от SciTools - это продукт, который анализирует исходный код и предоставляет метрики для различных вещей.Как инструмент, продукт похож на браузер с исходным кодом, но я лично не использую его для этого, поскольку Intellisense для визуальной студии так же хорош.* C и Perl API .Таким образом, используя это, вы можете написать свои собственные инструменты статического анализа.И да, он будет хорошо справляться с отсутствующими файлами кода.Кроме того, понимаю, что 4 C ++ работает в Windows и ряде других операционных систем.

Что касается вашего последнего вопроса о промежуточном коде, Understand 4 C ++ предоставляет вам не «промежуточную» форму, а ее APIон предоставляет вам слой абстракции над абстрактным синтаксическим деревом, который дает вам много возможностей для анализа исходного кода.Я написал много инструментов на своей работе, используя этот API и управляемый API C ++ (, который я написал и опубликовал в кодекплексе ), который оборачивает его собственный API C.

0 голосов
/ 11 июля 2011

Вы можете проверить это:

Какие инструменты статического анализа C ++ с открытым исходным кодом доступны?

это также относится к тому же вопросу, и там представлены некоторые решения. Это может быть полезно!

0 голосов
/ 11 июля 2011

не знаю о байт-коде LLVM, но есть старая пословица PcLint

http://www.gimpel.com/html/index.htm

у них даже есть модуль онлайн-тестирования, где вы можете публиковать части кода

...