SlideShare a Scribd company logo
1 of 57
Нужно ли статическому анализу
машинное обучение?
Антидоклад
Виктория Ханиева
PVS-Studio
Докладчик
2
Ханиева Виктория
• Разработчик С++ в PVS-Studio
• Участие в поддержке стандарта MISRA
• Написание статей про проверку
open-source проектов
khanieva@viva64.com
www.viva64.com
 Знакомство со статическим анализом
 Какие решения уже есть на рынке и какие подходы они реализуют
 Проблемы и подводные камни при создании анализатора
 При обучении «вручную»
 При обучении на большом количестве реального кода
 Многообещающие подходы
О чем пойдет речь
3
Об анализе
4
 Ручной анализ (code review)
Какой анализ кода бывает
5
 Ручной анализ (code review)
 Динамический анализ
Какой анализ кода бывает
6
 Ручной анализ (code review)
 Динамический анализ
 Статический анализ
Какой анализ кода бывает
7
 Процесс выявления ошибок и недочетов в
исходном коде программ.
 Выявление ошибок в программах
 Рекомендации по оформлению кода
 Подсчет метрик
 ….
Статический анализ
8
void createCube(float halfExtentsX,
float halfExtentsY,
float halfExtentsZ,
....){
....
m_model->addVertex(halfExtentsX,
halfExtentsY,
halfExtentsY,
....);
....
}
Диагностики
9
void createCube(float halfExtentsX,
float halfExtentsY,
float halfExtentsZ,
....){
....
m_model->addVertex(halfExtentsX,
halfExtentsY,
halfExtentsY,
....);
....
}
Диагностики
10
V751 Parameter 'halfExtentsZ' is not used inside function body.
TinyRenderer.cpp 375
Казалось бы…
11
Целесообразность использования ML
12
 Целесообразно: Анализ фото и видео
Целесообразность использования ML
13
 Целесообразно: Анализ фото и видео
 Нецелесообразно: Калькулятор
Целесообразность использования ML
14
 Целесообразно: Анализ фото и видео
 Нецелесообразно: Калькулятор
Возможный результат
15
Существующие решения
16
Существующие решения
17
Существующие решения
18
 Java, JS, TS, Python, C, C++
 Review кода и аудит
 Можно попробовать на open-source проекте или
посмотреть демки
 Подборка публикаций
DeepCode
19
Link
DeepCode
20
 Java, C, C++, Objective-C
 By Facebook
 Опубликован исходный код
 Можно попробовать на своих проектах
 Основан на логике Хоара, separation logic
и bi-abduction, а также на теории
абстрактной интерпретации (abstract
interpretation)
Infer
21
Link
 Работает с результатами Infer
 Предлагает возможные варианты исправлений
SapFix
22
 Платформа для анализа
качества проекта
 Система предложения правок
 Поиск взаимосвязей между
функциями и методами с
помощью NLP
Embold
23
 Открытый исходный код
 Подборка публикаций
 Репозиторий с датасетом для обучения
 Выявление code-style
 Платформа для сбора метрик и статистики
Source{d}
24
Link
Правка код-стайла в Source{d}
25
Основано на статье
“STYLE-ANALYZER: fixing
code style inconsistencies
with interpretable
unsupervised algorithms”
Link
 By Mozilla+Ubisoft
 Ищет подозрительные коммиты
 Основано на публикации “CLEVER: Combining Code
Metrics with Clone Detection for Just-In-Time Fault
Prevention and Resolution in Large Industrial Projects”
Clever-Commit
26
Link
 Java
 By Amazon
 Рекомендации по лучшим практикам из
документации и кодовой базы
CodeGuru
27
28
 Анализ кода для поиска ошибок
 Анализ кода для поиска отклонений от best practices
 Анализ код-артефактов
 Сбор метрик и данных по коду
 Код-стайл
Основные направления
29
 Подобранная база из open-source репозиториев
 Собранный вручную датасет
 Собственная база проектов
