CodeFest 2011. Петунин Д. — Использование инструментов статического анализа при отладке и верификации безопасности ПО
1. Вы еще просто тестируете? Тогда мы едем к вам! Использование статического анализа при тестировании програмных продуктов Новосибирск, 19 марта 2011. Дмитрий Петунин
2. Статический анализ и безопасность. Что делать, если ваш диагноз ложно-позитивный? Я, ты, он, она ... Кто? Этот безопасный мир безопасного ПО. Темы для размышления
3. Анализ корректности работы программы без ее исполнения Для любых значений переменных Для произвольных входных данных Анализируются все возможные пути исполнения Статический анализ Статический анализ наиболее подходящая технология для анализа безопасности программ
18. Меньше знаешь – крепче спишь? Мощность анализа Минимум ложной диагностики Скорость работы Каждый статический анализатор находит свой оптимум из трех параметров
19. Зависимости между значениями Источники ложнопозитивных сообщений Несуществующие пути исполнения int flag; void doo(int *var) { if (flag == 1) *var = 1; } void foo() { intvar; doo(&var); if (flag == 1) printf("%d", var); } Неинициализированное значение var double foo(int x, int y) { return 1 / (x - y); } int main() { printf("%f", foo(6, 3)); printf("%f", foo(3, 0)); return 0; } Возможное деление на 0 double foo(int x, int y) { return 1 / (x - y); } int main() { printf("%f", foo(6, 3)); printf("%f", foo(3, 0)); return 0; } Возможное деление на 0
20. Эффективность QAпроцессов во времени Запуск процесса Эффективность статического анализа и regression тестирования не снижаются со временем
21. Уровни использования статического анализа Меньше 5% времени разработчика Идентификация грубых ошибок Максимальное понимание проблем Разработчик Экономия на количестве запусков Идентификация проблем дизайна Баланс тестирование /cтат. анализ Компонента Существенные ресурсы QA на анализ Повышенные расходы на коммуникацию Mainline Финальная валидация продукта Большие расходы на коммуникацию Нет выявления потенциальных проблем Продукт Эффективность анализа диагностики и процессные расходы возрастают, потребность в HW ресурсах уменьшается
22. Оценка уровня проекта по шкале безопасности Наличие инженера безопасности Треннинги для персонала Наборы политик безопасности для каждого уровня Применение инструментов обеспечения безопасности (статический анализ, …) Процесс управления изменениями (безопасность) Команда верификации безопасности ПО План действий в случае обнаружения проблеммы безопасности в вашем ПО Требования к процессу безопасной разработки ПО Статический анализ является необходимым элементом процесса
23. Положительный настрой Ваши друзья - разработчики, которые неравнодушны к качеству кода приложения. Экономия времени на внедрение Первоначальный анализ доверьте разработчикам – сделают быстро, найдут дизайн проблемы. Анализируйте только новые диагностики Эффективно используйте подавление нежелательной диагностики. Рекомендации по внедрению статического анализа
24. Если вы все еще просто тестируете – пора попробовать статический анализ.
28. Обозначения 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 или ее подразделениям на территории США и других стран.
29. Публичное использование товарных знаков и фирменной символики Intel допускается исключительно с разрешения корпорации Intel. Добросовестное использование товарных знаков и фирменной символики Intel с целью рекламы и продвижения продукции корпорации Intel предполагает официальное уведомление в установленном порядке.
30. *Другие наименования и товарные знаки являются собственностью своих законных владельцев.
33. 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
35. Example (Notepad++) } catch (...) { TCHAR funcInfo[128]; generic_sprintf(funcInfo, TEXT("notify(SCNotification *notification) : notification->nmhdr.code == %d notification- >nmhdr.hwndFrom == %d notification->nmhdr.idFrom == %d"),br /> 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)
36. Conditional paths int flag; void doo(int *var) { if (flag == 1) *var = 1; } void foo() { int var; doo(&var); if (flag == 1) printf("%d", var); } Diagnostics is not reported int flag1, flag2; void test() { int var; if (flag1 && flag2) var = 1; if (flag1 && flag2) printf("%d", var); if (flag1) printf("%d", var); } Diagnostics is reported in second case