SlideShare a Scribd company logo
1 of 27
Основы и применение 
статического анализа кода при 
разработке ПО 
Дмитрий Русаков
Когда-то давно 
Программист Продукт
В начале 80-ых 
Программист 
Продукт 
Менеджер
В начале 90-х 
Программист 
Менеджер Продукт 
Тестировщик
Современность 
Программист 
Менеджер Продукт 
Тестировщик
Качество ПО 
• Каждому требуется своё. ПО, работающее на изолированном компьютере, и веб-сайт правительства 
• Целостность 
• Доступность 
• С усложнением инфраструктуры усложнились требования к качеству ПО. Теперь не достаточно выполнять 
свои функции правильно, необходимо учитывать возможные нападения. 
• Принципиальная невозможность добиться абсолютно правильной программы: машина Тьюринга, 
Microsoft. 
• Целостность 
• Доступность 
• Конфиденциальность
Факторы, влияющие на уязвимость ПО 
• Ошибки программирования (переполнение буфера), 
• Ошибки архитектуры (хранение пароля администратора на компьютере пользователя, реализация 
контроля доступа на стороне клиента), 
• Некорректное применение (использование для разграничения доступа программы, в которой нет 
аутентификации), 
• Некорректные настройки (отсутствие запрета модификации настроек безопасности для пользователя), 
• и т.д.
Тестирование 
• С виду наиболее простой подход. 
• Позволяет контролировать качество вариантов использования, пришедших в голову тестировщику. 
• Наиболее проработанный и везде применяемых подход (функциональное тестирование, нагрузочное 
тестирование, регрессионное тестирование, Unit Test). 
• Сложность проведения качественного тестирования
Ревизия 
• Трудоёмкость 
• Требует определения целей
Типизированные языки программирования 
и контроль времени компиляции 
• Позволяет выявлять наиболее простые «опечатки» программиста. 
• Метод быстрой разработки: недостатки.
Встраивание проверок и ограничений в код, 
использование "безопасных" функций и языков 
высокого уровня 
• Встраивание проверок и ограничений позволяет выявлять проблемы во время исполнения и 
реагировать на них (контроль переполнения буфера в Visual С++). 
• Использование «безопасных» функций позволяет избежать типичных ошибок программирования 
• char * strcpy ( char * destination, const char * source ); 
• char * strncpy ( char * destination, const char * source, size_t num ); 
№3 в Top 25 CWE: «Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')» 
• Языки высокого уровня позволяют детальнее продумывать архитектуру, не заботясь о деталях 
реализации.
Доказательство правильности свойств 
программ 
• Минус: возможность работы только с небольшими программами 
• Требуется высокая компетенция экспертов 
• Формальное доказательство 
• Model Checking 
• Pi-calculus
Статический анализ 
• Выявление «нехитрых» ошибок 
• Значительное количество ложных срабатываний
Исполнение в виртуальной среде 
• Песочницы
Статический анализ кода 
• Анализ, проводимый путём исследования исходных текстов или исполняемых файлов БЕЗ запуска кода. 
• Автоматическое выявление возможных уязвимостей кода БЕЗ исполнения кода. 
• Статический анализ показывает на возможный недочёт. 
• do {} while true; 
• char *p, *k; 
• p=k; 
• *k=10; 
• If ( p ) {};
Лексический контроль заданных правил 
• Фактически – применение регулярных выражений. 
• k = j/0; 
• i = 0; 
• … 
• k = j/i; 
• Сообщения компиляторов 
• Большинство (простейшие) утилиты поиска недостатков кода 
• Утилиты проверки правил оформления кода
Анализ программы без учета потока 
управления 
• Прямой обход результатов лексического, синтаксического или семантического разбора. 
• i = 0; 
• … 
• k = j/i; 
• Не используемые переменные, «устаревшие» функции, 
• Сообщения умных компиляторов 
• Lint 
• CppCheck
Анализ программ с учётом потока 
управления 
• Прямой обход результатов лексического, синтаксического или семантического разбора. 
• i = 0; 
• … 
• k = j/i; 
• Использование переменной до присвоения ей значения, недостижимый код 
• Klockwork, Coverity, VivaCore 
• Pvs-studio
Анализ аннотированного кода 
• Аннотирование кода позволяет упростить работу алгоритма 
• int readData( __out_bcount_part( maxLength, *length ) void *buffer, const int maxLength, int *length ); 
• Visual Studio (PreFast)
Примеры результатов PVS-studio 
• There are identical sub-expressions 'height <= 0' to the left and to the right of the '||' operator. 
• if (width <= 0 || height <= 0 || !data 
• || INT_MAX/sizeof(uchar *) < uint(height) 
• || INT_MAX/uint(depth) < uint(width) 
• || bpl <= 0 
• || height <= 0 
• || bpl < min_bytes_per_line 
• || INT_MAX/uint(bpl) < uint(height)) 
• return d; 
• This is a nonsensical comparison: pointer >= 0. 
• MessageItem *ContextItem::findMessage(const QString &sourcetext, const QString &comment) const 
• if (c->findMessage(m->text(), m->comment()) >= 0)
Примеры результатов PVS-studio 
• The 'throw' operator inside the destructor should be placed within the try..catch block. Raising exception inside 
the destructor is illegal. 
• # define QT_RETHROW throw 
• QObject::~QObject() 
• { 
• if (d->isSignalConnected(0)) { 
• QT_TRY { 
• emit destroyed(this); 
• } QT_CATCH(...) { 
• // all the signal/slots connections are still in place - if we don't 
• // quit now, we will crash pretty soon. 
• qWarning("Detected an unexpected exception in ~QObject while emitting destroyed()."); 
• QT_RETHROW; 
• } 
• } 
• }
Примеры результатов PVS-studio 
• Pointer to local variable 'tmp' is stored outside the scope of this variable. Such a pointer will become invalid. 
• 
• QList<QGraphicsItem *> QGraphicsSceneBspTree::items(const QRectF &rect, bool onlyTopLevelItems) const 
• { 
• QList<QGraphicsItem *> tmp; 
• findVisitor->foundItems = &tmp; 
• findVisitor->onlyTopLevelItems = onlyTopLevelItems; 
• climbTree(findVisitor, rect); 
• // Reset discovery bits. 
• for (int i = 0; i < tmp.size(); ++i) 
• tmp.at(i)->d_ptr->itemDiscovered = 0; 
• return tmp; 
• }
Примеры результатов PVS-studio 
• Pointer to local variable 'tmp' is stored outside the scope of this variable. Such a pointer will become invalid. 
• 
• QList<QGraphicsItem *> QGraphicsSceneBspTree::items(const QRectF &rect, bool onlyTopLevelItems) const 
• { 
• QList<QGraphicsItem *> tmp; 
• findVisitor->foundItems = &tmp; 
• findVisitor->onlyTopLevelItems = onlyTopLevelItems; 
• climbTree(findVisitor, rect); 
• // Reset discovery bits. 
• for (int i = 0; i < tmp.size(); ++i) 
• tmp.at(i)->d_ptr->itemDiscovered = 0; 
• return tmp; 
• }
Примеры результатов CppCheck 
• (error) Uninitialized variable: cc 
int wfp_dispatch(wfp *p, int cnt, wfp_handler callback, u_char *user) 
{ 
int cc; 
if (p->cc == 0) 
{ 
cc = p->packet->ulBytesReceived; 
} 
else 
bp = p->bp; 
#define bhp ((wfp_hdr *)bp) 
ep = bp + cc; 
}
Примеры результатов CppCheck 
• (error) Uninitialized variable: cc 
int wfp_dispatch(wfp *p, int cnt, wfp_handler callback, u_char *user) 
{ 
int cc; 
if (p->cc == 0) 
{ 
cc = p->packet->ulBytesReceived; 
} 
else 
bp = p->bp; 
#define bhp ((wfp_hdr *)bp) 
ep = bp + cc; 
}
Примеры результатов CppCheck 
• (error) Mismatching allocation and deallocation: reason 
if (m_minorVerNum >= 8) { 
StringStorage errorMessage(e.getMessage()); 
size_t reasonLen = errorMessage.getLength(); 
char *reason = new char[reasonLen + 1]; 
try { 
if (errorMessage.toAnsiString(reason, reasonLen + 1)) { 
m_output->writeUInt32(1); 
m_output->writeUInt32(reasonLen); 
m_output->writeFully(reason, reasonLen); 
} 
} catch (...) { 
delete reason; 
throw; 
} 
delete reason; 
}
Примеры результатов CppCheck 
• (error) Mismatching allocation and deallocation: reason 
*/ 
static int file_agent_save_file(FileInfo *file, char *capture_dir) 
{ 
FILE *fh; 
fh = fopen(filename, "w"); 
while (file_mem) 
{ 
if (!buff || !size ) 
return -1; 
} 
fclose(fh); 
return 0; 
}