Способы обучения
30
Проблемы и подводные камни
31
*с точки зрения разработчика классического стат анализатора
Как может выглядеть:
• if (X && A == A)
• if (A + 1 == A + 1)
• if (A[i] == A[i])
• if ((A) == (A))
• …
Подборка датасета «вручную»
32
Нужно найти:
if (A == A)
Пример из DeepCode
33
Обучение «вручную»
34
Нужно найти:
int y = x / 0;
Как это часто выглядит на практике
35
Как может выглядеть:
template <class T> class numeric_limits {
....
}
namespace boost {
....
}
namespace boost {
namespace hash_detail {
template <class T> void dsizet(size_t x) {
size_t length = x / (limits<int>::digits - 31);
}
}
}
@Override
public String getText(Mode mode) {
StringBuilder sb = new StringBuilder();
....
if (filter.getMessage()
.toLowerCase(Locale.ENGLISH)
.startsWith("Each ")) {
sb.append(" has base power and toughness ");
} else {
sb.append(" have base power and toughness ");
}
....
return sb.toString();
}
Анализ потока данных
36
Анализ потока данных
37
uint32_t* BnNew() {
uint32_t* result = new uint32_t[kBigIntSize];
memset(result, 0, kBigIntSize * sizeof(uint32_t));
return result;
}
std::string AndroidRSAPublicKey(crypto::RSAPrivateKey* key) {
....
uint32_t* n = BnNew();
....
RSAPublicKey pkey;
....
if (pkey.n0inv == 0)
return kDummyRSAPublicKey; // <=
....
}
 «На GitHub полно проектов, обучим анализатор на
репозиториях и коммитах в них» превращается в сбор и
разметку коммитов.
 Если база для обучения, собранная вручную, оказывается
ненадежной, то что уж ожидать от автоматически-
собранной.
Обучение на большом количестве кода
38
 Смотрим коммит со словом fix, а там:
Обучение на большом количестве кода
39
 Анализатор должен быть up to date относительно
проверяемого языка
 Большинство проектов используют старые
стандарты
 Большинство проектов не используют новые
конструкции
Устаревание кода
40
Новая конструкция:
std::vector<int> numbers;
....
for (int num : numbers)
foo(num);
Новый паттерн ошибки:
for (int num : numbers)
numbers.push_back(num * 2);
Пример
41
Документация
42
 Пример кода:
char check(const uint8 *hash_stage2)
{
....
return memcmp(hash_stage2, hash_stage2_reassured,
SHA1_HASH_SIZE);
}
 Гипотетическое предложение анализатора по правке:
int check(const uint8 *hash_stage2)
{
....
return memcmp(hash_stage2, hash_stage2_reassured,
SHA1_HASH_SIZE);
}
Почему документация нужна
43
Документация от классического подхода
44
Пример кода:
ObjectOutputStream out = new ObjectOutputStream(....);
SerializedObject obj = new SerializedObject();
obj.state = 100;
out.writeObject(obj);
obj.state = 200;
out.writeObject(obj);
out.close();
Почему документация нужна
45
Предложение анализатора по правке:
ObjectOutputStream out = new ObjectOutputStream(....);
SerializedObject obj = new SerializedObject();
obj.state = 100;
out.writeObject(obj);
obj = new SerializedObject(); // Добавилась эта строка
obj.state = 200;
out.writeObject(obj);
out.close();
Почему документация нужна
46
Что происходит без правки:
ObjectOutputStream out = new ObjectOutputStream(....);
SerializedObject obj = new SerializedObject();
obj.state = 100;
out.writeObject(obj); // сохраняет объект с состоянием = 100
obj.state = 200;
out.writeObject(obj); // сохраняет объект с состоянием = 100
out.close();
Почему документация нужна
47
Однозначность поведения
48
Однозначность поведения
49
Однозначность поведения
50
std::vector<int> numbers;
....
for (int num : numbers)
{
if (num < 5)
{
numbers.push_back(0);
break; // или, например, return
}
}
Ложные срабатывания
51
 Может быть неизвестна причина срабатывания или НЕ
