300 likes | 463 Views
Корректность программ Классические и современные подходы. В. В. Кулямин Институт системного программирования РАН. Корректные программы. public int gcd ( int x, int y ) { int t; while( y != 0 ) { t = y; y = x % y ; x = t; } return ( x >= 0 )? x :- x; }.
E N D
Корректность программКлассические и современные подходы В. В. Кулямин Институт системного программирования РАН
Корректные программы public intgcd(int x, int y) { intt; while(y != 0) { t = y; y =x%y; x = t; } return (x >= 0)?x:-x; } gcd : int int int gcd(x,y) 0 gcd(x,y)|x gcd(x,y)|y z z|xz|yz|gcd(x,y) Спецификация
Ошибки и их причины Среднее количество ошибок на 1000 строк кода (до тестирования) Основная причина ошибок в ПО – его сложность
Риски, связанные с ошибками • Космические аппараты • Mariner I (1962) • Фобос-1 (1988) • Ariane 5 (1996) • Mars Climate Orbiter (1999) • Инфраструктура • AT&T long distance network crash (1990) • Northeast Blackout (2003) • OpenSSLrnd in Debian (2006-8) • Heathrow Airport Terminal 5 baggage system (2008) • Банковские карты Gemalt (2010) • Автомобили • Toyota Prius (2005, 2010) • Медицинское оборудование • Therac-25 (1985-7) • Medtronic Maximo (2008) • Авионика и военное оборудование • Lockheed F-117 (1982) • MIM-104 Patriot (1991) • Chinook ZD576 (1994) • USS Yorktown (1997) • F-22 Raptor (2007)
Что делать? • Не делать ошибок – Невозможно из-за сложности • Предотвращение ошибок – Тщательный анализ требований и возможных решений – Изоляция компонентов – Повышение уровня абстракции языков – Устранение error-prone конструкций – Стандартизация и документирование языков, библиотек, протоколов – Улучшение сопровождаемости, использование образцов, • Выявление ошибок – Анализ свойств ПО – Контроль качества ПО
Контроль качества ПО • Экспертиза (review, inspection) • Статический анализ • Проверка правил корректности • Поиск конкретных ошибок по шаблонам • Динамический анализ • Мониторинг • Тестирование • Формальная верификация • Дедуктивный анализ • Проверка моделей • Гибридные методы
Статика и динамика • Статический анализ • Динамический анализ Инструмент анализа Требования Исходный код Работа системы Требования Среда мониторинга Пользователи Создание тестов
Формальная верификация • Дедуктивный анализ [R. Floyd 1967, C. A. R. Hoare 1969] • Логика Хоара – {Pre} Program {Post} • Правила вывода • Проверка моделей[E. M. Clarke & E. A. Emerson 1980, J. P. Queille & J. Sifakis 1982] • Анализ достижимых состояний
Гибридные методы Интегрируют элементы различных подходов • Тестирование на основе моделей • Расширенный статический анализ • Формальный мониторинг • Синтетическое структурное тестирование Вспомогательные техники • Символическое исполнение • Абстрактная интерпретация • Вывод ограничений • Разрешение ограничений • Автоматическое уточнение моделей
Тестирование на основе моделей Контроль тщательности Генератор воздействий 12% 36% 87% 57% Критерий полноты Метрика полноты Тестируемая система Модель поведения Оракул Контроль корректности
Пример: описание теста @Testpublic class AccountTest { Account account; @State public int getBalance() { return account.getBalance(); } @Test @DataProvider(name = "sums")@Guard(name = "bound“) public void testDeposit(int x){ account.deposit(x); } @Test @DataProvider(name = "sums") public void testWithdraw(int x){ account.withdraw(x); } public boolean bound(){return getBalance() < 500;} public int[] sums = new int[]{0, 1, 2, 5}; }
Синтетическое тестирование DART [P. Godefroid, G. Agha, K. Sen 2005] Исполнение Программа Поиск новых путей Символическое исполнение Тесты
Пример работы DART intunknown_f(intx0, intx1){ if(x0 == 0)return x1; if(x1 == 0)returnx0; if(x0>0 &&x1<0 ||x0<0 &&x1>0)x1 = -x1; while(x1!= 0){ if(x1>x0&&x0>0 ||x1<x0&&x0<0) { x0 = x1-x0; x1 = x1-x0; x0 = x0+x1; } x1 = x0-x1; x0 = x0-x1; } returnx0; } x0 x1 Ограничение 0 0 x0 == 0 1 0 !(x0 = 0) && x1 == 0 1 1 !(x0 = 0) && !(x1 == 0) && !(x0>0 && x1<0 || x0<0 && x1>0) && !(x1>x0 && x0>0 || x1<x0 && x0<0) 1 5 !(x0 = 0) && !(x1 == 0) && !(x0>0 && x1<0 || x0<0 && x1>0) && (x1>x0 && x0 >0 || x1<x0 && x0 < 0) x1' = 0 x0' = 1
Работы отдела технологий программирования • Разработка тестов и тестирование • Информационная система оператора связи • Операционные системы реального времени • Базовые библиотеки ОС (POSIX, LSB) • Протоколы IPv6, Mobile IPv6, IPsec • Микропроцессоры архитектуры MIPS • Система аварийной эвакуации пилота • Компоненты компиляторов Intel, JDK, DOM API • Технологии и инструменты • Тестирование на основе моделей (UniTESK) • Проверка соответствия стандарту LSB • Верификация драйверов Linux • Инструменты работы с требованиями • Инструменты проектирования и конфигурирования авионики
Спасибо за внимание! Вопросы? http://sp.cmc.msu.ru/specsem/vvp/ http://www.linuxtesting.ru/ http://www.unitesk.ru/ http://hardware.ispras.ru/ http://www.ispras.ru/~petrenko/ petrenko@ispras.ru http://www.ispras.ru/~kuliamin/ kuliamin@ispras.ru
Общие книги по тестированию • B. Beizer. Software Testing Techniques. Thomson Computer Press, 1990 • R. Binder. Testing Object-Oriented Systems: Models, Patterns, and Tools. Addison-Wesley, 2000 • P. Ammann, J. Offutt. Introduction to software testing. Cambridge University Press, 2008.
Книги на русском языке • Г. Майерс. Искусство тестирования программ. Финансы и статистика, 1982 • Д. Месарош. Шаблоны тестирования xUnit. Рефакторинг кода тестов. Вильямс, 2009 • Курс лекций http://mbt-course.narod.ru
Модульное тестирование • J.B.Rainsberger. JUnit Recipes. Practical Methods for Programmer Testing. Manning, 2005 • C. Beust, H. Suleiman. Next Generation Java Testing. TestNG and Advanced Concepts. Addison-Wesley, 2007
Тестирование на базе моделей • M. Utting, B. Legeard. Practical Model-Based Testing. A Tools Approach. Morgan Kaufmann, 2006 • J. Jacky, M. Veanes, C. Campbell, W. Schulte. Model Based Analysis and Testing with C#. Cambridge University Press, 2007
Теория тестирования • M. Broy, B. Jonsson, J.-P. Katoen, M. Leucker, A. Pretschner, editors. Model Based Testing of Reactive Systems. Advanced Lectures. LNCS 3472, Springer, 2005