SlideShare a Scribd company logo
1 of 41
1/41Санкт-Петербург. 31 мая–1 июня 2019
Software quality assurance days
25 Международная конференция
по вопросам качества ПО
sqadays.com
Сергей Хренов
PVS-Studio, Тула, Россия
Специфика разработки и тестирования
статического анализатора
2/41
Название темы. Может быть длинное, даже не одна строка, а две или три
О статическом анализе,
сложностях разработки и
обеспечении качества
3/41
• Не заменяет, но дополняет
обзоры кода
• Поиск ошибок в коде без его
выполнения
• Позволяет контролировать
качество кода в больших
проектах
Статический анализ…
4/41
Типовая ошибка (проект Mono)
5/41
Типовая ошибка (проект Mono)
6/41
V3012 The '?:' operator, regardless of its conditional expression, always
returns one and the same value: Color.FromArgb (150, 179, 225).
ProfessionalColorTable.cs 258
Типовая ошибка (проект Mono)
7/41
Проблематика
• Наукоёмкость
• Различные языки программирования
• Кроссплатформенность
• Поддержка стандартов (CWE, MISRA, SEI CERT…)
• Классических методов тестирования недостаточно
8/41
Как добиться качества?
• Совместные обзоры кода (это работает!)
• Unit-тесты
• UI-тесты
• Функциональные тесты
• Нагрузочное тестирование
• Статический анализ
• Проверка пула реальных проектов (SelfTester)
9/41
Как устроен и работает C#-анализатор
10/41
MSBuild, Roslyn и все, все, все
11/41
MSBuild, Roslyn и все, все, все
12/41
int x = 1;
Синтаксическое дерево
13/41
Семантическая модель
 Получение информации об объекте
 Получение информации о типе объекта
 Получение константных значений