More Related Content

What's hot

Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxPlatonov Sergey
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and catscorehard_by
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыPlatonov Sergey
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Platonov Sergey
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 

What's hot (20)

Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Component Inspector
Component InspectorComponent Inspector
Component Inspector
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 

Similar to Основы и применение статического анализа кода при разработке лекция 1

PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#Andrey Karpov
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenAndrey Karpov
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Pythonru_Parallels
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на PythonCodeFest
 
Как создать качественный статический анализатор
Как создать качественный статический анализаторКак создать качественный статический анализатор
Как создать качественный статический анализаторAndrey Karpov
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Andrey Karpov
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Andrey Karpov
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++Andrey Karpov
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаAndrey Karpov
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаcorehard_by
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Сергей Еланцев - Troubleshooting
Сергей Еланцев - Troubleshooting   Сергей Еланцев - Troubleshooting
Сергей Еланцев - Troubleshooting Yandex
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибкиAndrey Karpov
 
Парсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clangПарсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clangcorehard_by
 

Similar to Основы и применение статического анализа кода при разработке лекция 1 (20)

PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы Tizen
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Как создать качественный статический анализатор
Как создать качественный статический анализаторКак создать качественный статический анализатор
Как создать качественный статический анализатор
 
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
Сергей Еланцев - Troubleshooting
Сергей Еланцев - Troubleshooting   Сергей Еланцев - Troubleshooting
Сергей Еланцев - Troubleshooting
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Team workflow
Team workflowTeam workflow
Team workflow
 
PVS-Studio vs Chromium
PVS-Studio vs ChromiumPVS-Studio vs Chromium
PVS-Studio vs Chromium
 
Парсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clangПарсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clang
 

Основы и применение статического анализа кода при разработке лекция 1

  • 1. Основы и применение статического анализа кода при разработке ПО Дмитрий Русаков
  • 3. В начале 80-ых Программист Продукт Менеджер
  • 4. В начале 90-х Программист Менеджер Продукт Тестировщик
  • 6. Качество ПО • Каждому требуется своё. ПО, работающее на изолированном компьютере, и веб-сайт правительства • Целостность • Доступность • С усложнением инфраструктуры усложнились требования к качеству ПО. Теперь не достаточно выполнять свои функции правильно, необходимо учитывать возможные нападения. • Принципиальная невозможность добиться абсолютно правильной программы: машина Тьюринга, Microsoft. • Целостность • Доступность • Конфиденциальность
  • 7. Факторы, влияющие на уязвимость ПО • Ошибки программирования (переполнение буфера), • Ошибки архитектуры (хранение пароля администратора на компьютере пользователя, реализация контроля доступа на стороне клиента), • Некорректное применение (использование для разграничения доступа программы, в которой нет аутентификации), • Некорректные настройки (отсутствие запрета модификации настроек безопасности для пользователя), • и т.д.
  • 8. Тестирование • С виду наиболее простой подход. • Позволяет контролировать качество вариантов использования, пришедших в голову тестировщику. • Наиболее проработанный и везде применяемых подход (функциональное тестирование, нагрузочное тестирование, регрессионное тестирование, Unit Test). • Сложность проведения качественного тестирования
  • 9. Ревизия • Трудоёмкость • Требует определения целей
  • 10. Типизированные языки программирования и контроль времени компиляции • Позволяет выявлять наиболее простые «опечатки» программиста. • Метод быстрой разработки: недостатки.
  • 11. Встраивание проверок и ограничений в код, использование "безопасных" функций и языков высокого уровня • Встраивание проверок и ограничений позволяет выявлять проблемы во время исполнения и реагировать на них (контроль переполнения буфера в Visual С++). • Использование «безопасных» функций позволяет избежать типичных ошибок программирования • char * strcpy ( char * destination, const char * source ); • char * strncpy ( char * destination, const char * source, size_t num ); №3 в Top 25 CWE: «Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')» • Языки высокого уровня позволяют детальнее продумывать архитектуру, не заботясь о деталях реализации.
  • 12. Доказательство правильности свойств программ • Минус: возможность работы только с небольшими программами • Требуется высокая компетенция экспертов • Формальное доказательство • Model Checking • Pi-calculus
  • 13. Статический анализ • Выявление «нехитрых» ошибок • Значительное количество ложных срабатываний
  • 14. Исполнение в виртуальной среде • Песочницы
  • 15. Статический анализ кода • Анализ, проводимый путём исследования исходных текстов или исполняемых файлов БЕЗ запуска кода. • Автоматическое выявление возможных уязвимостей кода БЕЗ исполнения кода. • Статический анализ показывает на возможный недочёт. • do {} while true; • char *p, *k; • p=k; • *k=10; • If ( p ) {};
  • 16. Лексический контроль заданных правил • Фактически – применение регулярных выражений. • k = j/0; • i = 0; • … • k = j/i; • Сообщения компиляторов • Большинство (простейшие) утилиты поиска недостатков кода • Утилиты проверки правил оформления кода
  • 17. Анализ программы без учета потока управления • Прямой обход результатов лексического, синтаксического или семантического разбора. • i = 0; • … • k = j/i; • Не используемые переменные, «устаревшие» функции, • Сообщения умных компиляторов • Lint • CppCheck
  • 18. Анализ программ с учётом потока управления • Прямой обход результатов лексического, синтаксического или семантического разбора. • i = 0; • … • k = j/i; • Использование переменной до присвоения ей значения, недостижимый код • Klockwork, Coverity, VivaCore • Pvs-studio
  • 19. Анализ аннотированного кода • Аннотирование кода позволяет упростить работу алгоритма • int readData( __out_bcount_part( maxLength, *length ) void *buffer, const int maxLength, int *length ); • Visual Studio (PreFast)
  • 20. Примеры результатов PVS-studio • There are identical sub-expressions 'height <= 0' to the left and to the right of the '||' operator. • if (width <= 0 || height <= 0 || !data • || INT_MAX/sizeof(uchar *) < uint(height) • || INT_MAX/uint(depth) < uint(width) • || bpl <= 0 • || height <= 0 • || bpl < min_bytes_per_line • || INT_MAX/uint(bpl) < uint(height)) • return d; • This is a nonsensical comparison: pointer >= 0. • MessageItem *ContextItem::findMessage(const QString &sourcetext, const QString &comment) const • if (c->findMessage(m->text(), m->comment()) >= 0)
  • 21. Примеры результатов PVS-studio • The 'throw' operator inside the destructor should be placed within the try..catch block. Raising exception inside the destructor is illegal. • # define QT_RETHROW throw • QObject::~QObject() • { • if (d->isSignalConnected(0)) { • QT_TRY { • emit destroyed(this); • } QT_CATCH(...) { • // all the signal/slots connections are still in place - if we don't • // quit now, we will crash pretty soon. • qWarning("Detected an unexpected exception in ~QObject while emitting destroyed()."); • QT_RETHROW; • } • } • }
  • 22. Примеры результатов PVS-studio • Pointer to local variable 'tmp' is stored outside the scope of this variable. Such a pointer will become invalid. • • QList<QGraphicsItem *> QGraphicsSceneBspTree::items(const QRectF &rect, bool onlyTopLevelItems) const • { • QList<QGraphicsItem *> tmp; • findVisitor->foundItems = &tmp; • findVisitor->onlyTopLevelItems = onlyTopLevelItems; • climbTree(findVisitor, rect); • // Reset discovery bits. • for (int i = 0; i < tmp.size(); ++i) • tmp.at(i)->d_ptr->itemDiscovered = 0; • return tmp; • }
  • 23. Примеры результатов PVS-studio • Pointer to local variable 'tmp' is stored outside the scope of this variable. Such a pointer will become invalid. • • QList<QGraphicsItem *> QGraphicsSceneBspTree::items(const QRectF &rect, bool onlyTopLevelItems) const • { • QList<QGraphicsItem *> tmp; • findVisitor->foundItems = &tmp; • findVisitor->onlyTopLevelItems = onlyTopLevelItems; • climbTree(findVisitor, rect); • // Reset discovery bits. • for (int i = 0; i < tmp.size(); ++i) • tmp.at(i)->d_ptr->itemDiscovered = 0; • return tmp; • }
  • 24. Примеры результатов CppCheck • (error) Uninitialized variable: cc int wfp_dispatch(wfp *p, int cnt, wfp_handler callback, u_char *user) { int cc; if (p->cc == 0) { cc = p->packet->ulBytesReceived; } else bp = p->bp; #define bhp ((wfp_hdr *)bp) ep = bp + cc; }
  • 25. Примеры результатов CppCheck • (error) Uninitialized variable: cc int wfp_dispatch(wfp *p, int cnt, wfp_handler callback, u_char *user) { int cc; if (p->cc == 0) { cc = p->packet->ulBytesReceived; } else bp = p->bp; #define bhp ((wfp_hdr *)bp) ep = bp + cc; }
  • 26. Примеры результатов CppCheck • (error) Mismatching allocation and deallocation: reason if (m_minorVerNum >= 8) { StringStorage errorMessage(e.getMessage()); size_t reasonLen = errorMessage.getLength(); char *reason = new char[reasonLen + 1]; try { if (errorMessage.toAnsiString(reason, reasonLen + 1)) { m_output->writeUInt32(1); m_output->writeUInt32(reasonLen); m_output->writeFully(reason, reasonLen); } } catch (...) { delete reason; throw; } delete reason; }
  • 27. Примеры результатов CppCheck • (error) Mismatching allocation and deallocation: reason */ static int file_agent_save_file(FileInfo *file, char *capture_dir) { FILE *fh; fh = fopen(filename, "w"); while (file_mem) { if (!buff || !size ) return -1; } fclose(fh); return 0; }