Верификация программного обеспечения. Текущее состояние и проблемы

Содержание

Слайд 2

Сложность современного ПО

Сложность современного ПО

Слайд 3

Статистика ошибок

Количество ошибок на 1000 строк кода (до тестирования) остается практически

Статистика ошибок Количество ошибок на 1000 строк кода (до тестирования) остается практически неизменным за 30 лет
неизменным за 30 лет

Слайд 4

Верификация и информационная безопасность программ

Наличие ошибки в программе часто означает наличие уязвимости
Технологии

Верификация и информационная безопасность программ Наличие ошибки в программе часто означает наличие
верификации одновременно являются средствами оценки и обеспечения информационной безопасности программ
Вывод: повышение информационной безопасности программ без развития технологий верификации невозможно

Слайд 5

Технологии верификации

Экспертиза
Тестирование (динамические испытания)
Аналитическая верификация
Статический анализ
Комбинированные подходы

Технологии верификации Экспертиза Тестирование (динамические испытания) Аналитическая верификация Статический анализ Комбинированные подходы

Слайд 6

Экспертиза

Поиск ошибок, оценка и анализ свойств ПО человеком (обычно группа 2-5 человек)
Техники
Списки

Экспертиза Поиск ошибок, оценка и анализ свойств ПО человеком (обычно группа 2-5
важных ограничений и шаблонов ошибок
Групповые обсуждения
Производительность : 100-150 строк / час
Не более 2-3 часов в день
Результаты : выявляется 50-90% ошибок (обнаруживаемых за все время жизни ПО)
Нужны настоящие эксперты, программисты с менее чем 10-летним стажем могут участвовать лишь как обучающиеся

Слайд 7

Тестирование

Оценка корректности системы по ее работе в выбранных ситуациях, с определенными данными
Техники:
Шаблоны

Тестирование Оценка корректности системы по ее работе в выбранных ситуациях, с определенными
сценариев, перебор и фильтрация
Синтез тестов по структуре реализации или модели
Производительность : сильно зависит от целей, техники, опыта и пр.
Microsoft : производительность разработки тестов и тестирования примерно такая же, как у создателей кода, 10 строк/час
Результаты : выявляется 30-80% ошибок
Часто используется неопытный персонал, что отрицательно сказывается на качестве

Слайд 8

Пример : проект DMS (ИСП РАН)

Разработка тестов для ОС телефонного коммутатора Nortel

Пример : проект DMS (ИСП РАН) Разработка тестов для ОС телефонного коммутатора
Networks с использованием формальных методов
Размер системы : 250 000 строк, 230 интерфейсных функций
Трудоемкость : ~ 10 человеко-лет
Результаты:
Тестовый набор использовался для проверки всех новых версий ОС
> 300 ошибок в системе с заявленной надежностью 99.9999%
12 ошибок, требующих холодного рестарта
~ 50% всех ошибок найдены в ходе экспертизы
Остальные выявлены тестами, сгенерированными из формальных спецификаций и нацеленными на их покрытие

Слайд 9

Показатели качества тестирования

Метрики тестового покрытия
Функциональности программы и требований
Структуры кода: строк, ветвлений, комбинаций

Показатели качества тестирования Метрики тестового покрытия Функциональности программы и требований Структуры кода:
условий в ветвлениях
Для адекватной оценки нужно сочетание нескольких метрик
Примеры достигаемого тестового покрытия :
Обычное коммерческое ПО : 15-20% ветвлений в коде
Системное ПО : 60-80% ветвлений в коде
Тесты на базе формальных моделей : 70-80% ветвлений в коде
Аналитическая верификация : 100% ветвлений в коде

Слайд 10

Аналитическая верификация

Формальное описание семантики программы и требований и доказательство выполнения требований
Техники:
Метод Флойда

Аналитическая верификация Формальное описание семантики программы и требований и доказательство выполнения требований
(дедуктивный метод)
Provers, solvers, интерактивные инструменты
Инструменты:
Мировые лидеры: PVS, Isabelle/HOL, Frama-C
Примеры приложений: микропроцессоры, ядро операционной системы seL4
Опыт ИСП РАН: практикум по верификации с помощью Frama-C (~ 100 человеко-часов на программу размером порядка 100 строк)

Слайд 11

Пример: верификация ядра ОС seL4

Ядро встроенной ОС seL4
8700 строк на C, 600

Пример: верификация ядра ОС seL4 Ядро встроенной ОС seL4 8700 строк на
строк на ассемблере
Для реализации ~2.5 человеко-года
Верификация
200 000 строк формальной модели
Инструмент: Isabelle/HOL
Трудоемкость – 20 человеко-лет (12 чел.) Доказано ~10000 лемм

Слайд 12

Статический анализ программ

Статический анализ программ

Слайд 13

f(char * p)
{ char s[6];
strcpy(s,p);
}
main1 ()
{ f(“hello”);
}
main2 ()
{ f(“privet”);
}

\0

o

l

l

e

h

t

\0

e

v

i

r

p

Стек после выполнения функции f, вызванной из

f(char * p) { char s[6]; strcpy(s,p); } main1 () { f(“hello”);
main1

массив s

Стек после выполнения функции f, вызванной из main2

В случае main2 адрес возврата перезапишется и управление будет передано не на main2, а на другой участок кода

адрес возврата

На место адреса main2 записали лишний байт

Адрес main1

Простейший пример

Слайд 14

Альтернативы решения

Тестирование
Проверки времени выполнения
Статический анализ программы
Смешанный

Альтернативы решения Тестирование Проверки времени выполнения Статический анализ программы Смешанный

Слайд 15

Можно использовать специальные функции с дополнительными параметрами – ограничениями сверху на объем

Можно использовать специальные функции с дополнительными параметрами – ограничениями сверху на объем
записываемой информации. Например, вместо strcpy(a,b) использовать strncpy(a,b,n), где n-максимальное количество переписываемых символов
Вставка проверок подразумевает инструментацию исходного кода и так как такие проверки должны присутствовать во всех потенциально опасных местах, инструментированный код может работать на порядок медленнее исходного

f(char * p)
{ char s[10];
strcpy(s,p);
}

f(char * p)
{ char s[10];
if (strlen(p)<10)
strcpy(s,p);
}

f(char * p)
{ char s[10];
strncpy(s,p,10);
}

Динамические проверки

Слайд 16

От динамической защиты к статическому обнаружению

Даже в случае минимизации количества проверок инструментированный

От динамической защиты к статическому обнаружению Даже в случае минимизации количества проверок
код работает гораздо медленнее исходного
Среди вставляемых проверок много «бесполезных», то есть тех, которые проверяют заведомо истинные условия
Необходимо статически обнаружить в тексте программы только те места, в которых действительно возможно нарушение системы защиты

Слайд 17

Цели статического анализа – выявление дефектов в программах

Дефекты (ситуации в исходном коде) могут

Цели статического анализа – выявление дефектов в программах Дефекты (ситуации в исходном
приводить к:
Уязвимостям ⃰ защиты
Потере стабильности работы программы
⃰Уязвимость защиты (security vulnerability) – ошибка в тексте программы, которая позволяет пользователю при некоторых сценариях использования программы обходить средства разграничения прав доступа программы или ОС, в которой программа выполняется.

Слайд 18

Рассматриваемые виды дефектов

Переполнение буфера
Format string: недостаточный контроль параметров при использовании функций семейства

Рассматриваемые виды дефектов Переполнение буфера Format string: недостаточный контроль параметров при использовании
printf/scanf
Tainted input: некорректное использование непроверяемых на корректность пользовательских данных
Разыменование нулевого указателя
Утечки памяти
Использование неинициализированных данных

Слайд 19

Преимущества статического анализа

Автоматический анализ многих путей исполнения одновременно
Обнаружение дефектов, проявляющихся только на

Преимущества статического анализа Автоматический анализ многих путей исполнения одновременно Обнаружение дефектов, проявляющихся
редких путях исполнения, или на необычных входных данных (которые могут быть установлены злоумышленником в процессе атаки)
Возможность анализа на неполном наборе исходных файлов
Отсутствие накладных расходов во время выполнения программы

Слайд 20

Первое поколение анализаторов

Flowfinder, ITS4, RATS, Pscan (распространяются бесплатно)
CodeSurfer (инструмент для обнаружения уязвимостей

Первое поколение анализаторов Flowfinder, ITS4, RATS, Pscan (распространяются бесплатно) CodeSurfer (инструмент для
на базе CodeSurfer’а недоступен)
FlexeLint (продается на рынке), Splint (распространяется бесплатно)

Слайд 21

Недостатки первого поколения

Большое число ложных срабатываний – 90% и выше
Пропуск реальных уязвимостей
Необходима

Недостатки первого поколения Большое число ложных срабатываний – 90% и выше Пропуск
ручная проверка результатов работы, которая требует привлечения значительных ресурсов (материальных, людских, временных)

Слайд 22

Современные анализаторы

Coverity Prevent
Klockwork Insight
Svace

Современные анализаторы Coverity Prevent Klockwork Insight Svace

Слайд 23

Наш подход

Для обнаружения уязвимостей мы предлагаем применять следующее:
Межпроцедурный data-flow анализ с итерациями

Наш подход Для обнаружения уязвимостей мы предлагаем применять следующее: Межпроцедурный data-flow анализ
на внутрипроцедурном уровне
Анализ указателей
Анализ интервалов и значений целочисленных объектов
Контекстно-зависимый (использующий индивидуальные входные параметры для каждой точки вызова) анализ

Слайд 24

Целью целочисленного анализа программы является получение необходимой информации о значении целочисленных атрибутов

Целью целочисленного анализа программы является получение необходимой информации о значении целочисленных атрибутов
объектов программы (значение переменной, размер массива и т.д.)
Чем точнее и полнее представляются целочисленные значения, тем точнее возможно проведение поиска уязвимостей

void f(int i)
{ char p[5];
int a;
if (i>0)
a=4;
else
a=3;
p[a]=0;
}

i>0

a=4

a=3

p[a]=0

yes

no

Value(a)=3

Value(a)=4

Value(a)=[3..4]

- нет уязвимости

Целочисленный анализ на основе интервалов

Слайд 25

Потеря точности в некоторых случаях.
Отсутствие информации о связях между переменными: в случае

Потеря точности в некоторых случаях. Отсутствие информации о связях между переменными: в
анализа на основе интервалов в последней инструкции примера будет обнаружена ложная уязвимость.

void f(int i)
{ char p[5];
int a,b,c;
if (i>0)
a=0;
else
a=1;
b=a+4;
c=b-a;
p[c]=0
}

i>0

a=0

a=1

b=a+4

yes

no

Value(a)=1

Value(a)=0

Value(a)=[0..1]

c=b-a

p[c]=0

Value(a)=[0..1]
Value(b)=[4..5]
Value(c)=[3..5]

Value(a)=[0..1]
Value(b)=[4..5]

Value(a)=[0..1]
Value(b)=a+4

Value(a)=[0..1]
Value(b)=a+4
Value(c)=4

Size(p)=5

Value(c)

Value(c) может быть равным Size(p) => ложная ошибка

Недостатки целочисленного анализа интервалов

Слайд 26

Необходимость межпроцедурного анализа

f(char *p, char *s)
{ strcpy(p,s); // произойдет копирование 6 байт, включая

Необходимость межпроцедурного анализа f(char *p, char *s) { strcpy(p,s); // произойдет копирование
//конец строки
}
main()
{ char *p;
p=malloc(5);
f(p,”hello”);
}
В приведенном примере указатель на объект размером 5 байт передается в функцию f, поэтому без межпроцедурного анализа эта информация никаким образом не попадет на вход вызову функции strcpy и ошибку не зафиксируется

Слайд 27

Необходимость анализа указателей



char a[10];
char * p;
p=a;
p[10]=0;

Для данного примера в случае отсутствия анализа

Необходимость анализа указателей … char a[10]; char * p; p=a; p[10]=0; …
указателей невозможно сделать никаких предположений о размере массива, на который указывает p и, следовательно, невозможно определить наличие ошибки

Слайд 28

Спецификация окружения

char* strcpy(char *dst, const char *src) {
char d1 = *dst;//dst

Спецификация окружения char* strcpy(char *dst, const char *src) { char d1 =
и src
char d2 = *src;// разыменовываются в функции
//необходимо проверить на корректность src
//(в случае пользовательского ввода)
sf_set_trusted_sink_ptr(src);
//содержимое src копируется в dst
sf_copy_string(dst, src);
//возвращается входной параметр
return dst;
}

Внутренние обработчики инфраструктуры анализа

Слайд 29

Схема работы Svace

Анализируемая программа

Система сборки

Файлы с исходным кодом

Утилита перехвата

Компилятор LLVM-GCC
или CLANG

Исходный код

Измененная командная

Схема работы Svace Анализируемая программа Система сборки Файлы с исходным кодом Утилита
строка

Командная строка

Биткод-файл

Входные биткод-файлы

Биткод-файлы
для исходных
файлов

Биткод-файлы
спецификаций
библиотек

Инфраструктура
анализа

Детекторы

Вызовы внутреннего
интерфейса

Инструмент статического анализа

Биткод-файлы

Исходный код

Работа с результатами анализа через компонент Eclipse

Список предупреж-дений

Биткод-файл

Слайд 30

Построение аннотаций

Биткод-файлы
для исходных
файлов

Спецификации библиотечных
функций на языке Си

Биткод-файлы спецификаций
библиотек

Компилятор LLVM-GCC или CLANG

Функции

Построение аннотаций Биткод-файлы для исходных файлов Спецификации библиотечных функций на языке Си
анализируемой
программы

Функции спецификаций

Построение графа вызовов

Аннотации

Анализ

Анализ*

*Анализ отдельной функции

Анализ вызова функции

Вызов подпрограммы

Вызов подпрограммы

Слайд 31

Топологический порядок обработки функций

Граф вызовов функции

main

q

w

a

b

c

prinf

strcpy

Построение топологического порядка функций

a

b

c

q

w

main

Порядок анализа

Создание аннотаций библиотечных

Топологический порядок обработки функций Граф вызовов функции main q w a b
функций

printf

strcpy

a

q

b

Анализ функции ‘c’

Аннотации:

Межпроцедурный анализ (интервальный, tainted, нулевых указателей, алиасов и др.)

Слайд 32

Время анализа

* Не учитывается время компиляции проекта

Время анализа * Не учитывается время компиляции проекта

Слайд 33

Сравнение с Coverity Prevent

Сравнение с Coverity Prevent

Слайд 34

Текущее состояние

Анализ программ на Си\Си++.
Информация об исходном коде собирается при помощи компилятора

Текущее состояние Анализ программ на Си\Си++. Информация об исходном коде собирается при
LLVM-GCC (или CLANG)
Нет ограничений на размер программы (линейная масштабируемость)
Полностью автоматический анализ
Поддержка пользовательских спецификаций функций
Набор спецификаций стандартных библиотечных функций (Си, Linux)
Набор подсистем поиска различных дефектов (переполнение буфера, разыменование нулевого указателя и др.)
Набор подсистем поиска дефектов расширяем
Графический пользовательский интерфейс, реализованный в виде расширения среды Eclipse

Слайд 35

Avalanche: Обнаружение ошибок при помощи динамического анализа

Avalanche: Обнаружение ошибок при помощи динамического анализа

Слайд 36

Динамический и статический анализ кода
Динамический анализ - анализ программы во время выполнения
Статический

Динамический и статический анализ кода Динамический анализ - анализ программы во время
анализ - анализ без выполнения программы

Слайд 37

Обнаружение ошибок при помощи анализа программ

Динамический анализ
Требуется набор входных данных и/или среда

Обнаружение ошибок при помощи анализа программ Динамический анализ Требуется набор входных данных
выполнения
Высокие требования к ресурсам
Высокая точность обнаружения
Статический анализ
Работает на исходном или бинарном коде
Анализ абстрактной модели
Хорошая масштабируемость
Ложные срабатывания

Слайд 38

Valgrind

Фреймворк динамической инструментации
Обнаруживаемые ошибки:
Утечки памяти
Ошибки работы с динамической памятью
Неиницилизированные данные
Ошибки в многопоточных

Valgrind Фреймворк динамической инструментации Обнаруживаемые ошибки: Утечки памяти Ошибки работы с динамической
программах

Слайд 39

Valgrind: общая схема работы

Внутреннее представление
команд Valgrind – абстрактная
RISC машина

Valgrind: общая схема работы Внутреннее представление команд Valgrind – абстрактная RISC машина

Слайд 40

Трасса выполнения программы

Трасса выполнения программы

Слайд 41

Трасса выполнения программы

Трасса выполнения программы

Слайд 42

Трасса выполнения программы

Трасса выполнения программы

Слайд 43

Трасса выполнения программы

Трасса выполнения программы

Слайд 44

Работы в этой области

EXE tool, Stanford University - символические вычисления
SAGE framework, Microsoft

Работы в этой области EXE tool, Stanford University - символические вычисления SAGE
Research - white-box fuzz testing
KLEE, LLVM project

Слайд 45

Пример

char *names[] = { “one”, “two”, ...};
char buf[3];
fread(buf, 3, 1, f); //

Пример char *names[] = { “one”, “two”, ...}; char buf[3]; fread(buf, 3,
чтение 3-х байт из файла
if (buf[0] == 1) { // ветвление #1
int index;
if (buf[1] + buf[2] > 0) { // ветвление #2
index = ...;
}
name = names[index]; // index не инициализирован
// выход за границы массива
...
} else {
...
}

Слайд 46

Пример

fread(buf, 3, 1, f)

buf[0] == 1

buf[1] + buf[2] > 0

x1, x2, x3:

Пример fread(buf, 3, 1, f) buf[0] == 1 buf[1] + buf[2] >
byte
x1 = 1
x2 + x3 > 0

x1 = 1
x2 = 100
x2 = 200

Слайд 47

Пример

fread(buf, 3, 1, f)

buf[0] == 1

buf[1] + buf[2] > 0

Система уравнений:
x1, x2,

Пример fread(buf, 3, 1, f) buf[0] == 1 buf[1] + buf[2] >
x3: byte
¬(x1 = 1)

x1 = 2

Решение:

Слайд 48

Пример

fread(buf, 3, 1, f)

buf[0] == 1

buf[1] + buf[2] > 0

Система уравнений:
x1, x2,

Пример fread(buf, 3, 1, f) buf[0] == 1 buf[1] + buf[2] >
x3: byte
x1 = 1
¬(x2 + x3 > 0)

x1 = 1
x2 = 0
x3 = 0

Решение:

Слайд 49

Avalanche

Отслеживает поток помеченных (потенциально опасных) данных
Изменяет входные данные, чтобы спровоцировать ошибку, или

Avalanche Отслеживает поток помеченных (потенциально опасных) данных Изменяет входные данные, чтобы спровоцировать
обойти новые части программы
Обнаруживает критические ошибки - разыменование нулевого указателя, деление на ноль, неинициализированные данные, ошибки работы с памятью
Генерирует набор входных данных для каждой найденной ошибки

Слайд 50

Входные данные

Входные данные

\

Avalanche: итерация

Tracegrind

Трасса

Управляющий модуль

Трасса’

STP

Решение

Управляющий модуль

Входные данные

Covgrind

Метрики

Управляющий модуль

Управляющий модуль

Управляющий модуль

Входные данные Входные данные \ Avalanche: итерация Tracegrind Трасса Управляющий модуль Трасса’

Слайд 51

Управляющий модуль Avalanche

Координация работы других компонентов
Обход различных путей исполнения программы, инвертирование условий
Поддержка

Управляющий модуль Avalanche Координация работы других компонентов Обход различных путей исполнения программы,
параллельного и распределенного анализа

Слайд 52

Tracegrind

Отслеживает поток помеченных данных в программе
Все данные прочитанные из внешних источников (файлы,

Tracegrind Отслеживает поток помеченных данных в программе Все данные прочитанные из внешних
сетевые сокеты, аргументы коммандной строки, переменные окружения)
Переводит трассу выполнения в булевскую формулу (STP утверждения)

Слайд 53

Tracegrind

Моделирует оперативную память, регистры и временные переменные при помощи бит-векторов
Моделирует комманды при

Tracegrind Моделирует оперативную память, регистры и временные переменные при помощи бит-векторов Моделирует
помощи операций и утверждений STP

Слайд 54

Covgrind

Вычисление метрики покрытия кода программы (количество новых ББ покрытых на текущей итерации)
Перехват

Covgrind Вычисление метрики покрытия кода программы (количество новых ББ покрытых на текущей
сигналов (обнаружение критических ошибок)
Обнаружение ошибок работы с памятью при помощи Memcheck
Обнаружение бесконечных циклов при помощи таймаутов

Слайд 55

STP - Simple Theorem Prover

SAT решатель (основан на MiniSat)
Проект с открытым исходным

STP - Simple Theorem Prover SAT решатель (основан на MiniSat) Проект с
кодом
Поддерживает бит-векторы, широкий набор операций

Слайд 56

Проект

Опубликован на Google Code http://code.google.com/p/avalanche
Лицензии:
Valgrind и Memcheck - GPL v2
STP - MIT license
Драйвер

Проект Опубликован на Google Code http://code.google.com/p/avalanche Лицензии: Valgrind и Memcheck - GPL
Avalanche, Tracegrind, Covgrind - Apache license

Слайд 57

Avalanche: возможности

Поддержка клиентских сетевых сокетов
Поддержка переменных окружения и параметров коммандной строки
Поддержка платформ

Avalanche: возможности Поддержка клиентских сетевых сокетов Поддержка переменных окружения и параметров коммандной
х86/Linux и amd64/Linux, ARM/Linux, Android
Поддержка параллельного и распределенного анализа

Слайд 58

Результаты

Более 15-ти ошибок на проектах с открытым исходным кодом
Ошибки подтверждены и/или исправлены

Результаты Более 15-ти ошибок на проектах с открытым исходным кодом Ошибки подтверждены
разработчиками

Null Pointer Dereference (разуменование нулевого указателя) = NPD
Division By Zero (деление на ноль) = DBZ
Unhandled Exception (необработанная исключительная ситуация) = UE
Infinite Loop (бесконечный цикл) = IL

Слайд 59

Планы на будущее

Улучшение прозводительности
Поддержка новых источников входных данных (серверные сетевые сокеты, и

Планы на будущее Улучшение прозводительности Поддержка новых источников входных данных (серверные сетевые
т. д.)
Поддержка новых типов ошибок (многопоточные приложения)

Слайд 61

Случай тестирования отдельной функции:
Подобрать набор входных (тестовых) данных
Вычислить ожидаемый результат для каждого

Случай тестирования отдельной функции: Подобрать набор входных (тестовых) данных Вычислить ожидаемый результат
из тестовых данных А если это трудно или невозможно, например для функции random() ?
Запустить тест с каждым из тестовых данных, сопоставить результат с ожидаемым
Принять решение о продолжении или завершении тестирования А каков критерий завершения ?

Разработка теста по-простому

Слайд 62

Случай тестирования группы функции, класса/объекта, модуля с несколькими интерфейсами (обычно есть переменные

Случай тестирования группы функции, класса/объекта, модуля с несколькими интерфейсами (обычно есть переменные
состояния и побочный эффект):
Подобрать набор входных (тестовых) данных для каждой функции
Вычислить ожидаемый результат для каждого из тестовых данных Новая проблема – как учесть побочный эффект?
Вызвать каждую функцию с каждым из тестовых данных в различных состояниях модуля, сопоставить результат с ожидаемым Какие состояния считать различными, как прийти в нужное состояние (построить тестовую последовательность), если побочный эффект вычислить невозможно?
Принять решение о продолжении или завершении тестирования А каков критерий завершения ?

Разработка теста по-простому (2)

Слайд 63

Типичные размеры тестовых наборов

Ядро ОС Linux (LTP)
18 Mbyte (при этом покрывает менее

Типичные размеры тестовых наборов Ядро ОС Linux (LTP) 18 Mbyte (при этом
половины строк кода)
Библиотеки стандарта OS Linux (LSB)
Более 100 тысяч вариантов
Более 80 Mbyte
Для компилятора C (например, ACE или Perennial)
Более 40-80 тысяч вариантов
Более 1 Gbyte

Не удивительно, что на тестирование тратиться существенная доля усилий (в Майкрософте около 70%), а средняя плотность ошибок, которая считается приемлемой – 2-3 ошибки на 1 тысячу строк кода.

Слайд 64

Решения UniTESK

Исходная точка построения теста – формализация программного контракта в форме пред-

Решения UniTESK Исходная точка построения теста – формализация программного контракта в форме
и пост-условий
пред- и пост-условия определяют тестовые оракулы и критерии полноты покрытия
Тестовую последовательность конструировать не вручную, а на основе интерпретации модели теста
Нотации – максимально приближенные к языкам программирования

Слайд 65

Формализация требований

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

Формализация требований Выделение модельного состояния Описание формального контракта операций Предусловия – задают
задают основные ограничения на результаты работы операций
Инварианты – ограничения целостности данных, общая часть всех пред- и постусловий
Аксиоматическая часть контракта (если нужно)

Слайд 66

Простой пример спецификации в JavaTESK

public specification class SqrtSpecification {
public specification double

Простой пример спецификации в JavaTESK public specification class SqrtSpecification { public specification
sqrt(double x) {
pre { return x >= 0; }
post {
branch SingleCase;
return sqrt * sqrt == x;
}
public specification int sqrt(int x) {
pre { return x >= 0; }
post {
branch SingleCase;
return sqrt * sqrt <= x
&& (sqrt + 1) * (sqrt + 1 ) > x ;
}
}
}

Слайд 67

Общая схема тестирования

Тестовая система

Отчеты

Тестовые данные

Ожидаемые результаты, критерии полноты

Общая схема тестирования Тестовая система Отчеты Тестовые данные Ожидаемые результаты, критерии полноты

Слайд 68

Общая схема. Данные, оракул, покрытие

Пред-условия, итераторы

Пост-условия

Общая схема. Данные, оракул, покрытие Пред-условия, итераторы Пост-условия

Слайд 69

Общая схема. Тестовый сценарий

описать и обойти КА

обходить и строить КА

Общая схема. Тестовый сценарий описать и обойти КА обходить и строить КА
налету

Тестовая система

Отчеты

Тестовые данные

Ожидаемые результаты, критерии полноты

написать вручную

Варианты:

Слайд 70

Общая схема UniTESK

Модель состояния

Обходчик автоматов

Оракулы

Генератор

Итераторы данных

Метрика покрытия

Тестируемая система

Предусловия- фильтры

Постусловия





Общая схема UniTESK Модель состояния Обходчик автоматов Оракулы Генератор Итераторы данных Метрика



Оракул

Отчеты

Слайд 71

Применение UniTESK

Операционные системы
Ядро ОС телефонной станции 1994-1997
Linux Standard Base 2005-2010
Тестовый набор для ОС

Применение UniTESK Операционные системы Ядро ОС телефонной станции 1994-1997 Linux Standard Base
2000 (НИИСИ) 2005-...
Протоколы
IPv6 Microsoft Research 2000-2001
Мобильный IPv6 (в Windows CE 4.1) 2002-2003
IPv6 Октет 2002
Тестовый набор для IPsec 2004-2008
Тестовый набор для SMTP 2010
Оптимизаторы компиляторов Intel 2001-2003
Оптимизатор трансляции графических моделей 2005
Информационные системы
Компоненты CRM-системы 2004
Биллинговая система и EAI 2005-…
Микропроцессоры
Процессоры Комдив 64 (НИИСИ) 2006-...
Компоненты процессоров и шин (МЦСТ) 2010-...
Имя файла: Верификация-программного-обеспечения.-Текущее-состояние-и-проблемы.pptx
Количество просмотров: 276
Количество скачиваний: 4