Как правило, если вы угадываете, вы угадываете неправильно;любые жалобы от статического анализатора, основанные на таких предположениях, являются ложными срабатываниями и, как правило, вызывают высокую вероятность отклонения.
Если вы настаиваете на догадках, вам понадобится инструмент, который может анализировать произвольные фрагменты 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)».
Я думаю, что идея рассуждать о больших фрагментах программы с ограничениями велика, ноЯ подозреваю, что это действительно сложно, и вы всегда будете пытаться разрешить достаточно информации об ограничении для статического анализа.