Символическое выполнение - это случай абстрактной интерпретации?


Ответы:


22

Мне не известна статья о сравнении символического исполнения и абстрактной интерпретации. И я не думаю, что это нужно. Чтение оригинальных описаний этих двух методов должно быть достаточно.

  • Кинг, Символическое выполнение и тестирование программ , 1976
  • Кузо, Кузо, Абстрактная интерпретация: унифицированная решеточная модель для статического анализа программ путем построения аппроксимации фиксированных точек , 1977

(И наоборот, если будет какая-то неожиданная связь, то это стоит описать. Но я очень сомневаюсь, что это так.)

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

Таким образом, по крайней мере в первоначальной формулировке символическое исполнение не касалось изучения всех возможных казней. Вы можете увидеть это даже в заголовке: оно включает слово «тестирование». Но вот еще что из Раздела 8: «Для программ с бесконечными деревьями выполнения символическое тестирование не может быть исчерпывающим и не может быть установлено абсолютное доказательство правильности».

Напротив, абстрактная интерпретация направлена ​​на изучение всех казней. Для этого используются несколько ингредиентов, один из которых очень похож на основную идею символического исполнения. Этими компонентами являются (1) абстрактные состояния, (2) соединение и расширение (отсюда и «решетка» в названии).

Абстрактные состояния.Конкретное состояние программы в конкретный момент времени - это, по сути, снимок содержимого памяти (включая сам код программы и счетчик программ). Здесь много деталей, которые сложно отследить. Когда вы анализируете конкретное свойство, вы можете игнорировать большие части конкретного состояния. Или вы можете заботиться только о том, является ли конкретная переменная отрицательной, нулевой или положительной, но не заботиться о ее точном значении. В общем, вы хотите рассмотреть абстрактный вариант конкретного состояния. Чтобы это сработало, у вас должно быть свойство коммутируемости: если вы берете конкретное состояние, выполняете оператор и затем абстрагируете результирующее состояние, вы должны получить тот же результат, что и при абстрагировании исходного состояния, а затем выполнить то же самое утверждение но в абстрактном состоянии. Эта диаграмма коммутативности появляется в обеих статьях. Это общая идея. Опять же, абстрактная интерпретация является более общей, поскольку она не диктует, как абстрагировать состояние, она просто говорит, что должен быть способ сделать это. Напротив, символьное выполнение говорит о том, что вы используете (символические) выражения, которые упоминают начальные значения.

Присоединение и расширение. Если выполнение программы достигает определенного оператора двумя разными способами, символическое выполнение не пытается объединить два анализа. Вот почему приведенная выше цитата говорит о деревьях выполнения, а не о дагах. Но помните, что абстрактная интерпретация хочет охватить все казни. Таким образом, он запрашивает способ объединить анализ двух выполнений в точке, где они имеют одинаковый счетчик программ. (Соединение можетбыть очень тупым ({a} join {b} = {a, b}) так, чтобы оно равнялось тому, что делает символическое выполнение.) В общем, само объединение недостаточно, чтобы гарантировать, что вы в конечном итоге закончите анализировать все выполнения. (В частности, упомянутое ранее тупое соединение не будет работать.) Рассмотрим программу с циклами: «n = input (); для i в диапазоне (n): dostuff ()». Сколько раз вы должны идти по кругу и продолжать присоединяться? Нет фиксированного ответа работает. Таким образом, нужно что-то еще, и это расширяется , что можно рассматривать как эвристику. Предположим, вы обошли цикл 3 раза и узнали, что «i = 0 или i = 1 или i = 2». Тогда вы говорите: хммм ... давайте расширимся, и вы получите "i> = 0". Опять же, абстрактная интерпретация не говорит о том, как сделать расширение - она ​​просто говорит, какие свойства расширения должны работать.

(Извините за этот длинный ответ: у меня действительно не было времени, чтобы сделать это короче.)


5

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


Спасибо. Но если SE представляет конкретную семантику, то какова абстрактная семантика? Без абстрактной семантики нельзя сказать, что это случай ИИ. Не могли бы вы объяснить немного больше? Кстати, я читал вашу статью, SAT решатели - это ИИ, это действительно интересно.
QSP

3
Во-первых, абстракция - это рефлексивное понятие, означающее, что каждая структура является тривиальной абстракцией самой себя через функцию тождества. Во-вторых, символьное выполнение не будет вычислять всю конкретную семантику, потому что исследуются только некоторые пути программы, поэтому в этом смысле существует недоработанная абстракция.
Виджай Д

2

Смотри Патрик Кузо. Методы построения и аппроксимации точек фиксируют монотоны пользователей без анализа, анализируют программы (итерационные методы построения и аппроксимации фиксированных точек монотонных операторов на решетках, статический анализ программ). Эти математические науки, Университет Жозефа Фурье, Гренобль, Франция, 21 марта 1978 года. Https://cs.nyu.edu/~pcousot/publications.www/CousotTheseEsSciences1978.pdf (к сожалению, на французском языке), стр. (3) -27 до (3) -29

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.