x = 1;
x
Semantic Model
System.Int32 x = 1;
14/41
Получение проекта
void GetProjects(string solutionPath, string projectPath)
{
MSBuildWorkspace workspace = MSBuildWorkspace.Create();
Solution currSolution = workspace.OpenSolutionAsync(solutionPath)
.Result;
IEnumerable<Project> projects = currSolution.Projects;
Project currProject = workspace.OpenProjectAsync(projectPath)
.Result;
}
15/41
Получение проекта (все проекты в решении)
void GetProjects(string solutionPath, string projectPath)
{
MSBuildWorkspace workspace = MSBuildWorkspace.Create();
Solution currSolution = workspace.OpenSolutionAsync(solutionPath)
.Result;
IEnumerable<Project> projects = currSolution.Projects;
Project currProject = workspace.OpenProjectAsync(projectPath)
.Result;
}
16/41
Получение проекта (заданный проект)
void GetProjects(string solutionPath, string projectPath)
{
MSBuildWorkspace workspace = MSBuildWorkspace.Create();
Solution currSolution = workspace.OpenSolutionAsync(solutionPath)
.Result;
IEnumerable<Project> projects = currSolution.Projects;
Project currProject = workspace.OpenProjectAsync(projectPath)
.Result;
}
17/41
Анализ проекта
void ProjectAnalysis(Project project)
{
Compilation compilation = project.GetCompilationAsync().Result;
foreach (var file in project.Documents)
{
SyntaxTree tree = file.GetSyntaxTreeAsync().Result;
SemanticModel model = compilation.GetSemanticModel(tree);
Visit(tree.GetRoot());
}
}
18/41
Анализ проекта (обход всех файлов)
void ProjectAnalysis(Project project)
{
Compilation compilation = project.GetCompilationAsync().Result;
foreach (var file in project.Documents)
{
SyntaxTree tree = file.GetSyntaxTreeAsync().Result;
SemanticModel model = compilation.GetSemanticModel(tree);
Visit(tree.GetRoot());
}
}
19/41
Анализ проекта (получение и обход дерева)
void ProjectAnalysis(Project project)
{
Compilation compilation = project.GetCompilationAsync().Result;
foreach (var file in project.Documents)
{
SyntaxTree tree = file.GetSyntaxTreeAsync().Result;
SemanticModel model = compilation.GetSemanticModel(tree);
Visit(tree.GetRoot());
}
}
20/41
Переопределённые методы обхода узлов
public override void VisitIfStatement(IfStatementSyntax node)
{
base.VisitIfStatement(node);
}
public override void VisitForStatement(ForStatementSyntax node)
{
base.VisitForStatement(node);
}
….
21/41
Диагностика
22/41
Диагностика V3006: пропущенный throw
public void DoSomething(int index)
{
if (index < 0)
new ArgumentOutOfRangeException(); // <= V3006
else
....
}
// правильный вариант кода:
throw new ArgumentOutOfRangeException();
23/41
1. Подписаться на обход узлов типа ObjectCreationExpressionSyntax
(создание объекта с использованием оператора new);
2. Проверить, что тип создаваемого объекта System.Exception или
производный (используем семантическую модель);
3. Проверить, что созданный объект никак не используется;
4. Выдать предупреждение.
Диагностика V3006: пропущенный throw
24/41
public class V3006CSharpRule : IVisitObjectCreationExpressionRule
{
....
public void VisitObjectCreationExpression(
SemanticModelAdapter model,
VisitInfo visitInfo,
ObjectCreationExpressionSyntax node,
AnalysisResults results)
{
....
}
}
Диагностика V3006: пропущенный throw
25/41
Разработка диагностики
1. Создание позитивных и негативных тестов
2. Разработка прототипа, отвечающего требованиям
тестов
3. Доработка диагностики и тестов по результатам
прогона на пуле реальных проектов (SelfTester)
4. Обработка исключений, минимизация ложных
срабатываний
5. Повторный прогон на реальных проектах, фиксация
изменений
26/41
Немного статистики
27/41
Позитивные тесты
28/41
Негативные тесты
29/41
Негативные и позитивные тесты
30/41
Проверка работы на реальных проектах
(SelfTester)
31/41
• Инструмент пакетной проверки пула
реальных проектов
• SelfTester для С/С++ и C# использует
локальный пул проектов
• SelfTester для Java выкачивает проекты
определенной версии с репозитория на
GitHub
PVS-Studio SelfTester
32/41
Требования к SelfTester
• Кроссплатформенность
• Параллелизм
• Наличие GUI
• Гибкие настройки
• Представление результата в удобном виде
• Сравнение с результатом предыдущего
запуска
• Возможность быстрой фиксации или
игнорирования различий
33/41
Задачи SelfTester
• Любое изменение ядра требует перезапуска тестов
• Ядро – совокупность общих внутренних механизмов
анализатора
• Создание новой диагностики требует перезапуска
тестов
• Включение нового проекта в тестовый пул требует
перезапуска тестов
• Главная задача – выявление аномалий в поведении
анализатора
• Часто аномалии – ожидаемое поведение
34/41
Отчёт о найденных ошибках (*.plog)
35/41
SelfTester: алгоритм работы
Доработка
анализатора
Различия?
Тестовый
проект
Анализ
Эталонный
лог (plog)
Текущий
лог (plog)
Сравнение
логов
Ожидаемо?
Замена
эталонного
лога текущим
да
данет
нет
36/41
Результат сравнения логов
37/41
PVS-Studio SelfTester (С#)
38/41
Вывод в продуктив
• Доработки по результатам
откликов от пользователей
(включая внутренних)
• Доработки, связанные с
изменением поведения ядра
(доработка механизмов,
поддержка новых стандартов
языка и т.п.)
39/41
Пять признаков хорошего статического анализатора
по версии PVS-Studio
• Быстрая обработка кода
• Минимум ложных срабатываний
• Развитые средства интеграции
• Простота внедрения на больших проектах
• Поддержка
40/41
Вопросы
41/41
Сергей Хренов
C# разработчик, PVS-Studio
khrenov@viva64.com
www.viva64.com
Контакты

More Related Content

What's hot

Кутумов - Автоматизация тестирования транспортных карт
Кутумов - Автоматизация тестирования транспортных картКутумов - Автоматизация тестирования транспортных карт
Кутумов - Автоматизация тестирования транспортных картqasib
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программTatyanazaxarova
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практикеDenis Tuchin
 
Как мы тестируем анализатор кода
Как мы тестируем анализатор кодаКак мы тестируем анализатор кода
Как мы тестируем анализатор кодаTatyanazaxarova
 
Разработка через тестирование (TDD и BDD)
Разработка через тестирование (TDD и BDD)Разработка через тестирование (TDD и BDD)
Разработка через тестирование (TDD и BDD)Vyacheslav Lyalkin
 
Инструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколовИнструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколовfurj
 
Борьба с ошибками (TDD)
Борьба с ошибками (TDD)Борьба с ошибками (TDD)
Борьба с ошибками (TDD)Fedor Malyshkin
 
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
 
Test Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream ModelTest Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream ModelIosif Itkin
 
C# Desktop. Занятие 17.
C# Desktop. Занятие 17.C# Desktop. Занятие 17.
C# Desktop. Занятие 17.Igor Shkulipa
 
Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3Technopark
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокTatyanazaxarova
 
Ошибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияОшибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияzheldak
 
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...Iosif Itkin
 
Тестирование весна 2014 смешанное занятие 1
Тестирование весна 2014 смешанное занятие 1Тестирование весна 2014 смешанное занятие 1
Тестирование весна 2014 смешанное занятие 1Technopark
 
Резюме Стасенко А.П
Резюме Стасенко А.ПРезюме Стасенко А.П
Резюме Стасенко А.ПAlexander Stasenko
 
зуева татьяна - опыт автоматизации тестирования в Agile проекте
зуева татьяна -  опыт автоматизации тестирования в Agile проектезуева татьяна -  опыт автоматизации тестирования в Agile проекте
зуева татьяна - опыт автоматизации тестирования в Agile проектеMagneta AI
 
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...Tatyanazaxarova
 
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...CodeFest
 

What's hot (20)

Кутумов - Автоматизация тестирования транспортных карт
Кутумов - Автоматизация тестирования транспортных картКутумов - Автоматизация тестирования транспортных карт
Кутумов - Автоматизация тестирования транспортных карт
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программ
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практике
 
Как мы тестируем анализатор кода
Как мы тестируем анализатор кодаКак мы тестируем анализатор кода
Как мы тестируем анализатор кода
 
Разработка через тестирование (TDD и BDD)
Разработка через тестирование (TDD и BDD)Разработка через тестирование (TDD и BDD)
Разработка через тестирование (TDD и BDD)
 
Инструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколовИнструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколов
 
QAFest. Роль тестирования в Devops
QAFest. Роль тестирования в DevopsQAFest. Роль тестирования в Devops
QAFest. Роль тестирования в Devops
 
Борьба с ошибками (TDD)
Борьба с ошибками (TDD)Борьба с ошибками (TDD)
Борьба с ошибками (TDD)
 
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#
 
Test Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream ModelTest Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream Model
 
C# Desktop. Занятие 17.
C# Desktop. Занятие 17.C# Desktop. Занятие 17.
C# Desktop. Занятие 17.
 
Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
Ошибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияОшибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы применения
 
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
TMPA-2015: Automated Testing of Multi-thread Data Structures Solutions Lineri...
 
Тестирование весна 2014 смешанное занятие 1
Тестирование весна 2014 смешанное занятие 1Тестирование весна 2014 смешанное занятие 1
Тестирование весна 2014 смешанное занятие 1
 
Резюме Стасенко А.П
Резюме Стасенко А.ПРезюме Стасенко А.П
Резюме Стасенко А.П
 
зуева татьяна - опыт автоматизации тестирования в Agile проекте
зуева татьяна -  опыт автоматизации тестирования в Agile проектезуева татьяна -  опыт автоматизации тестирования в Agile проекте
зуева татьяна - опыт автоматизации тестирования в Agile проекте
 
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...
 
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
CodeFest 2010. Жемчужникова М., Овчарова О. —Принципы выбора ПО для группы те...
 

Similar to Специфика разработки и тестирования статического анализатора

Технологии разработки ПО
Технологии разработки ПОТехнологии разработки ПО
Технологии разработки ПОAnton Konushin
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQAFest
 
What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012InTRUEdeR
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыPositive Development User Group
 
5 колчинская
5 колчинская 5 колчинская
5 колчинская qasib
 
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыMoscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыOleg Nenashev
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...yaevents
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs ReflectionDenis Tsvettsih
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?COMAQA.BY
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingTatiana Volkova
 
Tool View Interface of Integrated Development Environment / Исследование инте...
Tool View Interface of Integrated Development Environment / Исследование инте...Tool View Interface of Integrated Development Environment / Исследование инте...
Tool View Interface of Integrated Development Environment / Исследование инте...Ivan Ruchkin
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокAndrey Karpov
 
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовРеализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовSQALab
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesOpen Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesAliaksandr Ikhelis
 
основы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеосновы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеYakubovichDA
 
Технология предметно ориентированного программирования гетерогенных многоядер...
Технология предметно ориентированного программирования гетерогенных многоядер...Технология предметно ориентированного программирования гетерогенных многоядер...
Технология предметно ориентированного программирования гетерогенных многоядер...CEE-SEC(R)
 
Обеспечение качества: Практические советы
Обеспечение качества: Практические советыОбеспечение качества: Практические советы
Обеспечение качества: Практические советыSQALab
 

Similar to Специфика разработки и тестирования статического анализатора (20)

Технологии разработки ПО
Технологии разработки ПОТехнологии разработки ПО
Технологии разработки ПО
 
Team workflow
Team workflowTeam workflow
Team workflow
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
 
What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
 
5 колчинская
5 колчинская 5 колчинская
5 колчинская
 
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыMoscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
 
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API: SyntaxTree vs CodeDom, SemanticModel vs ReflectionRoslyn API: SyntaxTree vs CodeDom, SemanticModel vs Reflection
Roslyn API : SyntaxTree vs CodeDom, SemanticModel vs Reflection
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в Processing
 
Tool View Interface of Integrated Development Environment / Исследование инте...
Tool View Interface of Integrated Development Environment / Исследование инте...Tool View Interface of Integrated Development Environment / Исследование инте...
Tool View Interface of Integrated Development Environment / Исследование инте...
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовРеализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesOpen Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practices
 
основы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 1. введение в программированиеосновы ооп на языке C#. часть 1. введение в программирование
основы ооп на языке C#. часть 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
 

Специфика разработки и тестирования статического анализатора

  • 1. 1/41Санкт-Петербург. 31 мая–1 июня 2019 Software quality assurance days 25 Международная конференция по вопросам качества ПО sqadays.com Сергей Хренов PVS-Studio, Тула, Россия Специфика разработки и тестирования статического анализатора
  • 2. 2/41 Название темы. Может быть длинное, даже не одна строка, а две или три О статическом анализе, сложностях разработки и обеспечении качества
  • 3. 3/41 • Не заменяет, но дополняет обзоры кода • Поиск ошибок в коде без его выполнения • Позволяет контролировать качество кода в больших проектах Статический анализ…
  • 6. 6/41 V3012 The '?:' operator, regardless of its conditional expression, always returns one and the same value: Color.FromArgb (150, 179, 225). ProfessionalColorTable.cs 258 Типовая ошибка (проект Mono)
  • 7. 7/41 Проблематика • Наукоёмкость • Различные языки программирования • Кроссплатформенность • Поддержка стандартов (CWE, MISRA, SEI CERT…) • Классических методов тестирования недостаточно
  • 8. 8/41 Как добиться качества? • Совместные обзоры кода (это работает!) • Unit-тесты • UI-тесты • Функциональные тесты • Нагрузочное тестирование • Статический анализ • Проверка пула реальных проектов (SelfTester)
  • 9. 9/41 Как устроен и работает C#-анализатор
  • 10. 10/41 MSBuild, Roslyn и все, все, все
  • 11. 11/41 MSBuild, Roslyn и все, все, все
  • 12. 12/41 int x = 1; Синтаксическое дерево
  • 13. 13/41 Семантическая модель  Получение информации об объекте  Получение информации о типе объекта  Получение константных значений x = 1; x Semantic Model System.Int32 x = 1;
  • 14. 14/41 Получение проекта void GetProjects(string solutionPath, string projectPath) { MSBuildWorkspace workspace = MSBuildWorkspace.Create(); Solution currSolution = workspace.OpenSolutionAsync(solutionPath) .Result; IEnumerable<Project> projects = currSolution.Projects; Project currProject = workspace.OpenProjectAsync(projectPath) .Result; }
  • 15. 15/41 Получение проекта (все проекты в решении) void GetProjects(string solutionPath, string projectPath) { MSBuildWorkspace workspace = MSBuildWorkspace.Create(); Solution currSolution = workspace.OpenSolutionAsync(solutionPath) .Result; IEnumerable<Project> projects = currSolution.Projects; Project currProject = workspace.OpenProjectAsync(projectPath) .Result; }
  • 16. 16/41 Получение проекта (заданный проект) void GetProjects(string solutionPath, string projectPath) { MSBuildWorkspace workspace = MSBuildWorkspace.Create(); Solution currSolution = workspace.OpenSolutionAsync(solutionPath) .Result; IEnumerable<Project> projects = currSolution.Projects; Project currProject = workspace.OpenProjectAsync(projectPath) .Result; }
  • 17. 17/41 Анализ проекта void ProjectAnalysis(Project project) { Compilation compilation = project.GetCompilationAsync().Result; foreach (var file in project.Documents) { SyntaxTree tree = file.GetSyntaxTreeAsync().Result; SemanticModel model = compilation.GetSemanticModel(tree); Visit(tree.GetRoot()); } }
  • 18. 18/41 Анализ проекта (обход всех файлов) void ProjectAnalysis(Project project) { Compilation compilation = project.GetCompilationAsync().Result; foreach (var file in project.Documents) { SyntaxTree tree = file.GetSyntaxTreeAsync().Result; SemanticModel model = compilation.GetSemanticModel(tree); Visit(tree.GetRoot()); } }
  • 19. 19/41 Анализ проекта (получение и обход дерева) void ProjectAnalysis(Project project) { Compilation compilation = project.GetCompilationAsync().Result; foreach (var file in project.Documents) { SyntaxTree tree = file.GetSyntaxTreeAsync().Result; SemanticModel model = compilation.GetSemanticModel(tree); Visit(tree.GetRoot()); } }
  • 20. 20/41 Переопределённые методы обхода узлов public override void VisitIfStatement(IfStatementSyntax node) { base.VisitIfStatement(node); } public override void VisitForStatement(ForStatementSyntax node) { base.VisitForStatement(node); } ….
  • 22. 22/41 Диагностика V3006: пропущенный throw public void DoSomething(int index) { if (index < 0) new ArgumentOutOfRangeException(); // <= V3006 else .... } // правильный вариант кода: throw new ArgumentOutOfRangeException();
  • 23. 23/41 1. Подписаться на обход узлов типа ObjectCreationExpressionSyntax (создание объекта с использованием оператора new); 2. Проверить, что тип создаваемого объекта System.Exception или производный (используем семантическую модель); 3. Проверить, что созданный объект никак не используется; 4. Выдать предупреждение. Диагностика V3006: пропущенный throw
  • 24. 24/41 public class V3006CSharpRule : IVisitObjectCreationExpressionRule { .... public void VisitObjectCreationExpression( SemanticModelAdapter model, VisitInfo visitInfo, ObjectCreationExpressionSyntax node, AnalysisResults results) { .... } } Диагностика V3006: пропущенный throw
  • 25. 25/41 Разработка диагностики 1. Создание позитивных и негативных тестов 2. Разработка прототипа, отвечающего требованиям тестов 3. Доработка диагностики и тестов по результатам прогона на пуле реальных проектов (SelfTester) 4. Обработка исключений, минимизация ложных срабатываний 5. Повторный прогон на реальных проектах, фиксация изменений
  • 30. 30/41 Проверка работы на реальных проектах (SelfTester)
  • 31. 31/41 • Инструмент пакетной проверки пула реальных проектов • SelfTester для С/С++ и C# использует локальный пул проектов • SelfTester для Java выкачивает проекты определенной версии с репозитория на GitHub PVS-Studio SelfTester
  • 32. 32/41 Требования к SelfTester • Кроссплатформенность • Параллелизм • Наличие GUI • Гибкие настройки • Представление результата в удобном виде • Сравнение с результатом предыдущего запуска • Возможность быстрой фиксации или игнорирования различий
  • 33. 33/41 Задачи SelfTester • Любое изменение ядра требует перезапуска тестов • Ядро – совокупность общих внутренних механизмов анализатора • Создание новой диагностики требует перезапуска тестов • Включение нового проекта в тестовый пул требует перезапуска тестов • Главная задача – выявление аномалий в поведении анализатора • Часто аномалии – ожидаемое поведение
  • 34. 34/41 Отчёт о найденных ошибках (*.plog)
  • 35. 35/41 SelfTester: алгоритм работы Доработка анализатора Различия? Тестовый проект Анализ Эталонный лог (plog) Текущий лог (plog) Сравнение логов Ожидаемо? Замена эталонного лога текущим да данет нет
  • 38. 38/41 Вывод в продуктив • Доработки по результатам откликов от пользователей (включая внутренних) • Доработки, связанные с изменением поведения ядра (доработка механизмов, поддержка новых стандартов языка и т.п.)
  • 39. 39/41 Пять признаков хорошего статического анализатора по версии PVS-Studio • Быстрая обработка кода • Минимум ложных срабатываний • Развитые средства интеграции • Простота внедрения на больших проектах • Поддержка
  • 41. 41/41 Сергей Хренов C# разработчик, PVS-Studio khrenov@viva64.com www.viva64.com Контакты