Токенизация и АСТ - PullRequest
       64

Токенизация и АСТ

4 голосов
/ 19 января 2012

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

Мой вопрос: мне нужно понять некоторые основные концепции / конструкциииспользуется для обработки кода для статического анализа.Я слышал, что люди используют такие вещи, как AST, токенизация и т. Д. Мне просто интересно, может ли что-нибудь прояснить, как эти вещи применяются при создании инструмента статического анализа?Мне бы хотелось больше объяснения токенизации, так как я не очень хорошо это понимаю.Я понимаю, что это своего рода способ обработки строк, но я не уверен в этом ответе.Кроме того, я знаю, что проект, на который я смотрю, пропускает код через препроцессор перед его анализом.Кто-нибудь может объяснить это?Конечно, если это статический анализ кода, его не нужно предварительно обрабатывать?

Надеюсь, кто-нибудь может мне это выяснить.

Приветствия.

Ответы [ 3 ]

5 голосов
/ 19 января 2012

Если вы интересуетесь статическим анализом, вам не следует беспокоиться о синтаксическом анализе (т. Е. Лексировании, разборе, построении абстрактного синтаксического дерева), потому что это вас мало чему научит.

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

Например, вы можете использовать компилятор GCC или компилятор LLVM / Clang . Знайте об их лицензии с открытым исходным кодом: GCC находится под GPLv3, а Clang / LLVM имеет BSD-подобную лицензию. GCC может обрабатывать не только C & C ++, но и Fortran, Go, Ada, Objective-C.

Из-за лицензии GCC GPLv3 ваша разработка над ней должна быть также свободной программой под GPLv3. Однако это также означает, что сообщество GCC довольно большое. Если вы знакомы с Ocaml и заинтересованы только в статическом анализе C, вы можете рассмотреть Frama-C (лицензия LGPL)

На самом деле я работаю над GCC, предоставляя инфраструктуру расширения MELT (MELT также лицензирован по GPLv3). MELT - это высокоуровневый предметно-ориентированный язык для расширения GCC и должен быть идеальным выбором для работы над статическим анализом с использованием мощной среды и внутренних представлений (Gimple, Tree, ...) GCC.

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

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

Таким образом, вы воспользуетесь преимуществами существующей инфраструктуры (так что вы не будете беспокоиться об AST и разборе) и улучшите какой-то существующий проект.

Я был бы очень рад, если бы вы заинтересовались MELT. FWIW, в Париже, 24 января, 1027 * th 2012, конференция HiPEAC .

.
4 голосов
/ 20 января 2012

Токенизация - это процесс разбиения исходного текста на такие элементы языка, как операторы, имена переменных, числа и т. Д. Парсинг читает последовательности токенов и создает Абстрактные синтаксические деревья , представляющие собой конкретное представление программы.Токенизация и синтаксический анализ необходимы для статического анализа, но вряд ли интересны, точно так же, как 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 ++, но "своего рода" довольно бесполезно для целей статического анализа.

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

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

2 голосов
/ 19 января 2012

Если вы ищете статический анализ для C & C ++, ваш первый стоп должен быть libclang вместе со связанными с ним документами.

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

Я почти уверен, что @Ira Baxter появится вогораздо более полный ответ:)

...