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