#clang #llvm
Вопрос:
Я хочу получить последовательность доступа ко всем переменным в процессе выполнения программы с помощью статического анализа. Как я могу проанализировать поток выполнения программы через AST? Или использовать CFG для анализа для извлечения переменной информации?
Комментарии:
1. Ну, прежде всего, вам нужно решить, что вы хотите делать, потому что в том, что вы описываете, есть большая свобода действий, и это легко может оказаться невозможным. Например, какова последовательность в таком коде, как
while(a.b gt; a.c) { switch d(a.e) case 1: f(a.b); break; case 2: g(a); break; case… }
? Является ли переменная переменной или переменные отдельных полей, как насчет возможных доступов, таких как вf()
иg()
? Как только вы решите, информации в ответах на другие ваши вопросы может быть достаточно или нет. Задайте конкретный вопрос, если нет, пожалуйста.2. Хорошо, спасибо за ваш ответ, я выложу пример кода вот так:
3.
struct test1{ int a; int b; }; struct test2 { int a; int b; }; int main () { struct test1 t; struct test2 t2; if (t.a lt; t.b) return t.a; for (int i = 0; i lt; 10; i ) { t.a ; } for (int i = 0; i lt; 10; i ) { t2.b ; } return t.b; }
Я хочу получить следующую последовательность: t.a, t.b, t.a, t.a ***,t2.b,t2.b,**** Я еще не рассматривал возможность ветвления, но я не знаю, как работать с ветвями, как вы сказали, и я не знаком с тем, как мне следует учиться, поэтому я не знаю, с чего начать с этого требования4. Извините, это слишком расплывчато для меня, но, может быть, у кого-то еще есть предложение. Работа с филиалами действительно является необходимым условием для анализа потока программ.
5. Спасибо за ваш ответ, могу ли я обрабатывать ветви на основе AST? Все еще нужно использовать CFG?