Токенизация - это процесс разбиения исходного текста на такие элементы языка, как операторы, имена переменных, числа и т. Д. Парсинг читает последовательности токенов и создает Абстрактные синтаксические деревья , представляющие собой конкретное представление программы.Токенизация и синтаксический анализ необходимы для статического анализа, но вряд ли интересны, точно так же, как ante-to-pot необходима для игры в покер, но никак не для интересной части игры.
Если вывы создаете статический анализатор (вы подразумеваете, что собираетесь работать с тем, который реализован на C или C ++), вам потребуются фундаментальные знания по компиляции (синтаксический анализ не так много, если вы не создаете синтаксический анализатор для статически анализируемого языка), но, безусловно,о представлениях программы (AST, тройки, графики управления и потока данных, ...), типе и выводе свойств, а также ограничениях на точность анализа (причина консервативного анализа. Представления программы являются фундаментальными, потому что это структуры данных, которые наиболее статичныанализаторы действительно обрабатывают, просто слишком сложно извлекать полезные факты непосредственно из текста программы. Эти понятия можно использовать для реализации возможностей статического анализа на любом языке программирования для реализации инструментов типа анализа;специально для их реализации на C или C ++.
Запустите, не ходите, к ближайшему классу компилятора для первой части этого.Если у вас его нет, вы не сможете сделать ничего эффективного в создании инструментов.Вторую часть вы, скорее всего, найдете в выпускном классе по информатике.
Если вы справитесь с этой проблемой базовых знаний, вы либо решите внедрить инструмент анализа с нуля, либо использовать существующую инфраструктуру инструментов анализа.Мало кто решает построить его с нуля;Требуется огромный объем работы (годы или десятилетия) для создания надежных анализаторов, анализаторов потока и т. д., необходимых в качестве основы для любого конкретного статического анализа.В основном люди пытаются использовать какую-то существующую инфраструктуру.
Существует огромный список кандидатов по адресу: http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis
Если вы настаиваете на обработке C или C ++ и создании своего собственного сложного анализа.Вы действительно , действительно нуждаетесь в инструменте, который может работать с реальным кодом C и C ++.ИМХО есть ограниченное количество хороших кандидатов:
- GCC (и различные прививки, такие как MELT Старинкевича, о котором я мало что знаю)
- Clang (довольно впечатляющий набор инструментов)
- DMS (и C и C ++ * ) [инструмент моей компании]
- Инфраструктура компилятора Open64
- Инфраструктура компилятора Rose (на основе общепромышленного интерфейса EDG)
Каждая из этих систем является большой и требует больших инвестиций для понимания и начала использования.Не недооценивайте кривую обучения.
Существует множество других инструментов такого рода процессов C и C ++, но "своего рода" довольно бесполезно для целей статического анализа.
Есливы намерены просто использовать инструмент статического анализа, вы можете избежать изучения большинства вопросов анализа и представления программы;вместо этого вам нужно узнать как можно больше о конкретном инструменте анализа, который вы собираетесь использовать.Вы по-прежнему будете чувствовать себя намного лучше с приведенным выше фоном компилятора, потому что вы поймете, что делает инструмент, почему он это делает и почему он выдает такие ответы (как правило, он выдает ответы, которые во многих случаях являются неудовлетворительными).путей из-за консервативных ограничений на точность анализа).
Наконец, вам должно быть ясно, что вы понимаете разницу между статическим анализом и динамическим анализом [с использованием данныхсобирается во время выполнения для определения свойств программы.Большинство конечных пользователей не заботятся о том, как вы получаете информацию об их коде, и каждый подход к анализу имеет свои сильные и слабые стороны.