SlideShare a Scribd company logo
1 of 39
Software quality assurance days
25 Международная конференция
по вопросам качества ПО
sqadays.com
Санкт-Петербург, 31 мая –1 июня 2019
Расширяем идею статического анализа от проверки
кода до других процессов разработки
О докладчике
• Максим Стефанов (stefanov@viva64.com)
• C++/Java разработчик в компании PVS-Studio
• Деятельность:
• Участие в разработке ядра C++
анализатора
• Участие в разработке Java анализатора
Содержание
• Общее представление о статическом анализе
• Классический взгляд
• Альтернативный взгляд
• Выводы
Статический анализ – это ...
Входные данные для статического анализа
• Программный код
• Данные в формате JSON, YAML, XML
• Документация / статья
• Чертеж, 3D модель (в проектировании)
• …
Классический взгляд: анализ кодовой базы
Анализ кода нужен для …
• Поиска багов, уязвимостей, узких мест
• Форматирования кода
• Вычисления различных метрик
• Проверки соответствия документации кода
• …
Абстрактное синтаксическое дерево
while(b != 0)
{
if (a > b)
{
a = a - b;
}
else
{
b = b - a;
}
}
return a;
Граф потока управления
(1) while (x < 50)
{
(2) if (a / b > 5)
{
(3) a = a - b;
}
else
{
(4) b = b - a;
(5) }
(6) x++;
}
(7) doSomething();
А также …
• Дерево разбора
• Абстрактный семантический граф (семантическая модель)
• …
Поиск багов, уязвимостей, узких мест
Поиск багов, уязвимостей, узких мест
• Поиск шаблона дефекта на основе AST
• Поиск дефектов на основе семантической модели
• Поиск дефектов на основе анализа потока управления данными
• …
Более подробно:
Форматирование кода
Зачем следить за форматированием кода ?
• Соблюдение правил кодирования в компании
• Легкость в чтении
• Легкость в поддержке и отладке
• Увеличение вероятности обнаружения дефектов
• …
До форматирования
Action doIfSkilledSpeaker(double rating, int experience)
{
int index = 0; while(index < speakers.length) { Speaker sp = speakers[index];
if (sp.getRating()>=rating || sp.getExperience() > experience) { if(sp.isGirl()) {
return LISTEN; } else if (doThink()) {
return LISTEN;
} } }
return GO_HOME;
}
До форматирования
Action doIfSkilledSpeaker(double rating, int experience)
{
int index = 0; while(index < speakers.length) { Speaker sp = speakers[index];
if (sp.getRating()>=rating || sp.getExperience() > experience) { if(sp.isGirl()) {
return LISTEN; } else if (doThink()) {
return LISTEN;
} } }
return GO_HOME;
}
Action getNextInterestingSpeaker(double rating, int experience)
{
int index = 0;
while(index < speakers.length)
{
Speaker sp = speakers[index++];
if (sp.getRating() >= rating || sp.getExperience() > experience)
{
if (sp.isGirl())
{
return LISTEN;
}
else if (doThink())
{
return LISTEN;
}
}
}
return GO_HOME;
}
После форматирования
До форматирования
if (A)
if (B) doSomething();
else
doSomething(someObject);
if (A)
{
if (B)
{
doSomething();
}
else
{
doSomething(someObj);
}
}
После форматирования
if (A)
if (B) doSomething();
else
doSomething(someObj);
Вычисление метрик.
Зачем измерять ПО?
• Определение качества существующего продукта или процесса
• Прогнозирование качества продукта / процесса
• Улучшение качества продукта / процесса
Вычисление метрик
• Количественные метрики
• Метрики сложности программы
• Метрики размера программ
• Метрики сложности потока управления программы
• Метрики сложности потока данных
• Объектно-ориентированные метрики
...
Количественные метрики
• Строки кода SLOC (физические , логические)
• Количество комментариев, процент комментариев
• Среднее число строк для функций (классов, файлов)
• Процент дублирования кода
• ...
Количественные метрики:
метрика по дефектам в коде
• Плотность дефектов:
«Количество дефектов в отдельном модуле»
--------------------------------------------------------------
«Общее количество дефектов в ПО»
• Коэффициент регрессии:
«Количество дефектов в старом функционале»
-------------------------------------------------------------------------------------
«Общее количество дефектов, включая новый функционал»
Метрика Маккейба:
Цикломатическая сложность
M = E − N + 2P
где:
M - цикломатическая сложность,
E - количество рёбер в графе,
N - количество узлов в графе,
P - количество компонент связности.
Цикломатическая сложность
Представление некоторых конструкций языка в виде графа
Цикломатическая сложность : пример
int someMethod(...){
int bot = 0;
int top = n - 1;
int mid, cmp;
while (bot <= top) {
mid = (bot + top)/2;
if (table[mid] == item) {
return mid;
}
else if (compare) {
bot = mid + 1;
}
else {
top = mid -1;
}
}
return -1;
}
Цикломатическая сложность: пример
E = 14
N = 12
P = 1
M = 14–12 + (2*1)
M = 4
Цикломатическая сложность: зачем
Повышенный показатель цикломатической сложности
приводит к сложности:
• понимания, поддержки и отладки кода,
• тестирования.
Подытожим о метриках. Примечание
• Использование метрик в наказательных целях — опасно
• Использование метрик в информационно-вспомогательных целях
— полезно
• Метрики использовать лучше в динамике
Обфускация / деобфускация исходного кода
Необходимость защиты от анализа, выполняемого как
человеком, так и машиной, а также ПО с повышенными
требованиями взломостойкости, например:
• защита ключей DRM
• защита игр от внедрения постороннего кода (читов и ботов)
• защита исходников при передаче/продаже
Обфускация / деобфускация исходного кода
int COUNT = 100;
float TAX_RATE = 0.2;
for (int i=0; i < COUNT; i++)
{
tax[i] = orig_price[i] * TAX_RATE;
price[i] = orig_price[i] + tax[i];
}
До:
После: for(int a=0;a<100;a++){b[a]=c[a]*0.2;d[a]=c[a]+b[a];}
Обфускация / деобфускация исходного кода
Проверка на валидность
Известные форматы для передачи данных: JSON, XML, YAML
Соответствующие инструменты: JSONLint, XMLLint, YAMLLint
производят анализ и выявляют:
• Синтаксические ошибки
• Лишние запятые, скобки, пробелы, …
• Дубликации ключей
• Порядок определения ключей
• …
Проверка на валидность
{
"warnings": [{
"title": "Some Title",
"code": "V6050",
"cwe": 0,
"level": 1,
"title": "Some message.", // Duplicate key 'title'
"falseAlarm": false
}]
}
Публикатор: внутренняя разработка
Задача: проверка статей и документации на корректность
Входные данные: документация, статьи.
Выходные данные:
Список ошибок:
• Соответствие ссылок
• Проверка картинок
• Корректность фрагментов кода
• Проверка наличия даты и авторов документации/статьи
• ...
Пример:
проверка картинок на наличие alpha-каналов
Ожидание Реальность
Пример:
проверка корректности ссылок
Ошибка в том, что в документации на русском языке
используется ссылка на англоязычный источник
КОМПАС-Эксперт:
вдохновение статическим анализом
• Входные данные: чертеж или 3D-модель
• Выходные данные:
Список ошибок:
• соответствие стандартам оформления
• соответствие ограничительным перечням предприятия
• соответствие правилам работы в КОМПАС-3D
КОМПАС-Эксперт:
вдохновение статическим анализом
Выводы
• В последние годы статический анализ набирает обороты
• Велика вероятность, что в ближайшее время области применения
будут только расти

