Институт систем информатики им. А. П. Ершова СО РАН
Лаборатория теоретического программирования ИСИ СО РАН
Расширение метагенерацииРасширение метагенерации
условий корректности концепцией
семантической разметки
Кондратьев Дмитрий АлександровичНаучный руководитель: канд. физ.-мат. наук
Алексей Владимирович Промский
Новосибирск, 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 */
Поиск максимума в массиве
/*@ 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 .
Институт систем информатики им. А. П. Ершова СО РАН
Лаборатория теоретического программирования ИСИ СО РАН
Расширение метагенерацииРасширение метагенерации
условий корректности концепцией
семантической разметки
Кондратьев Дмитрий АлександровичНаучный руководитель: канд. физ.-мат. наук
Алексей Владимирович Промский
Новосибирск, 2015 г.