У вас нет выбора, нужен ли вам парсер или нет. Он вам нужен (включая полный препроцессор). То, что вы особенно не хотите делать, - это бросить свой собственный парсер; C намного сложнее, чем вы думаете, а затем вам нужно беспокоиться о конкретном диалекте C интереса.
Но анализатора едва хватает; вам нужен инструмент, который может разрешать имена для деклараций и выражений для типов, которые могут извлекать потоковые графы, которые могут выполнять точки анализа и, в частности, функциональные точки для анализа, и, наконец, что-то, что может построить граф вызовов, принимая во внимание все это , Это означает, что вам нужна компиляторная инфраструктура для решения проблемы.
Возможно, вы можете согнуть GCC (жесткий, он действительно хочет быть компилятором) или Clang (хочет быть, но предназначен для других целей), но они хотят скомпилировать отдельные программы, и вам нужно что-то который может обрабатывать набор программ (поскольку программы C обычно строятся таким образом). Наш DMS Software Reengineering Toolkit разработан специально для поддержки такого рода пользовательских задач и имеет все необходимое оборудование. (DMS также поддерживает конкретные диалекты C).
Имея сделанный выбор каркаса, код для навигации по интересующей траектории потока вряд ли будет простым. Общий совет будет состоять в том, чтобы «проанализировать источник, применить все вышеперечисленные анализаторы, а затем перейти к структурам данных с помощью предлагаемых API-интерфейсов» с очевидным особым упором на API, которые следуют за путями потока управления. Весь этот код вряд ли подходит для примера. И он будет значительно отличаться в зависимости от того, какую структуру вы выберете. Я не очень подробно расскажу о GCC или Clang, но я не думаю, что они предлагают вам легкие средства для записи символического описания пути (например, конъюнкции условных выражений). Я могу сказать вам, что DMS (по дизайну) имеет явную поддержку для построения таких символических формул.
Независимо от того, к какому маршруту вы идете, вы столкнетесь с образовательной стоимостью обучения тому, как бороться с этими инструментами. Они сложны; ожидайте, что ваша кривая обучения будет относительно длинной.
Вы задаете вопрос с инструментом. SO-фанатики, скорее всего, закрывают это. –
@IraBaxter Я спрашиваю о инструменте/подходе :). Anw, я отредактирую его. –