More Related Content

Similar to Расширяем идею статического анализа от проверки кода до других процессов разработки

static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыPositive Development User Group
 
Построение Secure Development Lifecycle
Построение Secure Development Lifecycle Построение Secure Development Lifecycle
Построение Secure Development Lifecycle Vlad Styran
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Сергей Белов
Сергей БеловСергей Белов
Сергей БеловCodeFest
 
SECON'2017, Власенко Олег, Производственная практика ИТ студентов - как компа...
SECON'2017, Власенко Олег, Производственная практика ИТ студентов - как компа...SECON'2017, Власенко Олег, Производственная практика ИТ студентов - как компа...
SECON'2017, Власенко Олег, Производственная практика ИТ студентов - как компа...SECON
 
Software Analytics in frontend
Software Analytics in frontendSoftware Analytics in frontend
Software Analytics in frontendDenis Kolesnikov
 
Microsoft Visual Studio 2010
Microsoft Visual Studio 2010Microsoft Visual Studio 2010
Microsoft Visual Studio 2010Alexander Babich
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Andrew Mayorov
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Yandex
 
Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.ScrumTrek
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Grail - CodeFest'2015
Grail - CodeFest'2015Grail - CodeFest'2015
Grail - CodeFest'2015Igor Khrol
 
Grail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовGrail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовCodeFest
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 

