Page 1
Институт систем информатики им. А. П. Ершова СО РАН
Лаборатория теоретического программирования ИСИ СО РАН
Расширение метагенерацииРасширение метагенерации
условий корректности концепцией
семантической разметки
Кондратьев Дмитрий АлександровичНаучный руководитель: канд. физ.-мат. наук
Алексей Владимирович Промский
Новосибирск, 2015 г.
Page 2
Проект C-light
– В ИСИ СО РАН разрабатывается проект C-light;
– Проект C-light – система дедуктивной верификации
Си-программ;Си-программ;
– Дедуктивную верификацию предложил Ч. Хоар в 1969-м
году;
– Задача создания расширяемой системы верификации;
– Задача создания удобной для всех пользователей системы
верификации.
Page 3
Задача создания удобной системы верификации
– Система верификации должна быть удобной не только для
специалистов-теоретиков, но и для обычных программистов.
– Как анализировать недоказанные УК?
– Как определить, какие правила вывода были применены
при генерации УК?
– Как сопоставить подформулы УК и фрагменты – Как сопоставить подформулы УК и фрагменты
программы?
Page 4
Метод решения задачи
– В 2008-м году Денни и Фишер предложили метод семантической разметки*.
– По концепции Денни и Фишера полученные после
генерации УК несут в себе дополнительную информацию,
выраженную в виде семантических меток.
– Метки проходят различные стадии обработки и
переводятся в объяснения на естественном языке.переводятся в объяснения на естественном языке.
* Denney E., Fischer B. Explaining Verification Conditions // Proc.
AMAST 2008. – LNCS. – 2008. – Vol. 5140. – P. 145-159.
Page 5
Метод семантической разметки
– Структура УК. После упрощения УК обычно имеют вид
Хорновских дизъюнктов:
H1
˄ ... ˄ Hn⊃ C
– Структура метки.
Введем нотацию tl, где
• t – терм,
• l – метка или список меток.
Метки имеют вид c(o, n), гдеМетки имеют вид c(o, n), где
• c – концепция, описывающая предназначение терма,
• o – позиция связанных с меткой программных конструкций,
• n – список меток, «просочившихся» в данную.
Page 6
Метод семантической разметки: концепции
– Гипотезы подразделяются на
• Утверждения – аннотации из программы, вошедшие в УК;
• Предикаты, управляющие потоком исполнения, –
подформулы в УК, отражающие ход исполнения программы.подформулы в УК, отражающие ход исполнения программы.
– Заключения передают информацию об основной цели УК.
– Уточнители характеризуют и гипотезы, и заключения,
передавая информацию о том, как подформула появилась
в УК и как она была преобразована.в УК и как она была преобразована.
– Индуктивные уточнители передают второстепенную
цель УК.
Page 7
Модифицированные правила Хоара
{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}
Page 8
Упрощение имеющих метки УК
Правила для не имеющих меток УК нельзя переиспользовать
без пересмотра, так как
– Семантическая разметка может изменить применимость
правила;
– Нужно аккуратно работать с областью действия меток.
Правила упрощения должны достигать следующих целей:
– Удаление лишних меток;– Удаление лишних меток;
– Минимизация области действия оставшихся меток;
– Сохранение достаточного числа меток.
Page 9
Правила упрощения имеющих метки УК
Введем
c(o, l) ⊗ m = c(o, l • m), где • – конкатенация списков.
Группировка правил:
1) Правила, удаляющие метки из тривиальных, тождественно
истинных (под-)формул;
2) Правила, выборочно удаляющие имеющие метки
тождественно ложные подформулы;
3) Правила, заменяющие всю формулу на false;
4) Правила, осуществляющие «просачивание» меток.
Например:
– P ˄ Ql → Pl ˄ Ql
– tnm → tn ⊗ m
Page 10
Трансляция
1) Нормализация УК с использованием правил их
упрощения;
2) Извлечение меток после применения правила устранения 2) Извлечение меток после применения правила устранения
вложенности;
3) Нормализация меток для сопоставления меткам шаблонов
объяснений;
4) Генерация текста с использованием шаблонов 4) Генерация текста с использованием шаблонов
объяснений.
Page 11
Конструкция label
Введем конструкцию (label t c), где
– t – терм, к которому приписана метка;
– c – строка (тип метки).
Page 12
Расширение языка шаблонов семантическими метками
(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)}
Page 13
Задание шаблонов объяснений
Введем конструкцию (label_pattern label format_text), где:
– label – концепция метки;
– format_text – форматная строка, задающая текстовый
шаблон, в которой можно использовать специальные
конструкции:
• %begin – начало диапазона строк относящегося к
данной метке программного кода;
• %end – конец диапазона строк относящегося к данной • %end – конец диапазона строк относящегося к данной
метке программного кода.
Page 14
Реализация концепции семантической разметки
– Структура label:
struct label
{{
char* concept;
int location_begin;
int location_end;
}}
– Иерархия на метках.
Page 15
Протокол для локализации ошибокТранслятор: добавляет метаинформацию
До применения правила трансляции:
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 */
Page 16
Протокол для локализации ошибокОбратный транслятор: использует метаинформацию транслятора
До применения правила обратной трансляции:
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 */
Page 17
Пример содержащей ошибку функции на языке C-light
Page 18
Функция NegateFirst на языке C-kernel
Page 19
Недоказанное условие корректности
Page 20
Объяснение недоказанного условия корректности
Page 21
Поиск максимума в массиве
/*@ 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);
Page 22
Содержащая ошибку функция 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;
}
Page 23
Полученная 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]))))
*/
Page 24
Функция 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 }
Page 25
Недоказанное условие корректности( )( )( ) ( )( ) ( )( )( )
( )( )( )
( )( ) ( )( )( )
( )( ) ( )( )( )
( )( )( )
( )( ) ( )( )( )
( )
∧
≤
∧≤
∀
∧≥
∧<
∧≤
∧<∧≤
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_
Page 26
Объяснение недоказанного условия корректности
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 .
Page 27
Копирование файла
Page 28
Копирование файла на языке C-kernel
Page 29
Условие корректности
где
Page 30
Объяснение условия корректности
Page 31
Институт систем информатики им. А. П. Ершова СО РАН
Лаборатория теоретического программирования ИСИ СО РАН
Расширение метагенерацииРасширение метагенерации
условий корректности концепцией
семантической разметки
Кондратьев Дмитрий АлександровичНаучный руководитель: канд. физ.-мат. наук
Алексей Владимирович Промский
Новосибирск, 2015 г.