240 likes | 381 Views
Ускорение направленного тестирования ПО путем учета потока данных при ограничении вариативности траекторий выполнения. А. С. Щербаков ЗАО «Интел А / О». Содержание. Обзор базового алгоритма тестирования - DART Первичные и повторные обходы путей З ависимости данных в планировании путей
E N D
Ускорение направленного тестирования ПО путем учета потока данных при ограничении вариативности траекторий выполнения А. С. Щербаков ЗАО «Интел А/О»
Содержание • Обзор базового алгоритма тестирования - DART • Первичные и повторные обходы путей • Зависимости данных в планировании путей • Комбинирование стратегий и приоритизация • Сбор зависимостей данных • Учет использований данных • Проблема недостижимых путей • Замечания по деталям реализации алгоритма • Результаты • Заключение
Пример DART. Тестируемый код voidf (intx, inty) { if (x > y) { x = x + y; y = x – y – 3; x = x – y; } x = x – 1; if (x > y) { abort (); } } • intmain () { • constintx = choose_int ("x"); • constinty = choose_int ("y"); • f (x, y); • return 0; • } • Процедуры системы тестирования
Пример DART. Шаг 1 x = 0 y = 0 x < y нет x1= x – 1; =-1 нет x1 > y
Пример DART. Шаг 2 нет решения x < y нет x1= x – 1; недостижимый путь да x1 > y
Пример DART. Шаг 3 x = 0 y = 1 x < y да =1 x1= x + y; y1 =x1 – y; x2 =x1 – y1 – 3; x3 = x2 – 1; x1= x – 1; =0 =-2 =-3 x1 > y x3 > y1 нет
Пример DART. Шаг 4 x = 0 y = 9 x < y да =9 x1= x + y; y1 =x1 – y; x2 =x1 – y1 – 3; x3 = x2 – 1; x1= x – 1; =0 =6 =5 x1 > y x3 > y1 да Ошибка
Философское замечание • В отличие от большинства методов статического анализа, оперирующих конструкциями кода и его графом управления, в нашем подходе мы большей частью рассматриваем выполнение программы как блуждание по тропкам леса в поисках волшебного зверябага в программе
Первичные обходы vs. повторные • Первичный обход ветви – первое в прогоне набора тестов “срабатывание” соответствующего условия перехода с передачей управления на данную ветвь. • Реализуется в первую очередь, т.к. приводит к росту покрытия • Nперв~ N условий • Повторныеобходы в различных комбинациях дают разнообразные пути присваиваний переменных, в результате могут быть созданы условия для новых первичных переходов • Nповт~ exp(N условий) • В среднем, количество обнаруженных ошибок приблизительно пропорционально покрытию кода.
Ограничение повторных обходов • Идея ограничения повторных обходов:Чтобы обнаружить баг, вероятно, достаточно изменить направление лишь небольшого числа условных переходов в случайном прогоне теста • Новые присвоения данных – естественный индикатор интереса к повторным обходам.. • Строгое соответствие Зависимость данных – повторные обходы не всегда эффективно: <<<Комбинаций присваиваний может быть (экспоненциально) много >>>Зависимость данных не всегда “видна”: массивы, динамические ссылки, black boхеs, волатильность, гонки..
Комбинирование стратегий штраф • Решение: мягкое регулируемое ограничение повторных обходов в зависимости от числа обнаруженных зависимостей от новых присваиваний • приоритизационный алгоритм
Сбор зависимостей данных Стек ПВП • Для каждой значимой комбинации внутренних переменных аккумулируется: • Множество использующих условий и участков кода • Таблицу записей (хеш стека присваиваний + номер участка) для обнаруженных присваиваний {v1,v2,v3} Использов. C2 L5 Присваив. C4 H1 C4 H2 C7 H3
Учет использований • Необходимо знать использования переменных в произвольном конусе! • Обход CFG ? • сложность ~ Nузлов на каждое принятие решения • Хранение копий для узлов ? • память ~ N2 узлов • Отказ от учета использований ? • Допустим в сочетании с ограничением числа повторных обходов ветвейпри “быстром” тестировании
Оптимизация учета • Ограничение числа учитываемых используемых переменных в узле.. • Как правило, если в конусе используются многие переменные, то и вероятность использования произвольной переменной велика • Хеширование • Вносит вероятность избыточного тестирования, но кардинально снижает расходы
Хеширование использований 0001 0010 0100 0100 0110 1000 1101 0001 1111
Эффект маскирования путей if (x) print(“x=true”); //неважно.. else • print (“x=false”); //неважно.. x = F x = T if ((x &v) | y) a = 1; else a = 3; @ v=T, w=F, y= F if ((x &w) | y) a = a * 2; else a = a * 5; a = 15 a = 2 a = 5
Эффект маскирования: учет • К счастью, мы явно знаем неудовлетворенные условия и можем проверить их еще раз с новым префиксом • Список таких условий может быть велик, а вероятность успеха мала.. • Оптимизация: Рассматривать пересечение текущего условия со всеми условиями суффикса, повторно проверять только в случае возможной импликации • При ограничении сложности рассмотрения логических форм, эффективно таргетирует повторные проверки неудовлетворенных путей суффикса
Альтернативыучета маскирования • Обход с ограничением комбинаций (Realernation limit) даже при отсутствии зависимостей данных • Вероятность покрытия невелика • Особое рассмотрение для“гамаков” • “гамаки”могут содержать дополнительные условия выхода/обхода • “Ожидание” “гамака”. Рассмотрение ослабленного условия префикса • Множество новых комбинаций, увеличенное время теста, память
«Разворачивание» циклов i>j i>j z=z+1 x=i+1 i>j z=z+1 for (inti=0; i<=j; i++) { x=i+1; z++; print (x); } i>j
“Перекрестные” использования • Использование приоритетов →порядок обходов отличен от DFS • Учитываем динамическое добавление использований из конкурирующих прогонов
Результаты • Метод применялся , в частности, при отладке аппаратно-программного комплекса для тестирования готовых кристаллов процессоров. • Быстрое тестирование с числом чередований условий переходов более 30, нахождение ошибок с вероятностью более 99% в примерах Firmware имодульных тестов • Высокая эффективность при выявления ошибок в программах тестирования СБИС, встроенном ПО и программах обработки текста на уровне регулярных выражений. • Для сложных арифметико-логических устройств предпочтительнее специализированные алгоритмы, не использующие перебор путей
Заключение • DART - универсальным метод тестирования ПО для СБИС • Мощность решателей (SMT solvers)стремительно растет. • Все же требуется кардинальное сокращение обходов комбинаций ветвлений. • Комбинация ограничения повторных обходов с учетом зависимости данных являетсяумеренно ресурсоемкой, но эффективной стратегией быстрого достижения покрытия теста и выявления ошибок • Алгоритм легко интегрируется с различными эвристиками, ограничивающими число тестов