Similar to Расширяем идею статического анализа от проверки кода до других процессов разработки (20)

static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
 
Dsl for c++
Dsl for c++Dsl for c++
Dsl for c++
 
Построение Secure Development Lifecycle
Построение Secure Development Lifecycle Построение Secure Development Lifecycle
Построение Secure Development Lifecycle
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Сергей Белов
Сергей БеловСергей Белов
Сергей Белов
 
SECON'2017, Власенко Олег, Производственная практика ИТ студентов - как компа...
SECON'2017, Власенко Олег, Производственная практика ИТ студентов - как компа...SECON'2017, Власенко Олег, Производственная практика ИТ студентов - как компа...
SECON'2017, Власенко Олег, Производственная практика ИТ студентов - как компа...
 
Software Analytics in frontend
Software Analytics in frontendSoftware Analytics in frontend
Software Analytics in frontend
 
Net 3.0 & Linq
Net 3.0 & LinqNet 3.0 & Linq
Net 3.0 & Linq
 
Microsoft Visual Studio 2010
Microsoft Visual Studio 2010Microsoft Visual Studio 2010
Microsoft Visual Studio 2010
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"
 
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...
 
Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.
 
BDD
BDDBDD
BDD
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Grail - CodeFest'2015
Grail - CodeFest'2015Grail - CodeFest'2015
Grail - CodeFest'2015
 
Grail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовGrail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестов
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 

More from Andrey Karpov

60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программистаAndrey Karpov
 
60 terrible tips for a C++ developer
60 terrible tips for a C++ developer60 terrible tips for a C++ developer
60 terrible tips for a C++ developerAndrey Karpov
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Andrey Karpov
 
PVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesPVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesAndrey Karpov
 
PVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewPVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewAndrey Karpov
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Andrey Karpov
 
Best Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesBest Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesAndrey Karpov
 
Does static analysis need machine learning?
Does static analysis need machine learning?Does static analysis need machine learning?
Does static analysis need machine learning?Andrey Karpov
 
Typical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaTypical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaAndrey Karpov
 
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)Andrey Karpov
 
Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Andrey Karpov
 
C++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerC++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerAndrey Karpov
 
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareThe Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareAndrey Karpov
 
Static Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineStatic Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineAndrey Karpov
 
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsSafety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsAndrey Karpov
 
The Great and Mighty C++
The Great and Mighty C++The Great and Mighty C++
The Great and Mighty C++Andrey Karpov
 
Static code analysis: what? how? why?
Static code analysis: what? how? why?Static code analysis: what? how? why?
Static code analysis: what? how? why?Andrey Karpov
 
Zero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youZero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youAndrey Karpov
 

More from Andrey Karpov (20)

60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста
 
60 terrible tips for a C++ developer
60 terrible tips for a C++ developer60 terrible tips for a C++ developer
60 terrible tips for a C++ developer
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
 
PVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesPVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error Examples
 
PVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewPVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature Overview
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
PVS-Studio в 2021
PVS-Studio в 2021PVS-Studio в 2021
PVS-Studio в 2021
 
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
 
Best Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesBest Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' Mistakes
 
Does static analysis need machine learning?
Does static analysis need machine learning?Does static analysis need machine learning?
Does static analysis need machine learning?
 
Typical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaTypical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and Java
 
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
 
Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?
 
C++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerC++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical Reviewer
 
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareThe Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
 
Static Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineStatic Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal Engine
 
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsSafety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
 
The Great and Mighty C++
The Great and Mighty C++The Great and Mighty C++
The Great and Mighty C++
 
Static code analysis: what? how? why?
Static code analysis: what? how? why?Static code analysis: what? how? why?
Static code analysis: what? how? why?
 
Zero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youZero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for you
 

Расширяем идею статического анализа от проверки кода до других процессов разработки