Це написано у вікі-статті Symbolic Execution , але я не можу знайти жодної посилання на неї. Хтось може мені показати вказівник? Дякую.
Це написано у вікі-статті Symbolic Execution , але я не можу знайти жодної посилання на неї. Хтось може мені показати вказівник? Дякую.
Відповіді:
Мені невідомий документ, який стосується порівняння символічного виконання та абстрактної інтерпретації. Я також не думаю, що це потрібно. Читання оригінальних описів цих двох прийомів має бути достатньо.
(І навпаки, якщо був би якийсь несподіваний зв’язок, то це варто було б описати. Але я дуже сумніваюся, що це так.)
Основна ідея символічного виконання полягає в тому, що в довільній точці виконання ви можете виражати значення всіх змінних як функції початкових значень. Основна ідея абстрактної інтерпретації полягає в тому, що ви можете систематично досліджувати всі виконання програми за допомогою ряду перенаближень. (Я чую, як кілька ентузіастів AI стогнали на попередньому наближенні.)
Таким чином, принаймні в оригінальній постановці, символічне виконання не стосувалося вивчення всіх можливих страт. Це можна побачити навіть у назві: воно включає слово "тестування". Але ось ще з розділу 8: "Для програм з нескінченними деревами виконання символічне тестування не може бути вичерпним і абсолютного доказу коректності не можна встановити".
На відміну від цього, абстрактне тлумачення має на меті дослідити всі страти. Для цього використовується кілька інгредієнтів, один з яких дуже схожий на основну ідею символічного виконання. Ці інгредієнти - це (1) абстрактні стани, (2) приєднання та розширення (отже, «ґрати» в назві).
Абстрактні держави.Конкретний стан програми в певний момент часу - це в основному знімок вмісту пам'яті (включаючи сам програмний код та лічильник програм). Тут є багато деталей, які важко відстежити. Аналізуючи певну властивість, можливо, ви захочете ігнорувати великі частини конкретного стану. Або ви можете бачити лише те, чи певна змінна є негативною, нульовою чи позитивною, але не піклується про її точне значення. Загалом, ви хочете розглянути абстрактну версію конкретного стану. Щоб це вирішити, ви повинні мати властивість комутативності: якщо ви берете конкретний стан, виконуєте оператор і потім абстрагуєте отриманий стан, ви повинні отримати той самий результат, як якщо ви абстрагуєте початковий стан, а потім виконаєте той самий твердження, але про абстрактний стан. Ця діаграма комутативності представлена в обох роботах. Це загальна ідея. Знову ж таки, абстрактне тлумачення є більш загальним, оскільки воно не диктує, як абстрагувати державу - воно просто говорить, що має бути спосіб це зробити. Навпаки, символічне виконання говорить про те, що ви використовуєте (символічні) вирази, які згадують початкові значення.
Приєднання та розширення. Якщо виконання програми досягає певного твердження двома різними способами, символічне виконання не намагається об'єднати два аналізи. Ось чому цитата вище стосується дерев страти, а не про даги. Але пам’ятайте, що абстрактне тлумачення хоче охопити всі страти. Таким чином, він просить спосіб об'єднати аналізи двох виконань у тому місці, де вони мають однаковий лічильник програм. (Приєднання моглобути дуже тупим ({a} приєднатися {b} = {a, b}) таким, що це дорівнює тому, що робить символічне виконання.) Взагалі, приєднання до себе недостатньо, щоб гарантувати, що ви зрештою закінчите аналіз усіх страт. (Зокрема, згадане раніше німе з'єднання не працюватиме.) Розгляньте програму з циклом: "n = input (); для i в діапазоні (n): dostuff ()". Скільки разів вам слід обійти цикл і продовжувати приєднуватися? Фіксована відповідь не працює. Таким чином, потрібно щось інше, і це розширюється , що можна розглядати як евристику. Припустимо, ви обійшли цикл 3 рази і дізналися, що "i = 0 або i = 1 або i = 2". Тоді ви кажете: хммм, ... давайте розширимося, і ви отримаєте "i> = 0". Знову ж абстрактне тлумачення не говорить про те, як зробити розширення - воно просто говорить, які властивості розширення повинні бути розроблені.
(Вибачте за цю довгу відповідь: я дійсно не встиг скоротити її.)
Я думаю, що це мається на увазі в дуже дрібному сенсі. Перший крок абстрактної інтерпретації - виявлення конкретної колекційної семантики. Замість того, щоб описати еволюцію єдиного стану, колекційна семантика описує еволюцію множин станів. Оскільки символічні причини виконання уявлень про множини станів, можна стверджувати, що воно являє собою конкретну семантику програми. Мені невідома точна кореспонденція, яка розробляється.
Дивіться Патріка Кузота. Méthodes itératives de building et d'approximation de points fixes d'opérateurs monotones sur un treillis, аналізують програми sémantique des (Ітеративні методи побудови та наближення точок фіксації монотонних операторів на ґратах, програмний статичний аналіз). Thèse ès Sciences Mathématiques, Université Joseph Fourier, Гренобль, Франція, 21 березня 1978 року. Https://cs.nyu.edu/~pcousot/publications.www/CousotTheseEsSciences1978.pdf (на жаль, французькою мовою), сторінка (3) -27 до (3) -29