31
Институт систем информатики им. А. П. Ершова СО РАН Лаборатория теоретического программирования ИСИ СО РАН Расширение метагенерации Расширение метагенерации условий корректности концепцией семантической разметки Кондратьев Дмитрий Александрович Научный руководитель: канд. физ.-мат. наук Алексей Владимирович Промский Новосибирск, 2015 г.

TMPA-2015: Expanding the Meta-Generation of Correctness Conditions by Means of Semantic Markup

Embed Size (px)

Citation preview

Институт систем информатики им. А. П. Ершова СО РАН

Лаборатория теоретического программирования ИСИ СО РАН

Расширение метагенерацииРасширение метагенерации

условий корректности концепцией

семантической разметки

Кондратьев Дмитрий АлександровичНаучный руководитель: канд. физ.-мат. наук

Алексей Владимирович Промский

Новосибирск, 2015 г.

Проект C-light

– В ИСИ СО РАН разрабатывается проект C-light;

– Проект C-light – система дедуктивной верификации

Си-программ;Си-программ;

– Дедуктивную верификацию предложил Ч. Хоар в 1969-м

году;

– Задача создания расширяемой системы верификации;

– Задача создания удобной для всех пользователей системы

верификации.

Задача создания удобной системы верификации

– Система верификации должна быть удобной не только для

специалистов-теоретиков, но и для обычных программистов.

– Как анализировать недоказанные УК?

– Как определить, какие правила вывода были применены

при генерации УК?

– Как сопоставить подформулы УК и фрагменты – Как сопоставить подформулы УК и фрагменты

программы?

Метод решения задачи

– В 2008-м году Денни и Фишер предложили метод семантической разметки*.

– По концепции Денни и Фишера полученные после

генерации УК несут в себе дополнительную информацию,

выраженную в виде семантических меток.

– Метки проходят различные стадии обработки и

переводятся в объяснения на естественном языке.переводятся в объяснения на естественном языке.

* Denney E., Fischer B. Explaining Verification Conditions // Proc.

AMAST 2008. – LNCS. – 2008. – Vol. 5140. – P. 145-159.

Метод семантической разметки

– Структура УК. После упрощения УК обычно имеют вид

Хорновских дизъюнктов:

H1

˄ ... ˄ Hn⊃ C

– Структура метки.

Введем нотацию tl, где

• t – терм,

• l – метка или список меток.

Метки имеют вид c(o, n), гдеМетки имеют вид c(o, n), где

• c – концепция, описывающая предназначение терма,

• o – позиция связанных с меткой программных конструкций,

• n – список меток, «просочившихся» в данную.

Метод семантической разметки: концепции

– Гипотезы подразделяются на

• Утверждения – аннотации из программы, вошедшие в УК;

• Предикаты, управляющие потоком исполнения, –

подформулы в УК, отражающие ход исполнения программы.подформулы в УК, отражающие ход исполнения программы.

– Заключения передают информацию об основной цели УК.

– Уточнители характеризуют и гипотезы, и заключения,

передавая информацию о том, как подформула появилась

в УК и как она была преобразована.в УК и как она была преобразована.

– Индуктивные уточнители передают второстепенную

цель УК.

Модифицированные правила Хоара

{P1} S {INVest_inv_iter}pres_inv,

(INVass_inv_exit ˄cast(val(val(e, MeM..STD)),

type(e, MeM, TP), int) = 0) while_ff ⊃ Q,type(e, MeM, TP), int) = 0) while_ff ⊃ Q,

(INVass_inv ˄cast(val(val(e, MeM..STD)),

type(e, MeM, TP), int) ≠ 0) while_tt ⊃ P1pres_inv

–––––––––––––––––––––––––––––––––––––––––––––––––

{INVest_inv} while(e) S {Q}{INV } while(e) S {Q}

Упрощение имеющих метки УК

Правила для не имеющих меток УК нельзя переиспользовать

без пересмотра, так как

– Семантическая разметка может изменить применимость

правила;

– Нужно аккуратно работать с областью действия меток.

Правила упрощения должны достигать следующих целей:

– Удаление лишних меток;– Удаление лишних меток;

