Upload
codefest
View
985
Download
1
Embed Size (px)
DESCRIPTION
Citation preview
11
Вы еще просто тестируете?Тогда мы едем к вам!
Использование статического анализа при тестировании програмных продуктов
Новосибирск, 19 марта 2011. Дмитрий Петунин
22
• Статический анализ и безопасность.
• Что делать, если ваш диагноз ложно-позитивный?
• Я, ты, он, она ... Кто?• Этот безопасный мир
безопасного ПО.
Темы для размышления
33
Анализ корректности работы программы без ее исполнения– Для любых значений переменных– Для произвольных входных данных– Анализируются все возможные пути исполнения
Статический анализ
Статический анализ наиболее подходящая технология
для анализа безопасности программ
44
Классика жанра
if ( !var ) {error(“Invalid variable”, var-
>name);}
55
Ба! Знакомые все лица!
Переполнение буфера Неинициализированные
переменные Некорректная работа с
указателями Ошибки работы с
динамической памятью Ошибки работы со
строками Использование
пользовательских данных без верификации
Ошибки форматов Противоречивые
объявления Недостижимый код Деление на 0 Неэффективное/опасное
использование С++ Ошибки
распараллеливния Некорректное
использование API
66
• Время анализа 1-5х времени построения продукта
• Отсутствует потребность в тестах • Идентифицируются не только актуальные
проблемы, но и потенциальные• Можно использовать для неполной
программы• Верифицируются все элементы программы,
в том числе и те, которые сложно проверить с помощью тестов
• Найденные ошибки легко исправить
Невозможно не любить
77
Меньше знаешь – крепче спишь?
Мощность анализа
Минимум ложной диагностики
Скорость работы
Каждый статический анализатор находит свой оптимум из трех параметров
88
Зависимости между значениями
Источники ложнопозитивных сообщений
double foo(int x, int y) { return 1 / (x - y);}
int main() { printf("%f\n", foo(6, 3)); printf("%f\n", foo(3, 0)); return 0;}
Возможное деление на 0
Несуществующие пути исполненияdouble foo(int x, int y) { return 1 / (x - y);}
int main() { printf("%f\n", foo(6, 3)); printf("%f\n", foo(3, 0)); return 0;}
Возможное деление на 0
int flag;
void doo(int *var) { if (flag == 1) *var = 1;}
void foo() {int var;
doo(&var); if (flag == 1) printf("%d\n", var);}
Неинициализированное значение var
99
Эффективность QA процессов во времени
Запуск процесса
Эффективность статического анализа и regression тестирования не снижаются со временем
1010
Уровни использования статического анализа
Компонента
Mainline
Продукт
Разработчик
Финальная валидация продуктаБольшие расходы на коммуникациюНет выявления потенциальных проблем
Существенные ресурсы QA на анализПовышенные расходы на коммуникацию
Экономия на количестве запусковИдентификация проблем дизайнаБаланс тестирование / cтат. анализ
Меньше 5% времени разработчикаИдентификация грубых ошибок Максимальное понимание проблем
Эффективность анализа диагностики и процессные расходы возрастают, потребность в HW ресурсах уменьшается
1111
• Оценка уровня проекта по шкале безопасности
• Наличие инженера безопасности• Треннинги для персонала• Наборы политик безопасности для каждого
уровня • Применение инструментов обеспечения
безопасности (статический анализ, …)• Процесс управления изменениями
(безопасность)• Команда верификации безопасности ПО• План действий в случае обнаружения
проблеммы безопасности в вашем ПО
Требования к процессу безопасной разработки ПО
Статический анализ является необходимым элементом процесса
1212
Положительный настройВаши друзья - разработчики, которые неравнодушны к качеству кода приложения.
Экономия времени на внедрениеПервоначальный анализ доверьте разработчикам – сделают быстро, найдут дизайн проблемы.
Анализируйте только новые диагностикиЭффективно используйте подавление нежелательной диагностики.
Рекомендации по внедрению статического анализа
1313
Если вы все еще просто тестируете – пора попробовать статический анализ.
1414
Спасибо за внимание!
1515
Optimization Notice
Optimization Notice
Intel® compilers, associated libraries and associated development tools may include or utilize options that optimize for instruction sets that are available in both Intel® and non-Intel microprocessors (for example SIMD instruction sets), but do not optimize equally for non-Intel microprocessors. In addition, certain compiler options for Intel compilers, including some that are not specific to Intel micro-architecture, are reserved for Intel microprocessors. For a detailed description of Intel compiler options, including the instruction sets and specific microprocessors they implicate, please refer to the “Intel® Compiler User and Reference Guides” under “Compiler Options." Many library routines that are part of Intel® compiler products are more highly optimized for Intel microprocessors than for other microprocessors. While the compilers and libraries in Intel® compiler products offer optimizations for both Intel and Intel-compatible microprocessors, depending on the options you select, your code and other factors, you likely will get extra performance on Intel microprocessors.
Intel® compilers, associated libraries and associated development tools may or may not optimize to the same degree for non-Intel microprocessors for optimizations that are not unique to Intel microprocessors. These optimizations include Intel® Streaming SIMD Extensions 2 (Intel® SSE2), Intel® Streaming SIMD Extensions 3 (Intel® SSE3), and Supplemental Streaming SIMD Extensions 3 (Intel® SSSE3) instruction sets and other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any optimization on microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended for use with Intel microprocessors.
While Intel believes our compilers and libraries are excellent choices to assist in obtaining the best performance on Intel® and non-Intel microprocessors, Intel recommends that you evaluate other compilers and libraries to determine which best meet your requirements. We hope to win your business by striving to offer the best performance of any compiler or library; please let us know if you find we do not.
Notice revision #20101101
1616
Юридическая информация• Материалы, размещенные в данной презентации (далее по тексту — "материалы"), предоставлены корпорацией Intel (далее по
тексту — "Intel") в качестве услуги потребителям, потенциальным потребителям ее продукции и потенциальным клиентам исключительно в информативных целях.
• Обозначения BunnyPeople, Celeron, Celeron Inside, Centrino, логотип Centrino, Core Inside, Dialogic, FlashFile, i960, InstantIP, Intel, логотип Intel, Intel386, Intel486, Intel740, IntelDX2, IntelDX4, IntelSX2, Intel Core, Intel Inside, логотип Intel Inside, Intel. Leap ahead., логотип Intel. Leap ahead., Intel NetBurst, Intel NetMerge, Intel NetStructure, Intel SingleDriver, Intel SpeedStep, Intel StrataFlash, Intel Viiv, Intel vPro, Intel XScale, IPLink, Itanium, Itanium Inside, MCS, MMX, Oplus, OverDrive, PDCharm, Pentium, Pentium Inside, skoool, Sound Mark, The Journey Inside, VTune, Xeon и Xeon Inside являются товарными знаками, либо зарегистрированными товарными знаками, права на которые принадлежат корпорации Intel или ее подразделениям на территории США и других стран.
• Публичное использование товарных знаков и фирменной символики Intel допускается исключительно с разрешения корпорации Intel. Добросовестное использование товарных знаков и фирменной символики Intel с целью рекламы и продвижения продукции корпорации Intel предполагает официальное уведомление в установленном порядке.
• *Другие наименования и товарные знаки являются собственностью своих законных владельцев.• Copyright © 2011 Intel Corporation. Данные материалы охраняются авторским правом и защищены нормами международного
законодательства об охране авторских прав и соответствующих международных соглашений. Без предварительного письменного согласия корпорации Intel не допускается их копирование, воспроизведение, внесение в них изменений, публикация, загрузка, размещение их в Интернете, пересылка или распространение любыми способами. Если данным документом недвусмысленно не предусмотрено иное, корпорация Intel и ее поставщики не предоставляют пользователю каких-либо прав собственности, как явных, так и подразумеваемых, в отношении каких-либо патентов, авторских прав, товарных знаков или сведений, составляющих коммерческую тайну. Иные права могут быть предоставлены Вам корпорацией Intel либо в письменной форме, либо путем внесения соответствующих положений в документацию, сопровождающую материалы.
• МАТЕРИАЛЫ ПРЕДОСТАВЛЯЮТСЯ ПО ПРИНЦИПУ "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ ГАРАНТИЙ, ВКЛЮЧАЯ, В ЧИСЛЕ ПРОЧЕГО, ГАРАНТИЙ В ОТНОШЕНИИ ИХ РЫНОЧНЫХ КАЧЕСТВ, НЕНАРУШЕНИЯ ПРАВ НА ИНТЕЛЛЕКТУАЛЬНУЮ СОБСТВЕННОСТЬ ИЛИ ПРИГОДНОСТИ К ИСПОЛЬЗОВАНИЮ В ТЕХ ИЛИ ИНЫХ КОНКРЕТНЫХ ЦЕЛЯХ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ КОРПОРАЦИЯ INTEL ИЛИ ЕЕ ПОСТАВЩИКИ НЕ НЕСУТ КАКОЙ-ЛИБО ОТВЕТСТВЕННОСТИ ЗА УЩЕРБ (ВКЛЮЧАЯ, В ЧИСЛЕ ПРОЧЕГО, УПУЩЕННУЮ ВЫГОДУ, ПОСЛЕДСТВИЯ ПРИОСТАНОВКИ ПРЕДПРИНИМАТЕЛЬСКОЙ ДЕЯТЕЛЬНОСТИ ИЛИ ПОТЕРЮ ДАННЫХ), ВЫТЕКАЮЩИЙ ИЗ ФАКТА ИСПОЛЬЗОВАНИЯ МАТЕРИАЛОВ, ЛИБО НЕВОЗМОЖНОСТИ ИХ ИСПОЛЬЗОВАТЬ, ЧТО РАСПРОСТРАНЯЕТСЯ И НА ТЕ СЛУЧАИ, КОГДА КОРПОРАЦИЯ INTEL БЫЛА ПРЕДУПРЕЖДЕНА О ВОЗМОЖНОСТИ НАНЕСЕНИЯ ТАКОГО УЩЕРБА. УЧИТЫВАЯ, ЧТО ЗАКОНОДАТЕЛЬСТВО, ДЕЙСТВУЮЩЕЕ В РЯДЕ ЮРИСДИКЦИЙ, НЕ ДОПУСКАЕТ ОГРАНИЧЕНИЯ ИЛИ ОТКАЗА ОТ ОТВЕТСТВЕННОСТИ ЗА ПОБОЧНЫЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЗЛОЖЕННОЕ ВЫШЕ ПОЛОЖЕНИЕ МОЖЕТ К ВАМ НЕ ОТНОСИТЬСЯ. Корпорация Intel и ее поставщики не гарантируют точности или полноты текстовой или графической информации, ссылок и иного содержания материалов. Корпорация Intel вправе в любое время и без предварительного уведомления вносить любые изменения в указанные материалы, а равно и в продукцию, описанием которой они служат. Корпорация Intel не берет на себя каких-либо обязательств по обновлению материалов.
1717
Бонус трэк
1818
char lname[FILENAME_MAX]; for (icount = 0; icount < FILENAME_MAX; icount++) { lname[icount] = name[icount]; if ((lname[icount]) == ':') { lname[icount+1] = 0; break; } }
banner.c(212): Buffer overflow: array index of "lname" is possibly outside the bounds; array "lname" of size (0:259) can be indexed by value 260
1919
Example (Tachyon)
static void grid_free(void * v) { ... for (i=0; i<numvoxels; i++) { ... while (lcur != NULL) { lnext = lcur->next; free(lcur); } } ...}
grid.cpp(131): error #12082: infinite loop
2020
Example (Notepad++)
} catch (...) { TCHAR funcInfo[128]; generic_sprintf(funcInfo, TEXT("notify(SCNotification *notification) : \r notification->nmhdr.code == %d\r notification- >nmhdr.hwndFrom == %d\r notification->nmhdr.idFrom == %d"),\ scNotif.nmhdr.code, scNotif.nmhdr.hwndFrom, scNotif.nmhdr.idFrom); ...}
PluginsManager.cpp(421): error #12224: buffer overflow: size of object "funcInfo" (128 bytes) is less than required size (139 bytes)
2121
Conditional paths
int flag;
void doo(int *var){ if (flag == 1) *var = 1;}
void foo(){
int var; doo(&var); if (flag == 1) printf("%d\n", var);}
Diagnostics is not reported
int flag1, flag2;
void test(){
int var;
if (flag1 && flag2) var = 1;
if (flag1 && flag2) printf("%d\n",
var);
if (flag1) printf("%d\n",
var);}
Diagnostics is reported in second case