Это написано в вики-записи Символического Выполнения , но я не могу найти для этого никакой ссылки. Кто-нибудь может показать мне указатель? Спасибо.
Это написано в вики-записи Символического Выполнения , но я не могу найти для этого никакой ссылки. Кто-нибудь может показать мне указатель? Спасибо.
Ответы:
Мне не известна статья о сравнении символического исполнения и абстрактной интерпретации. И я не думаю, что это нужно. Чтение оригинальных описаний этих двух методов должно быть достаточно.
(И наоборот, если будет какая-то неожиданная связь, то это стоит описать. Но я очень сомневаюсь, что это так.)
Основная идея символического выполнения состоит в том, что в любой момент выполнения вы можете выразить значения всех переменных как функции начальных значений. Основная идея абстрактной интерпретации заключается в том, что вы можете систематически исследовать все исполнения программы с помощью ряда чрезмерных приближений. (Я слышу, как несколько энтузиастов ИИ стонут в предыдущем приближении.)
Таким образом, по крайней мере в первоначальной формулировке символическое исполнение не касалось изучения всех возможных казней. Вы можете увидеть это даже в заголовке: оно включает слово «тестирование». Но вот еще что из Раздела 8: «Для программ с бесконечными деревьями выполнения символическое тестирование не может быть исчерпывающим и не может быть установлено абсолютное доказательство правильности».
Напротив, абстрактная интерпретация направлена на изучение всех казней. Для этого используются несколько ингредиентов, один из которых очень похож на основную идею символического исполнения. Этими компонентами являются (1) абстрактные состояния, (2) соединение и расширение (отсюда и «решетка» в названии).
Абстрактные состояния.Конкретное состояние программы в конкретный момент времени - это, по сути, снимок содержимого памяти (включая сам код программы и счетчик программ). Здесь много деталей, которые сложно отследить. Когда вы анализируете конкретное свойство, вы можете игнорировать большие части конкретного состояния. Или вы можете заботиться только о том, является ли конкретная переменная отрицательной, нулевой или положительной, но не заботиться о ее точном значении. В общем, вы хотите рассмотреть абстрактный вариант конкретного состояния. Чтобы это сработало, у вас должно быть свойство коммутируемости: если вы берете конкретное состояние, выполняете оператор и затем абстрагируете результирующее состояние, вы должны получить тот же результат, что и при абстрагировании исходного состояния, а затем выполнить то же самое утверждение но в абстрактном состоянии. Эта диаграмма коммутативности появляется в обеих статьях. Это общая идея. Опять же, абстрактная интерпретация является более общей, поскольку она не диктует, как абстрагировать состояние, она просто говорит, что должен быть способ сделать это. Напротив, символьное выполнение говорит о том, что вы используете (символические) выражения, которые упоминают начальные значения.
Присоединение и расширение. Если выполнение программы достигает определенного оператора двумя разными способами, символическое выполнение не пытается объединить два анализа. Вот почему приведенная выше цитата говорит о деревьях выполнения, а не о дагах. Но помните, что абстрактная интерпретация хочет охватить все казни. Таким образом, он запрашивает способ объединить анализ двух выполнений в точке, где они имеют одинаковый счетчик программ. (Соединение можетбыть очень тупым ({a} join {b} = {a, b}) так, чтобы оно равнялось тому, что делает символическое выполнение.) В общем, само объединение недостаточно, чтобы гарантировать, что вы в конечном итоге закончите анализировать все выполнения. (В частности, упомянутое ранее тупое соединение не будет работать.) Рассмотрим программу с циклами: «n = input (); для i в диапазоне (n): dostuff ()». Сколько раз вы должны идти по кругу и продолжать присоединяться? Нет фиксированного ответа работает. Таким образом, нужно что-то еще, и это расширяется , что можно рассматривать как эвристику. Предположим, вы обошли цикл 3 раза и узнали, что «i = 0 или i = 1 или i = 2». Тогда вы говорите: хммм ... давайте расширимся, и вы получите "i> = 0". Опять же, абстрактная интерпретация не говорит о том, как сделать расширение - она просто говорит, какие свойства расширения должны работать.
(Извините за этот длинный ответ: у меня действительно не было времени, чтобы сделать это короче.)
Я думаю, что это подразумевается в очень поверхностном смысле. Первым шагом абстрактной интерпретации является выявление конкретной семантики сбора. Вместо описания эволюции одного состояния, сбор семантики описывает эволюцию наборов состояний. Поскольку символическое исполнение приводит к представлению множеств состояний, можно утверждать, что оно представляет конкретную семантику программы. Я не знаю, какая более точная переписка разрабатывается.
Смотри Патрик Кузо. Методы построения и аппроксимации точек фиксируют монотоны пользователей без анализа, анализируют программы (итерационные методы построения и аппроксимации фиксированных точек монотонных операторов на решетках, статический анализ программ). Эти математические науки, Университет Жозефа Фурье, Гренобль, Франция, 21 марта 1978 года. Https://cs.nyu.edu/~pcousot/publications.www/CousotTheseEsSciences1978.pdf (к сожалению, на французском языке), стр. (3) -27 до (3) -29