– Минимизация области действия оставшихся меток;

– Сохранение достаточного числа меток.

Правила упрощения имеющих метки УК

Введем

c(o, l) ⊗ m = c(o, l • m), где • – конкатенация списков.

Группировка правил:

1) Правила, удаляющие метки из тривиальных, тождественно

истинных (под-)формул;

2) Правила, выборочно удаляющие имеющие метки

тождественно ложные подформулы;

3) Правила, заменяющие всю формулу на false;

4) Правила, осуществляющие «просачивание» меток.

Например:

– P ˄ Ql → Pl ˄ Ql

– tnm → tn ⊗ m

Трансляция

1) Нормализация УК с использованием правил их

упрощения;

2) Извлечение меток после применения правила устранения 2) Извлечение меток после применения правила устранения

вложенности;

3) Нормализация меток для сопоставления меткам шаблонов

объяснений;

4) Генерация текста с использованием шаблонов 4) Генерация текста с использованием шаблонов

объяснений.

Конструкция label

Введем конструкцию (label t c), где

– t – терм, к которому приписана метка;

– c – строка (тип метки).

Расширение языка шаблонов семантическими метками

(label {P1} S {(label INV est_inv_iter)}pres_inv),

((label INV ass_inv_exit) /\(label

cast(val(val(e, MeM..STD)),type(e, MeM, TP), int) = 0type(e, MeM, TP), int) = 0

while_ff)) => Q,

(label((label INV ass_inv) /\(label

cast(val(val(e, MeM..STD)),type(e, MeM, TP), int) != 0type(e, MeM, TP), int) != 0

while_tt)) => P1pres_inv)

|-

{(label any_predicate(INV) est_inv}while(simple_expression(e)) any_code(S)

{any_predicate(Q)}

Задание шаблонов объяснений

Введем конструкцию (label_pattern label format_text), где:

– label – концепция метки;

– format_text – форматная строка, задающая текстовый

шаблон, в которой можно использовать специальные

конструкции:

• %begin – начало диапазона строк относящегося к

данной метке программного кода;

• %end – конец диапазона строк относящегося к данной • %end – конец диапазона строк относящегося к данной

метке программного кода.

Реализация концепции семантической разметки

– Структура label:

struct label

{{

char* concept;

int location_begin;

int location_end;

}}

– Иерархия на метках.

Протокол для локализации ошибокТранслятор: добавляет метаинформацию

До применения правила трансляции:

56. for(; i > 0 ; i++)

57. {

58. k++;

59. continue;59. continue;

60. j++;

61. }

После применения правила трансляции:

78. /* begin changes BCE5 17 79-85 */

79. for(; i > 0; i++)

80. {

81. j++;81. j++;

82. goto l;

83. k++;

84. l:

85. }

86. /* end changes */

Протокол для локализации ошибокОбратный транслятор: использует метаинформацию транслятора

До применения правила обратной трансляции:

69. /* begin changes BCE5 19 70-76 */

70. for(; i > 0; i++)

71. {

72. j++;

73. goto l;

74. k++;

75. l:

76. }

77. /* end changes */

После применения правила обратной трансляции:

43. /*begin reverse 70-76*/

44. for(; i > 0 ; i++)

45. {

46. k++;

47. continue;

48. j++;

49. }

50. /* end reverse */

Пример содержащей ошибку функции на языке C-light

Функция NegateFirst на языке C-kernel

Недоказанное условие корректности

Объяснение недоказанного условия корректности

Поиск максимума в массиве

/*@ requires (a != NULL) && (length > 0);

ensures (0 <= x) && (x < length);

ensures \forall int i; (0 <= i) && (i < length) ==>

(a[x] => a[i]);

*/*/

int max(int* a, int length);

Содержащая ошибку функция maxint max(int* a, int length)

{

int x = 0;

int y = length - 1;

/*@ loop invariant (0 <= x) && (x < length) &&

(0 <= y) && (y < length) &&(0 <= y) && (y < length) &&

(y >= x) &&

(\forall int i; (0 <= i) && (i <= x) ==>

(a[i] <= a[x]) || (a[i] <= a[y])) &&

(\forall int i; (y <= i) && (i <= length - 1) ==>

(a[i] <= a[x]) || (a[i] <= a[y]));

*/*/

while (x == y)

{

if (a[x] <= a[y]) {x = x + 1; } else {y = y - 1;}

}

return x;

}

Полученная C-kernel программа

1 // (AND (NEQ a |@NULL|)(> length 0))

2 int max(int* a, int length)

3 {

4-11 ...

12 }12 }

