Как выглядит символическая модель

Я пытаюсь понять, как работают двигатели Symbolic Execution. В этой статье рассматриваются методы использования C. В них упоминается символическая память:

3.1 Полностью символьная память

На самом высоком уровне общности движок может рассматривать адреса памяти как полностью символические...

Представление памяти в компактной форме. Этот подход был использован в [32], который сопоставляет символьные, а не конкретные адресные выражения с данными, представляя возможные альтернативные состояния, возникающие в результате обращения к памяти с использованием символьных адресов в компактной неявной форме.

Эта статья также немного углубляется в символические кучи для Java:

4.1 Символическое представление состояния

Символическое состояние s состоит из символической кучи H, оценки полей примитивного типа, условия пути PC и счетчика программ.

Мне интересно, что на практике означает эта символическая куча. Для меня это означает, что все структуры данных, используемые при символическом выполнении, будут использовать символическую память, а не фактическую память. Это означает, что такие структуры, как массивы, должны иметь символические модели. Мне интересно на высоком уровне, как выглядят эти модели. Я не понимаю, как вы можете «символически моделировать длину массива». В моей голове это целое число, поэтому оно будет целым числом. А вот как символическое значение, интересно, что это значит. Я еще не вижу. Интересно, можно ли объяснить на высоком уровне, как можно символически моделировать некоторые структуры данных, такие как массивы или структуры с некоторыми другими значениями полей, поэтому это было бы полезно при символическом выполнении.

В этой старой статье упоминается:

Можно также определить альтернативную семантику «символического выполнения» для языка программирования, где реальные объекты данных не обязательно должны использоваться, но могут быть представлены произвольными символами.

Не уверен, как это выглядит.


person Lance Pollard    schedule 06.06.2018    source источник
comment
Статья в Википедии содержит очень простой пример символической казни, сначала посмотрите на него.   -  person Jean-Baptiste Yunès    schedule 06.06.2018
comment
Я посмотрел туда, и это помогает, но я все еще не вижу, как структура данных будет выглядеть, например, для массива.   -  person Lance Pollard    schedule 06.06.2018
comment
Теперь вы можете попробовать прочитать представление массива в символическом исполнении Альберто Коэн-Порисини и Флавио де Паоли (если у вас есть доступ к какой-либо научной базе данных).   -  person Jean-Baptiste Yunès    schedule 06.06.2018
comment
К сожалению, у меня нет доступа :/   -  person Lance Pollard    schedule 06.06.2018
comment
Каждый день может быть Рождеством   -  person Jean-Baptiste Yunès    schedule 06.06.2018


Ответы (2)


Полностью документированный пример механизма символьного исполнения с открытым исходным кодом — JPF — Symbolic Pathfinder. Он выполняется на уровне виртуальной машины Java. Он также должен ответить на ваши вопросы о более сложных структурах данных, таких как массивы или массивы объектов.

Очень хорошая публикация находится здесь: «Symbolic PathFinder: Integrating Symbolic Execution with Model Checking for Java Bytecode Analysis» в Automated Software Engineering Journal 20(3) 2013 https://ti.arc.nasa.gov/publications/5269/download/

Здесь вы можете увидеть подробный пример (раздел 4.9) того, как конкретный код «переписывается» и преобразуется в символьный код. Особенно то, как обрабатывается память стека и кучи, а также условия кода, зависящие от этой символической памяти (рис. 6+7). Вы не можете просто отделить память от выполнения условного пути.

Очень упрощенно: условия заменяются циклом по всем «символическим» ветвям (недетерминированный выбор). Память заменяется символическими значениями (как вы упомянули - распространяется здесь через так называемые атрибуты) и ограничениями на эти значения в зависимости от цикла ветвления. Решатель ограничений используется для дальнейшего сокращения невозможных ветвей (возврата) и окончательного решения ограничений.

Еще одним очень хорошим практическим примером для .Net-кода является запуск Microsoft SpecExplorer (XRT) в полном символьном режиме с использованием «Combination.KeepUnexpanded». В полученном графе исследованных пройденных путей вы можете увидеть хороший пример того, как представлены символьная память и ограничения. К сожалению, XRTs не является открытым исходным кодом.

P.S.: Действительно, представление символьных переменных является одной из больших проблем. Вот несколько очень хороших публикаций:

person goofy    schedule 08.06.2018

«Массив X имеет размер 100, а элемент в позиции 5 имеет значение 7» — это символическое представление массива. Ключевым моментом символического представления является то, что вы фокусируетесь на описании только того, что имеет значение.

Если вы хотите представить еще более генетический массив, вы также можете сделать его размер символическим, сказав «X имеет размер L», и в ходе анализа вы можете выяснить, что L=100 или L>90.

Сколько вы собираете различных структур данных, зависит от того, что вы хотите сделать. Связанный список — это набор областей памяти или нечто большее?

person Marco    schedule 07.06.2018