Я пытаюсь создать абстрактный интерпретатор для C. Возможно, не для всей грамматики, а только для ее подмножества. Ранее я спрашивал, на каком языке использовать. Прежде чем продолжить, я хотел бы знать, как работает эта абстрактная интерпретация?
Я просмотрел ссылки Wiki и ссылки на лекции. Я понял логику и теорию, лежащую в основе этого. Я сделал свой анализ. Я совершенно не могу понять, как интерпретировать код. То есть исходный код у меня был. Теперь у меня есть предварительная обработка. Я также выполнил некоторую нормализацию кода, которая требуется для моего анализа. Теперь, как мне выполнить код построчно и извлечь из него данные по мере того, как я продолжаю его выполнять? (Скажите, пожалуйста, если это невозможно. Или есть способ правильно выполнить программу, которая достигнет моей цели). Я собираю информацию, такую как адрес памяти динамически выделяемого пространства, адреса возврата вызова функции.
Ранее мне предлагали CIL, CIL - это в основном инструмент преобразования, преобразующий код в некоторую нормализованную форму, заботясь о многих аномалиях, но я не смог получить никакой информации, относящейся к моей проблеме.
У меня вопрос, как извлекать информацию построчно и какой язык предпочтительнее? Императивные языки или функциональные языки? Я уже несколько дней искал информацию об этом в Google, но бесполезно. Любые ссылки также приветствуются. Спасибо.
РЕДАКТИРОВАТЬ: У меня все еще есть сомнения. Я получил ту часть, где мы пытаемся построить виртуальную среду. Позвольте мне объяснить, что я пытаюсь сделать, чтобы это помогло обсуждению. Я в основном пытаюсь провести анализ указателей, который в основном сосредоточен на арифметике указателей. Теперь предположим, что у меня есть целочисленный указатель, и я выполняю арифметические операции с указателем, тогда я не могу быть уверен, указывает ли указатель на действительные данные.
Из того, что вы говорите, я понимаю, что нам нужно выделить места для переменных, но как насчет значений. если у меня есть что-то вроде ниже
int a=10;
int *p = &a;
p = p+4;
Здесь известны значения а и константа «4». Что, если я получу значение от пользователя или файла. В таком случае мне нужно выполнить настоящую программу. В то же время мне нужно фиксировать данные, такие как адрес. ниже,
int *p =(int *) malloc (sizeof(int));
*p= 15;
cout<<*p;
p = p+ino//some user input value;
cout<<*p;
Таким образом, в основном код должен быть выполнен, но более поздняя часть решения больше походила на синтаксический анализ файла C. Пожалуйста, поправьте меня, если я ошибаюсь.