13 /* (AND (<= 0 x)(< x length)

(FORALL (i) (IMPLIES (AND (<= 0 i) (< i length))

(>= a[x] a[i]))))

*/

Функция max на языке C-kernel

2 int max(int* a, int length)

3 {

4 auto int x = 0;

5 auto int y = length - 1;

6 /* (AND (<= 0 x)(< x length)(<= 0 y)6 /* (AND (<= 0 x)(< x length)(<= 0 y)

(< y length)(>= y x)

(FORALL (i) (IMPLIES (AND (<= 0 i) (<= i x))

(OR (<= a[i] a[x]) (<= a[i] a[y]))))

(FORALL (i) (IMPLIES (AND (<= y i)

(<= i (- length 1)))

(OR (<= a[i] a[x])

(<= a[i] a[y])))))

*/*/

7 while (x == y)

8 {

9 if (a[x] <= a[y]) {x = x + 1; } else {y = y - 1;}

10 }

11 return x;

12 }

Недоказанное условие корректности( )( )( ) ( )( ) ( )( )( )

( )( )( )

( )( ) ( )( )( )

( )( ) ( )( )( )

( )( )( )

( )( ) ( )( )( )

( )

∧≤

∧≥

∧<

∧≤

∧<∧≤

xMeMMDiMeMMD

iMeMMD

i

xMeMMDyMeMMD

lengthMeMMDyMeMMD

yMeMMD

lengthMeMMDxMeMMDxMeMMDexitinvass

0

0

06__

( )( ) ( )( )( )

( ) ( )( )( ) ( ) ( )( )( )( )

( ) ( )( )( ) ( ) ( )( )( )( )

( )( ) ( )( )( )

( )( ) ( )( )( )( )

( ) ( )( )( ) ( ) ( )( )( )( )

( ) ( )( )( ) ( ) ( )( )( )( )

( )( ) ( )( )( )( )( )( )

∨≤⇒

−≤

∧≤

∨≤⇒

≤∀

yMeMMDaMeMMDiMeMMDaMeMMD

xMeMMDaMeMMDiMeMMDaMeMMD

lengthMeMMDiMeMMD

iMeMMDyMeMMD

i

yMeMMDaMeMMDiMeMMDaMeMMD

xMeMMDaMeMMDiMeMMDaMeMMD

xMeMMDiMeMMDi

,,

,,

1

,,

,,

( )( ) ( )( )( )( )( )

( )( ) ( )( )( )( )

( )

( )( )( ) ( )( ) ( )( )( )

( )( )( )

( )( ) ( )( )( )

( ) ( )( )( ) ( ) ( )( )( )( )

≥⇒

<

∧≤

∧<∧≤

=

=

=

iMeMMDaMeMMDxMeMMDaMeMMD

lengthMeMMDiMeMMD

iMeMMD

i

lengthMeMMDxMeMMDxMeMMD

TPMeMyMeMMDxMeMMDtype

STDMeMyMeMMDxMeMMDvalvalcast

ffwhile

,,

0

0

0int,,,

,..,7_

Объяснение недоказанного условия корректности

This VC corresponds to function "max".

Hence, given

– assumption that loop invariant holds without loop entry at line 6,

– assumption that the loop condition doesn't hold at line 7 .

Копирование файла

Копирование файла на языке C-kernel

Условие корректности

где

Объяснение условия корректности

Институт систем информатики им. А. П. Ершова СО РАН

Лаборатория теоретического программирования ИСИ СО РАН

Расширение метагенерацииРасширение метагенерации

условий корректности концепцией

семантической разметки

Кондратьев Дмитрий АлександровичНаучный руководитель: канд. физ.-мат. наук

Алексей Владимирович Промский

Новосибирск, 2015 г.