срабатывания на конкретный участок кода
 Как исправить?
 Дообучение (а поможет?)
 Механизмом скрытия предупреждений (не универсально)
Ложные срабатывания
52
В случае успешного обучения анализатора
53
 Код-стайл по конкретным символам
 Сбор дополнительных метрик и информации
Интересные направления
54
 Best-practices для конкретного фреймворка/кодовой базы/платформы
Интересные направления
55
56
https://www.viva64.com/pvs-download-datafest20
Попробуйте триальную версию PVS-Studio
и проверяйте свои проекты
с помощью классического статического анализа
в течение месяца:
Q&A
viva64.com
57
khanieva@viva64.com

More Related Content

Similar to Нужно ли статическому анализу машинное обучение?

Static code analysis of the projects built on Unreal Engine
Static code analysis of the projects built on Unreal EngineStatic code analysis of the projects built on Unreal Engine
Static code analysis of the projects built on Unreal EngineDevGAMM Conference
 
Статический анализ кода проектов, построенных на движке Unreal Engine
Статический анализ кода проектов, построенных на движке Unreal EngineСтатический анализ кода проектов, построенных на движке Unreal Engine
Статический анализ кода проектов, построенных на движке Unreal EngineAndrey Karpov
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеAndrey Karpov
 
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Andrey Karpov
 
Автоматическая генерация C кода и тестирование на целевых вычислителях
Автоматическая генерация C кода и тестирование на целевых вычислителяхАвтоматическая генерация C кода и тестирование на целевых вычислителях
Автоматическая генерация C кода и тестирование на целевых вычислителяхMATLAB
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 
SAST, борьба с потенциальными уязвимостями
SAST, борьба с потенциальными уязвимостямиSAST, борьба с потенциальными уязвимостями
SAST, борьба с потенциальными уязвимостямиAndrey Karpov
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибкиAndrey Karpov
 
Рейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчикаРейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчикаSkillsWiki
 
Рейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчикаРейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчикаgeekfamilyrussia
 
Технологии разработки ПО
Технологии разработки ПОТехнологии разработки ПО
Технологии разработки ПОAnton Konushin
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокTatyanazaxarova
 
DevSecOps против восстания машин
DevSecOps против восстания машинDevSecOps против восстания машин
DevSecOps против восстания машинAndrey Karpov
 
Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаСравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarova
 
Регулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеРегулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеTatyanazaxarova
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
 

Similar to Нужно ли статическому анализу машинное обучение? (20)

Static code analysis of the projects built on Unreal Engine
Static code analysis of the projects built on Unreal EngineStatic code analysis of the projects built on Unreal Engine
Static code analysis of the projects built on Unreal Engine
 
Статический анализ кода проектов, построенных на движке Unreal Engine
Статический анализ кода проектов, построенных на движке Unreal EngineСтатический анализ кода проектов, построенных на движке Unreal Engine
Статический анализ кода проектов, построенных на движке Unreal Engine
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в коде
 
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
 
Автоматическая генерация C кода и тестирование на целевых вычислителях
Автоматическая генерация C кода и тестирование на целевых вычислителяхАвтоматическая генерация C кода и тестирование на целевых вычислителях
Автоматическая генерация C кода и тестирование на целевых вычислителях
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 
SAST, борьба с потенциальными уязвимостями
SAST, борьба с потенциальными уязвимостямиSAST, борьба с потенциальными уязвимостями
SAST, борьба с потенциальными уязвимостями
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Рейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчикаРейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчика
 
Рейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчикаРейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчика
 
Технологии разработки ПО
Технологии разработки ПОТехнологии разработки ПО
Технологии разработки ПО
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
DevSecOps против восстания машин
DevSecOps против восстания машинDevSecOps против восстания машин
DevSecOps против восстания машин
 
Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаСравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
 
Регулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеРегулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработке
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложений
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибок
 

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. Нужно ли статическому анализу машинное обучение? Антидоклад Виктория Ханиева PVS-Studio
  • 2. Докладчик 2 Ханиева Виктория • Разработчик С++ в PVS-Studio • Участие в поддержке стандарта MISRA • Написание статей про проверку open-source проектов khanieva@viva64.com www.viva64.com
  • 3.  Знакомство со статическим анализом  Какие решения уже есть на рынке и какие подходы они реализуют  Проблемы и подводные камни при создании анализатора  При обучении «вручную»  При обучении на большом количестве реального кода  Многообещающие подходы О чем пойдет речь 3
  • 5.  Ручной анализ (code review) Какой анализ кода бывает 5
  • 6.  Ручной анализ (code review)  Динамический анализ Какой анализ кода бывает 6
  • 7.  Ручной анализ (code review)  Динамический анализ  Статический анализ Какой анализ кода бывает 7
  • 8.  Процесс выявления ошибок и недочетов в исходном коде программ.  Выявление ошибок в программах  Рекомендации по оформлению кода  Подсчет метрик  …. Статический анализ 8
  • 9. void createCube(float halfExtentsX, float halfExtentsY, float halfExtentsZ, ....){ .... m_model->addVertex(halfExtentsX, halfExtentsY, halfExtentsY, ....); .... } Диагностики 9
  • 10. void createCube(float halfExtentsX, float halfExtentsY, float halfExtentsZ, ....){ .... m_model->addVertex(halfExtentsX, halfExtentsY, halfExtentsY, ....); .... } Диагностики 10 V751 Parameter 'halfExtentsZ' is not used inside function body. TinyRenderer.cpp 375
  • 12. Целесообразность использования ML 12  Целесообразно: Анализ фото и видео
  • 13. Целесообразность использования ML 13  Целесообразно: Анализ фото и видео  Нецелесообразно: Калькулятор
  • 14. Целесообразность использования ML 14  Целесообразно: Анализ фото и видео  Нецелесообразно: Калькулятор
  • 19.  Java, JS, TS, Python, C, C++  Review кода и аудит  Можно попробовать на open-source проекте или посмотреть демки  Подборка публикаций DeepCode 19 Link
  • 21.  Java, C, C++, Objective-C  By Facebook  Опубликован исходный код  Можно попробовать на своих проектах  Основан на логике Хоара, separation logic и bi-abduction, а также на теории абстрактной интерпретации (abstract interpretation) Infer 21 Link
  • 22.  Работает с результатами Infer  Предлагает возможные варианты исправлений SapFix 22
  • 23.  Платформа для анализа качества проекта  Система предложения правок  Поиск взаимосвязей между функциями и методами с помощью NLP Embold 23
  • 24.  Открытый исходный код  Подборка публикаций  Репозиторий с датасетом для обучения  Выявление code-style  Платформа для сбора метрик и статистики Source{d} 24 Link
  • 25. Правка код-стайла в Source{d} 25 Основано на статье “STYLE-ANALYZER: fixing code style inconsistencies with interpretable unsupervised algorithms” Link
  • 26.  By Mozilla+Ubisoft  Ищет подозрительные коммиты  Основано на публикации “CLEVER: Combining Code Metrics with Clone Detection for Just-In-Time Fault Prevention and Resolution in Large Industrial Projects” Clever-Commit 26 Link
  • 27.  Java  By Amazon  Рекомендации по лучшим практикам из документации и кодовой базы CodeGuru 27
  • 28. 28
  • 29.  Анализ кода для поиска ошибок  Анализ кода для поиска отклонений от best practices  Анализ код-артефактов  Сбор метрик и данных по коду  Код-стайл Основные направления 29
  • 30.  Подобранная база из open-source репозиториев  Собранный вручную датасет  Собственная база проектов Способы обучения 30
  • 31. Проблемы и подводные камни 31 *с точки зрения разработчика классического стат анализатора
  • 32. Как может выглядеть: • if (X && A == A) • if (A + 1 == A + 1) • if (A[i] == A[i]) • if ((A) == (A)) • … Подборка датасета «вручную» 32 Нужно найти: if (A == A)
  • 35. Нужно найти: int y = x / 0; Как это часто выглядит на практике 35 Как может выглядеть: template <class T> class numeric_limits { .... } namespace boost { .... } namespace boost { namespace hash_detail { template <class T> void dsizet(size_t x) { size_t length = x / (limits<int>::digits - 31); } } }
  • 36. @Override public String getText(Mode mode) { StringBuilder sb = new StringBuilder(); .... if (filter.getMessage() .toLowerCase(Locale.ENGLISH) .startsWith("Each ")) { sb.append(" has base power and toughness "); } else { sb.append(" have base power and toughness "); } .... return sb.toString(); } Анализ потока данных 36
  • 37. Анализ потока данных 37 uint32_t* BnNew() { uint32_t* result = new uint32_t[kBigIntSize]; memset(result, 0, kBigIntSize * sizeof(uint32_t)); return result; } std::string AndroidRSAPublicKey(crypto::RSAPrivateKey* key) { .... uint32_t* n = BnNew(); .... RSAPublicKey pkey; .... if (pkey.n0inv == 0) return kDummyRSAPublicKey; // <= .... }
  • 38.  «На GitHub полно проектов, обучим анализатор на репозиториях и коммитах в них» превращается в сбор и разметку коммитов.  Если база для обучения, собранная вручную, оказывается ненадежной, то что уж ожидать от автоматически- собранной. Обучение на большом количестве кода 38
  • 39.  Смотрим коммит со словом fix, а там: Обучение на большом количестве кода 39
  • 40.  Анализатор должен быть up to date относительно проверяемого языка  Большинство проектов используют старые стандарты  Большинство проектов не используют новые конструкции Устаревание кода 40
  • 41. Новая конструкция: std::vector<int> numbers; .... for (int num : numbers) foo(num); Новый паттерн ошибки: for (int num : numbers) numbers.push_back(num * 2); Пример 41
  • 43.  Пример кода: char check(const uint8 *hash_stage2) { .... return memcmp(hash_stage2, hash_stage2_reassured, SHA1_HASH_SIZE); }  Гипотетическое предложение анализатора по правке: int check(const uint8 *hash_stage2) { .... return memcmp(hash_stage2, hash_stage2_reassured, SHA1_HASH_SIZE); } Почему документация нужна 43
  • 45. Пример кода: ObjectOutputStream out = new ObjectOutputStream(....); SerializedObject obj = new SerializedObject(); obj.state = 100; out.writeObject(obj); obj.state = 200; out.writeObject(obj); out.close(); Почему документация нужна 45
  • 46. Предложение анализатора по правке: ObjectOutputStream out = new ObjectOutputStream(....); SerializedObject obj = new SerializedObject(); obj.state = 100; out.writeObject(obj); obj = new SerializedObject(); // Добавилась эта строка obj.state = 200; out.writeObject(obj); out.close(); Почему документация нужна 46
  • 47. Что происходит без правки: ObjectOutputStream out = new ObjectOutputStream(....); SerializedObject obj = new SerializedObject(); obj.state = 100; out.writeObject(obj); // сохраняет объект с состоянием = 100 obj.state = 200; out.writeObject(obj); // сохраняет объект с состоянием = 100 out.close(); Почему документация нужна 47
  • 51. std::vector<int> numbers; .... for (int num : numbers) { if (num < 5) { numbers.push_back(0); break; // или, например, return } } Ложные срабатывания 51
  • 52.  Может быть неизвестна причина срабатывания или НЕ срабатывания на конкретный участок кода  Как исправить?  Дообучение (а поможет?)  Механизмом скрытия предупреждений (не универсально) Ложные срабатывания 52
  • 53. В случае успешного обучения анализатора 53
  • 54.  Код-стайл по конкретным символам  Сбор дополнительных метрик и информации Интересные направления 54
  • 55.  Best-practices для конкретного фреймворка/кодовой базы/платформы Интересные направления 55
  • 56. 56 https://www.viva64.com/pvs-download-datafest20 Попробуйте триальную версию PVS-Studio и проверяйте свои проекты с помощью классического статического анализа в течение месяца: