Какие ресурсы для создания статического анализатора для C в C? - PullRequest
3 голосов
/ 07 февраля 2011

У меня есть школьный проект по разработке статического анализатора на C для C.

С чего мне начать? Какие ресурсы могут мне помочь?

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

Ответы [ 4 ]

2 голосов
/ 07 февраля 2011

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

Чтобы использовать antlr, вам нужен файл грамматики c или c ++ , выберите их и начните играть.

В любом случае, получайте от этого удовольствие ..

1 голос
/ 07 февраля 2011

Разбор является самой простой и наименее важной частью статического анализатора. Antlr уже предлагался, этого должно быть достаточно для анализа простого C (но не C ++). Небольшой совет - не используйте свой собственный препроцессор, лучше используйте вывод gcc -E.

В остальном вы можете взглянуть на некоторые из существующих источников анализаторов, а именно на Clang и CIL , прочитать о представлении SSA и абстрактной интерпретации . Выбор правильного промежуточного представления для вашего кода является ключом.

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

1 голос
/ 07 февраля 2011

Вы уверены, что хотите написать анализатор на C?

Если бы вы использовали современный язык (например, C #, Java, Python), то я бы поддержал предложение Спгеннарда ANTLR для синтаксического анализатора.

Если требуется написать анализатор на C, то вы застряли в lex и yacc (flex и bison) или, возможно, в парсере ручной работы.

Похоже, Uno приближается к тому, что вы хотите сделать. Он использует lex / yacc и включает файлы грамматики. Однако часть анализа написана на C ++.

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

1 голос
/ 07 февраля 2011

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

...