SlideShare a Scribd company logo
1 of 44
Современный статический анализ
кода: что умеет он, чего не умели
линтеры
Павел Беликов
PVS-Studio
Содержание
• чем должен и не должен заниматься статический анализ
• методики анализа: от первых утилит до современных анализаторов
• поиск по подстроке/регулярным выражениям
• pattern-based analysis
• symbolic execution
• межпроцедурный анализ
• современная инфраструктура анализаторов
2
Немного о нас
• PVS-Studio - статический анализатор C, C++, C# кода
• Поддерживаются Windows и Linux (C, C++)
• Плагин для Visual Studio
• Средства для быстрой проверки (Standalone, pvs-studio-analyzer)
3
Цели статического анализа
• поиск ошибок в логике программы
• поиск уязвимостей
• упрощение процесса разработки
• экономия
4
Чем не должен заниматься статический анализ
• поиск “стилистических” ошибок
• соответствие каким-либо guideline
• предложениями переписать код на новый стандарт
Почему?
• для всего это есть отдельные инструменты
• в большом проекте таких срабатываний будут тысячи
5
Как определить качество статического анализа
Существуют два типа ошибок, которым подвержены анализаторы:
• ошибки первого рода - false positives
• ошибки второго рода - false negatives
Ценность анализа в минимальном количестве ошибок первого рода.
Никто не будет пользоваться анализатором, который выдаёт 1000 ложных
срабатываний на одну ошибку.
6
С чего всё начиналось
• использование небезопасных функций
• возможные опечатки
• типовые ошибки, связанные с недостаточным знанием языка
• несоответствие принятому стилю кодирования
• такие ошибки ищутся и сейчас, отличаются методики поиска
• многие из них уже есть в компиляторах
• поиск по подстроке, регулярным выражениям или лексем ведёт к излишнему
количеству ложных срабатываний
7
Пример опечатки
Ошибка из проекта Linux
char *stime[] = { "400ms", "5min", "10min", "15min",
"20min", "25min", "30min" "No timeout" };
Предупреждение PVS-Studio: V653 A suspicious string consisting of two parts is used for array initialization. It is possible that a
comma is missing. Consider inspecting this literal: «30min» «No timeout». lp8788-charger.c 657
8
Поиск по регулярным выражениям
Некоторые их используют до сих пор. Пример из CppCheck:
<?xml version="1.0"?>
<rule version="1">
<pattern> if ( ([!] )*?(strlen) ( w+? ) ([>] [0] )*?) { </pattern>
<message>
<id>StrlenEmptyString</id>
<severity>performance</severity>
<summary>Using strlen() to check if a string is empty is not
efficient.</summary>
</message>
</rule>
Но у такого подхода серьёзные проблемы с масштабируемостью.
9
С чем же работает современный статический
анализ
• представление кода в виде AST (или байткода, но это отдельный
разговор)
• AST должно быть типизированным
• полная семантическая модель программы
10
Pattern-based analysis
• относительно прост в реализации
• позволяет находить опечатки и последствия Copy-Paste
• в основе метода - поиск какого-то паттерна в АСТ
• для исключений может использоваться информация о типах и значениях
11
Пример поиска паттерна
Ошибка из проекта Oracle VM Virtual Box
static const uint8_t g_acDaysInMonths[12];
static const uint8_t g_acDaysInMonthsLeap[12];
static PRTTIME rtTimeNormalizeInternal(PRTTIME pTime)
{
....
unsigned cDaysInMonth = fLeapYear
? g_acDaysInMonthsLeap[pTime->u8Month - 1]
: g_acDaysInMonthsLeap[pTime->u8Month - 1];
....
}
Предупреждение PVS-Studio: V583 The '?:' operator, regardless of its conditional expression, always returns one and the
same value: g_acDaysInMonthsLeap[pTime->u8Month - 1]. time.cpp 453
12
Пример паттерна c исключением
Ошибка из проекта Serious Engine 1 v.1.10
void CWorldEditorApp::OnConvertWorlds() {
....
char achrLine[256];
....
fsFileList.Open_t( fnFileList);
while( !fsFileList.AtEOF()) {
fsFileList.GetLine_t( achrLine, 256);
// increase counter only for lines that are not blank
if( achrLine != "") ctLines++;
}
fsFileList.Close();
....
}
Предупреждение PVS-Studio: V547 Expression 'achrLine != ""' is always true. To compare strings you should use strcmp()
function. worldeditor.cpp 2254
13
Пример паттерна c исключением
#define MY_STREQ(a,b) ((a) == (b) || strcmp(a, b) == 0)
14
Паттерн с типами
Ошибка из проекта Wolfenstein 3D
void BG_ParseConditionBits(
char **text_pp, animStringItem_t *stringTable,
int condIndex, int result[2] )
{
...
memset( result, 0, sizeof( result ) );
...
}
Предупреждение PVS-Studio: V511 The sizeof() operator returns size of the pointer, and not of the array, in 'sizeof (result)' expression.
cgame bg_animation.c 807
15
Иногда и этого мало
Ошибка из проекта Linux
#define CFS_FAIL_TIMEOUT(id, secs) 
cfs_fail_timeout_set(id, 0, secs * 1000, CFS_FAIL_LOC_NOSET)
#define OBD_FAIL_TIMEOUT(id, secs) 
CFS_FAIL_TIMEOUT(id, secs)
int ptl_send_rpc(struct ptlrpc_request *request, int noreply)
{
....
OBD_FAIL_TIMEOUT(OBD_FAIL_PTLRPC_DELAY_SEND,
request->rq_timeout + 5);
....
}
16
Предупреждение PVS-Studio: V733 It is possible
that macro expansion resulted in incorrect
evaluation order. Check expression: request-
>rq_timeout + 5 * 1000. niobuf.c 637
Symbolic execution
• самая сложная и самая полезная часть анализатора
• опирается на control flow analysis, data flow analysis
• позволяет осуществлять bounds checking, pointer analysis
• вычисление диапазонов переменной позволяет сэкономить на времени
анализа
17
Разыменование нулевого указателя
Ошибка из проекта D programming language
Expression *getVarExp(Loc loc, InterState *istate, Declaration *d, CtfeGoal
goal) {
....
VarDeclaration *v = d->isVarDeclaration();
if (v) {
....
} else if (s) {
if (s->dsym->toInitializer() == s->sym)
....
else
error(loc, "cannot interpret symbol %s at compile time",
v->toChars());
}
....
} 18
Предупреждение PVS-Studio: V522
Dereferencing of the null pointer 'v' might
take place. interpret.c 1711
Разыменование нулевого указателя
• можно попытаться искать такие ошибки в AST, но не стоит
• вычислив значение указателя, мы можем находить более сложные ошибки
Пример:
void report_error() {
throw std::runtime_error(“error”);
}
int* new_int() {
....
int* p = some_condition ? new int : nullptr;
if (p == nullptr) // <= условие
report_error(); // <= не возвращает управления
*p = 0; // <= p != nullptr, всё хорошо
return p;
}
19
Разыменование нулевого указателя
Ошибка из проекта Clang
Expected<std::unique_ptr<PDBFile>>
PDBFileBuilder::build(
std::unique_ptr<msf::WritableStream> PdbFileBuffer)
{
....
auto File = llvm::make_unique<PDBFile>(
std::move(PdbFileBuffer), Allocator);
File->ContainerLayout = *ExpectedLayout;
if (Info) {
auto ExpectedInfo = Info->build(*File, *PdbFileBuffer);
....
}
20
Предупреждение PVS-Studio: V522
Dereferencing of the null pointer
'PdbFileBuffer' might take place.
PDBFileBuilder.cpp 106
Разыменование нулевого указателя
Ошибка из проекта Unreal Engine 4
void UGameplayStatics::DeactivateReverbEffect(....)
{
if (GEngine || !GEngine->UseSound())
{
return;
}
UWorld* ThisWorld = GEngine->GetWorldFromContextObject(....);
....
}
Предупреждение PVS-Studio: V522 Dereferencing of the null pointer 'GEngine' might take place. Check the logical
condition. gameplaystatics.cpp 988
21
Control flow analysis
Какие конструкции не вернут управление:
● return
● исключение
● стандартная функция
● [[noreturn]]
● __attribute__((noreturn))
● __declspec(noreturn)
● создание временного объекта, деструктор которого бросает исключение
● вызов пользовательской функции, не возвращающей управление
● goto
● break, continue
Всё это нужно учитывать при вычислении возможных значений переменной
22
Анализ функции
Ошибка из проекта Chromium
static int BlockSizeForFileType(FileType file_type) {
switch (file_type) {
....
default:
return 0;
}
}
static int RequiredBlocks(int size, FileType file_type) {
int block_size = BlockSizeForFileType(file_type);
return (size + block_size - 1) / block_size;
}
Предупреждение PVS-Studio: V609 Divide by zero. Denominator range [0..4096]. addr.h 159
23
Bounds checking
Пример из мира 64-битных ошибок:
unsigned short f();
int g();
void test(void *p, void *p2) {
int x = f();
memset(p, 0, x); // <= всё нормально, x = [0; 65535]
int y = g();
memset(p2, 0, y); // <= подозрительно, int -> memsize
}
24
Lifetime safety
Ошибка из проекта Clang
SingleLinkedListIterator<T> &operator++(int) {
SingleLinkedListIterator res = *this;
++*this;
return res;
}
Предупреждение PVS-Studio: V558 Function returns the reference to temporary local object: res. LiveInterval.h 679
25
Путаница в new/malloc
Ошибка из проекта Mozilla Thunderbird
NPError NPP_New(....)
{
....
InstanceData* instanceData = new InstanceData;
....
free(instanceData);
....
}
Предупреждение PVS-Studio: V611 The memory was allocated using 'new' operator but was released using the 'free'
function. Consider inspecting operation logics behind the 'instanceData' variable. nptest.cpp 971
26
Простой пример
void foo()
{
int x = 1;
....
if (x == 1) // <= всегда true, ошибка или нет?
return;
}
• часто такой код используют для compile-time отключения функционала
• пример хорошо иллюстрирует неэффективность маленьких искусственных тестов
27
Межпроцедурный анализ
Рекурсивный анализ
• очень точный
• очень медленный
Аннотирование
• можно составлять аннотации, анализируя тело функции
• для популярных библиотек составляются ручные аннотации
• отлично масштабируется
28
Проблемы межпроцедурного анализа
• виртуальные методы
• указатели на функции
• межмодульный анализ
• динамическая линковка
29
Анализ функции
• возможные значения
• область значений для параметров функции
• модификация аргументов, переданных по ссылке или указателю
• анализ на noreturn
• отсутствие побочных эффектов
30
Аннотации: нет состояния
Ошибка из проекта Clang
std::pair<Function *, Function *>
llvm::createSanitizerCtorAndInitFunctions(
....
ArrayRef<Type *> InitArgTypes, ArrayRef<Value *> InitArgs,
....)
{
assert(!InitName.empty() && "Expected init function name");
assert(InitArgTypes.size() == InitArgTypes.size() &&
"Sanitizer's init function expects "
"different number of arguments");
....
}
31
Предупреждение PVS-Studio: V501
There are identical sub-expressions
'InitArgTypes.size()' to the left and to the
right of the '==' operator. ModuleUtils.cpp
107
Аннотации: строка в определённом регистре
Ошибка из проекта CodeLite
struct NodeJSHandle {
wxString type;
....
bool IsString() const {return type.Lower() == "string";}
bool IsArray() const {return type.Lower() == "Array"; }
};
Предупреждение PVS-Studio: V547 Expression 'type.Lower() == "Array"' is always false. NodeJSOuptutParser.h 61
32
Аннотации: значение должно быть использовано
Ошибка из проекта Qt
int main(int argc, char **argv)
{
....
QByteArray arg(argv[a]);
....
arg = arg.mid(1);
arg.toLower();
if (arg == "o")
....
}
Предупреждение PVS-Studio: V530 The return value of function 'toLower' is required to be utilized. main.cpp 72
33
Аннотации: restrict аргументы
Ошибка из проекта Chromium
void DiskCacheEntryTest::ExternalSyncIOBackground(....) {
....
scoped_refptr<net::IOBuffer>
buffer1(new net::IOBuffer(kSize1));
scoped_refptr<net::IOBuffer>
buffer2(new net::IOBuffer(kSize2));
....
EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000));
....
}
Предупреждение PVS-Studio: V549 The first argument of 'memcmp' function is equal to the second argument. entry_unittest.cc 39334
Аннотации: аргумент функции - количество байт
Ошибка из проекта Miranda IM
static BOOL ImageArray_Alloc(LP_IMAGE_ARRAY_DATA iad, int size)
{
...
memset(&iad->nodes[iad->nodes_allocated_size],
(size_grow - iad->nodes_allocated_size) *
sizeof(IMAGE_ARRAY_DATA_NODE),
0);
...
}
Предупреждение PVS-Studio: V575 The 'memcmp' function processes '0' elements. Inspect the 'third' argument.
clist_modern modern_image_array.cpp 59
35
Пользовательские аннотации
• требуют большой работы по аннотированию всей кодовой базы
• индивидуальны для инструмента
• затрудняет чтение кода
• анализатор должен работать сразу
36
Тестирование
• есть только один верный способ тестирования - реальные проекты
• это помогает понять, какие правила дают много ложных срабатываний
• нельзя ругаться на код, если это общепринятая практика
• даже если вы с ней не согласны
37
Написание своих правил для анализатора
• хорошо для линтеров, проверяющих простые паттерны ошибок
• но плохо для статических анализаторов
• написать API, позволяющий работать со всеми видами анализа -
огромная работа
• сделать его стабильным ещё сложнее
• пользователи не захотят писать полноценные правила для анализатора
38
Ранжирование результатов анализа
• не все ошибки одинаково опасны
• некоторые диагностики могут тяготеть к ложным срабатываниям
• логично разделить ошибки на уровни
• отдельные категории диагностик: 64-битные, микрооптимизации
39
Как осуществить такой анализ?
• анализ исходных файлов уже не работает
• отталкиваться приходится от конкретных компиляторов
• сборочные системы
40
Как осуществить такой анализ?
• такое многообразие окружений накладывает свои требования
• необходимо уметь проверять проект, независимо от системы сборки
• необходимо парсить код для любого компилятора
• необходимо всё это тестировать (ура, больше исключений)
41
Интеграция в процесс разработки
• статический анализатор - инструмент для разработчика
• инкрементальный анализ
• приемлемая скорость анализа
• подавление ложных срабатываний - assert, комментарии, база разметки
42
Интеграция в QA
• запуск на сборочных серверах
• рассылка html-отчёта по почте
• интеграция в Code Quality платформы (например, SonarQube)
43
Q&A
Почта: support@viva64.com
Блог на хабре: https://habrahabr.ru/company/pvs-studio/
Скачать PVS-Studio: http://www.viva64.com/ru/pvs-studio/
44
Для открытых некоммерческих проектов есть
бесплатная лицензия

More Related Content

What's hot

Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типовcorehard_by
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 

What's hot (20)

Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
JRebel
JRebelJRebel
JRebel
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Bytecode
BytecodeBytecode
Bytecode
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 

Viewers also liked

Повседневный С++: алгоритмы и итераторы
Повседневный С++: алгоритмы и итераторы Повседневный С++: алгоритмы и итераторы
Повседневный С++: алгоритмы и итераторы corehard_by
 
строим Microkernel architecture на базе паттерна pipes and filters
строим Microkernel architecture на базе паттерна pipes and filtersстроим Microkernel architecture на базе паттерна pipes and filters
строим Microkernel architecture на базе паттерна pipes and filterscorehard_by
 
Диаграммы состояний и c++
Диаграммы состояний и c++Диаграммы состояний и c++
Диаграммы состояний и c++corehard_by
 
Oxygine 2 d objects,events,debug and resources
Oxygine 2 d objects,events,debug and resourcesOxygine 2 d objects,events,debug and resources
Oxygine 2 d objects,events,debug and resourcescorehard_by
 
шишки, набитые за 15 лет использования акторов в c++ v.001.3
шишки, набитые за 15 лет использования акторов в c++ v.001.3шишки, набитые за 15 лет использования акторов в c++ v.001.3
шишки, набитые за 15 лет использования акторов в c++ v.001.3corehard_by
 
Mixing c++ and python
Mixing c++ and pythonMixing c++ and python
Mixing c++ and pythoncorehard_by
 
Unit tests final
Unit tests finalUnit tests final
Unit tests finalcorehard_by
 
Mixing d ps building architecture on the cross cutting example
Mixing d ps building architecture on the cross cutting exampleMixing d ps building architecture on the cross cutting example
Mixing d ps building architecture on the cross cutting examplecorehard_by
 
модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?corehard_by
 
модели акторов в с++ миф или реальность
модели акторов в с++ миф или реальностьмодели акторов в с++ миф или реальность
модели акторов в с++ миф или реальностьcorehard_by
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 

Viewers also liked (12)

Повседневный С++: алгоритмы и итераторы
Повседневный С++: алгоритмы и итераторы Повседневный С++: алгоритмы и итераторы
Повседневный С++: алгоритмы и итераторы
 
строим Microkernel architecture на базе паттерна pipes and filters
строим Microkernel architecture на базе паттерна pipes and filtersстроим Microkernel architecture на базе паттерна pipes and filters
строим Microkernel architecture на базе паттерна pipes and filters
 
Диаграммы состояний и c++
Диаграммы состояний и c++Диаграммы состояний и c++
Диаграммы состояний и c++
 
C++ references
C++ referencesC++ references
C++ references
 
Oxygine 2 d objects,events,debug and resources
Oxygine 2 d objects,events,debug and resourcesOxygine 2 d objects,events,debug and resources
Oxygine 2 d objects,events,debug and resources
 
шишки, набитые за 15 лет использования акторов в c++ v.001.3
шишки, набитые за 15 лет использования акторов в c++ v.001.3шишки, набитые за 15 лет использования акторов в c++ v.001.3
шишки, набитые за 15 лет использования акторов в c++ v.001.3
 
Mixing c++ and python
Mixing c++ and pythonMixing c++ and python
Mixing c++ and python
 
Unit tests final
Unit tests finalUnit tests final
Unit tests final
 
Mixing d ps building architecture on the cross cutting example
Mixing d ps building architecture on the cross cutting exampleMixing d ps building architecture on the cross cutting example
Mixing d ps building architecture on the cross cutting example
 
модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?модель акторов и C++ что, зачем и как ?
модель акторов и C++ что, зачем и как ?
 
модели акторов в с++ миф или реальность
модели акторов в с++ миф или реальностьмодели акторов в с++ миф или реальность
модели акторов в с++ миф или реальность
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 

Similar to Современный статический анализ кода: что умеет он, чего не умели линтеры

Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеAndrey Karpov
 
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
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаAndrey Karpov
 
Как создать качественный статический анализатор
Как создать качественный статический анализаторКак создать качественный статический анализатор
Как создать качественный статический анализаторAndrey Karpov
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernelsDenis Efremov
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Andrey Karpov
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...Iosif Itkin
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыPositive Development User Group
 
Применение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПОПрименение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПОAndrey Karpov
 
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studio
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studioчто пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studio
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studiocorehard_by
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаAndrey Karpov
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаcorehard_by
 

Similar to Современный статический анализ кода: что умеет он, чего не умели линтеры (20)

Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
SAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в кодеSAST и Application Security: как бороться с уязвимостями в коде
SAST и Application Security: как бороться с уязвимостями в коде
 
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#
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Как создать качественный статический анализатор
Как создать качественный статический анализаторКак создать качественный статический анализатор
Как создать качественный статический анализатор
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 
Formal verification of operating system kernels
Formal verification of operating system kernelsFormal verification of operating system kernels
Formal verification of operating system kernels
 
Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?Статический анализ: ищем ошибки... и уязвимости?
Статический анализ: ищем ошибки... и уязвимости?
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
 
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструментыТехнологии анализа бинарного кода приложений: требования, проблемы, инструменты
Технологии анализа бинарного кода приложений: требования, проблемы, инструменты
 
Применение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПОПрименение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПО
 
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studio
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studioчто пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studio
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studio
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 

More from corehard_by

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...corehard_by
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...corehard_by
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотниковcorehard_by
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титовcorehard_by
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...corehard_by
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...corehard_by
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...corehard_by
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филоновcorehard_by
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukićcorehard_by
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakovacorehard_by
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...corehard_by
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019corehard_by
 

More from corehard_by (20)

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 

Современный статический анализ кода: что умеет он, чего не умели линтеры

  • 1. Современный статический анализ кода: что умеет он, чего не умели линтеры Павел Беликов PVS-Studio
  • 2. Содержание • чем должен и не должен заниматься статический анализ • методики анализа: от первых утилит до современных анализаторов • поиск по подстроке/регулярным выражениям • pattern-based analysis • symbolic execution • межпроцедурный анализ • современная инфраструктура анализаторов 2
  • 3. Немного о нас • PVS-Studio - статический анализатор C, C++, C# кода • Поддерживаются Windows и Linux (C, C++) • Плагин для Visual Studio • Средства для быстрой проверки (Standalone, pvs-studio-analyzer) 3
  • 4. Цели статического анализа • поиск ошибок в логике программы • поиск уязвимостей • упрощение процесса разработки • экономия 4
  • 5. Чем не должен заниматься статический анализ • поиск “стилистических” ошибок • соответствие каким-либо guideline • предложениями переписать код на новый стандарт Почему? • для всего это есть отдельные инструменты • в большом проекте таких срабатываний будут тысячи 5
  • 6. Как определить качество статического анализа Существуют два типа ошибок, которым подвержены анализаторы: • ошибки первого рода - false positives • ошибки второго рода - false negatives Ценность анализа в минимальном количестве ошибок первого рода. Никто не будет пользоваться анализатором, который выдаёт 1000 ложных срабатываний на одну ошибку. 6
  • 7. С чего всё начиналось • использование небезопасных функций • возможные опечатки • типовые ошибки, связанные с недостаточным знанием языка • несоответствие принятому стилю кодирования • такие ошибки ищутся и сейчас, отличаются методики поиска • многие из них уже есть в компиляторах • поиск по подстроке, регулярным выражениям или лексем ведёт к излишнему количеству ложных срабатываний 7
  • 8. Пример опечатки Ошибка из проекта Linux char *stime[] = { "400ms", "5min", "10min", "15min", "20min", "25min", "30min" "No timeout" }; Предупреждение PVS-Studio: V653 A suspicious string consisting of two parts is used for array initialization. It is possible that a comma is missing. Consider inspecting this literal: «30min» «No timeout». lp8788-charger.c 657 8
  • 9. Поиск по регулярным выражениям Некоторые их используют до сих пор. Пример из CppCheck: <?xml version="1.0"?> <rule version="1"> <pattern> if ( ([!] )*?(strlen) ( w+? ) ([>] [0] )*?) { </pattern> <message> <id>StrlenEmptyString</id> <severity>performance</severity> <summary>Using strlen() to check if a string is empty is not efficient.</summary> </message> </rule> Но у такого подхода серьёзные проблемы с масштабируемостью. 9
  • 10. С чем же работает современный статический анализ • представление кода в виде AST (или байткода, но это отдельный разговор) • AST должно быть типизированным • полная семантическая модель программы 10
  • 11. Pattern-based analysis • относительно прост в реализации • позволяет находить опечатки и последствия Copy-Paste • в основе метода - поиск какого-то паттерна в АСТ • для исключений может использоваться информация о типах и значениях 11
  • 12. Пример поиска паттерна Ошибка из проекта Oracle VM Virtual Box static const uint8_t g_acDaysInMonths[12]; static const uint8_t g_acDaysInMonthsLeap[12]; static PRTTIME rtTimeNormalizeInternal(PRTTIME pTime) { .... unsigned cDaysInMonth = fLeapYear ? g_acDaysInMonthsLeap[pTime->u8Month - 1] : g_acDaysInMonthsLeap[pTime->u8Month - 1]; .... } Предупреждение PVS-Studio: V583 The '?:' operator, regardless of its conditional expression, always returns one and the same value: g_acDaysInMonthsLeap[pTime->u8Month - 1]. time.cpp 453 12
  • 13. Пример паттерна c исключением Ошибка из проекта Serious Engine 1 v.1.10 void CWorldEditorApp::OnConvertWorlds() { .... char achrLine[256]; .... fsFileList.Open_t( fnFileList); while( !fsFileList.AtEOF()) { fsFileList.GetLine_t( achrLine, 256); // increase counter only for lines that are not blank if( achrLine != "") ctLines++; } fsFileList.Close(); .... } Предупреждение PVS-Studio: V547 Expression 'achrLine != ""' is always true. To compare strings you should use strcmp() function. worldeditor.cpp 2254 13
  • 14. Пример паттерна c исключением #define MY_STREQ(a,b) ((a) == (b) || strcmp(a, b) == 0) 14
  • 15. Паттерн с типами Ошибка из проекта Wolfenstein 3D void BG_ParseConditionBits( char **text_pp, animStringItem_t *stringTable, int condIndex, int result[2] ) { ... memset( result, 0, sizeof( result ) ); ... } Предупреждение PVS-Studio: V511 The sizeof() operator returns size of the pointer, and not of the array, in 'sizeof (result)' expression. cgame bg_animation.c 807 15
  • 16. Иногда и этого мало Ошибка из проекта Linux #define CFS_FAIL_TIMEOUT(id, secs) cfs_fail_timeout_set(id, 0, secs * 1000, CFS_FAIL_LOC_NOSET) #define OBD_FAIL_TIMEOUT(id, secs) CFS_FAIL_TIMEOUT(id, secs) int ptl_send_rpc(struct ptlrpc_request *request, int noreply) { .... OBD_FAIL_TIMEOUT(OBD_FAIL_PTLRPC_DELAY_SEND, request->rq_timeout + 5); .... } 16 Предупреждение PVS-Studio: V733 It is possible that macro expansion resulted in incorrect evaluation order. Check expression: request- >rq_timeout + 5 * 1000. niobuf.c 637
  • 17. Symbolic execution • самая сложная и самая полезная часть анализатора • опирается на control flow analysis, data flow analysis • позволяет осуществлять bounds checking, pointer analysis • вычисление диапазонов переменной позволяет сэкономить на времени анализа 17
  • 18. Разыменование нулевого указателя Ошибка из проекта D programming language Expression *getVarExp(Loc loc, InterState *istate, Declaration *d, CtfeGoal goal) { .... VarDeclaration *v = d->isVarDeclaration(); if (v) { .... } else if (s) { if (s->dsym->toInitializer() == s->sym) .... else error(loc, "cannot interpret symbol %s at compile time", v->toChars()); } .... } 18 Предупреждение PVS-Studio: V522 Dereferencing of the null pointer 'v' might take place. interpret.c 1711
  • 19. Разыменование нулевого указателя • можно попытаться искать такие ошибки в AST, но не стоит • вычислив значение указателя, мы можем находить более сложные ошибки Пример: void report_error() { throw std::runtime_error(“error”); } int* new_int() { .... int* p = some_condition ? new int : nullptr; if (p == nullptr) // <= условие report_error(); // <= не возвращает управления *p = 0; // <= p != nullptr, всё хорошо return p; } 19
  • 20. Разыменование нулевого указателя Ошибка из проекта Clang Expected<std::unique_ptr<PDBFile>> PDBFileBuilder::build( std::unique_ptr<msf::WritableStream> PdbFileBuffer) { .... auto File = llvm::make_unique<PDBFile>( std::move(PdbFileBuffer), Allocator); File->ContainerLayout = *ExpectedLayout; if (Info) { auto ExpectedInfo = Info->build(*File, *PdbFileBuffer); .... } 20 Предупреждение PVS-Studio: V522 Dereferencing of the null pointer 'PdbFileBuffer' might take place. PDBFileBuilder.cpp 106
  • 21. Разыменование нулевого указателя Ошибка из проекта Unreal Engine 4 void UGameplayStatics::DeactivateReverbEffect(....) { if (GEngine || !GEngine->UseSound()) { return; } UWorld* ThisWorld = GEngine->GetWorldFromContextObject(....); .... } Предупреждение PVS-Studio: V522 Dereferencing of the null pointer 'GEngine' might take place. Check the logical condition. gameplaystatics.cpp 988 21
  • 22. Control flow analysis Какие конструкции не вернут управление: ● return ● исключение ● стандартная функция ● [[noreturn]] ● __attribute__((noreturn)) ● __declspec(noreturn) ● создание временного объекта, деструктор которого бросает исключение ● вызов пользовательской функции, не возвращающей управление ● goto ● break, continue Всё это нужно учитывать при вычислении возможных значений переменной 22
  • 23. Анализ функции Ошибка из проекта Chromium static int BlockSizeForFileType(FileType file_type) { switch (file_type) { .... default: return 0; } } static int RequiredBlocks(int size, FileType file_type) { int block_size = BlockSizeForFileType(file_type); return (size + block_size - 1) / block_size; } Предупреждение PVS-Studio: V609 Divide by zero. Denominator range [0..4096]. addr.h 159 23
  • 24. Bounds checking Пример из мира 64-битных ошибок: unsigned short f(); int g(); void test(void *p, void *p2) { int x = f(); memset(p, 0, x); // <= всё нормально, x = [0; 65535] int y = g(); memset(p2, 0, y); // <= подозрительно, int -> memsize } 24
  • 25. Lifetime safety Ошибка из проекта Clang SingleLinkedListIterator<T> &operator++(int) { SingleLinkedListIterator res = *this; ++*this; return res; } Предупреждение PVS-Studio: V558 Function returns the reference to temporary local object: res. LiveInterval.h 679 25
  • 26. Путаница в new/malloc Ошибка из проекта Mozilla Thunderbird NPError NPP_New(....) { .... InstanceData* instanceData = new InstanceData; .... free(instanceData); .... } Предупреждение PVS-Studio: V611 The memory was allocated using 'new' operator but was released using the 'free' function. Consider inspecting operation logics behind the 'instanceData' variable. nptest.cpp 971 26
  • 27. Простой пример void foo() { int x = 1; .... if (x == 1) // <= всегда true, ошибка или нет? return; } • часто такой код используют для compile-time отключения функционала • пример хорошо иллюстрирует неэффективность маленьких искусственных тестов 27
  • 28. Межпроцедурный анализ Рекурсивный анализ • очень точный • очень медленный Аннотирование • можно составлять аннотации, анализируя тело функции • для популярных библиотек составляются ручные аннотации • отлично масштабируется 28
  • 29. Проблемы межпроцедурного анализа • виртуальные методы • указатели на функции • межмодульный анализ • динамическая линковка 29
  • 30. Анализ функции • возможные значения • область значений для параметров функции • модификация аргументов, переданных по ссылке или указателю • анализ на noreturn • отсутствие побочных эффектов 30
  • 31. Аннотации: нет состояния Ошибка из проекта Clang std::pair<Function *, Function *> llvm::createSanitizerCtorAndInitFunctions( .... ArrayRef<Type *> InitArgTypes, ArrayRef<Value *> InitArgs, ....) { assert(!InitName.empty() && "Expected init function name"); assert(InitArgTypes.size() == InitArgTypes.size() && "Sanitizer's init function expects " "different number of arguments"); .... } 31 Предупреждение PVS-Studio: V501 There are identical sub-expressions 'InitArgTypes.size()' to the left and to the right of the '==' operator. ModuleUtils.cpp 107
  • 32. Аннотации: строка в определённом регистре Ошибка из проекта CodeLite struct NodeJSHandle { wxString type; .... bool IsString() const {return type.Lower() == "string";} bool IsArray() const {return type.Lower() == "Array"; } }; Предупреждение PVS-Studio: V547 Expression 'type.Lower() == "Array"' is always false. NodeJSOuptutParser.h 61 32
  • 33. Аннотации: значение должно быть использовано Ошибка из проекта Qt int main(int argc, char **argv) { .... QByteArray arg(argv[a]); .... arg = arg.mid(1); arg.toLower(); if (arg == "o") .... } Предупреждение PVS-Studio: V530 The return value of function 'toLower' is required to be utilized. main.cpp 72 33
  • 34. Аннотации: restrict аргументы Ошибка из проекта Chromium void DiskCacheEntryTest::ExternalSyncIOBackground(....) { .... scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize1)); scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize2)); .... EXPECT_EQ(0, memcmp(buffer2->data(), buffer2->data(), 10000)); .... } Предупреждение PVS-Studio: V549 The first argument of 'memcmp' function is equal to the second argument. entry_unittest.cc 39334
  • 35. Аннотации: аргумент функции - количество байт Ошибка из проекта Miranda IM static BOOL ImageArray_Alloc(LP_IMAGE_ARRAY_DATA iad, int size) { ... memset(&iad->nodes[iad->nodes_allocated_size], (size_grow - iad->nodes_allocated_size) * sizeof(IMAGE_ARRAY_DATA_NODE), 0); ... } Предупреждение PVS-Studio: V575 The 'memcmp' function processes '0' elements. Inspect the 'third' argument. clist_modern modern_image_array.cpp 59 35
  • 36. Пользовательские аннотации • требуют большой работы по аннотированию всей кодовой базы • индивидуальны для инструмента • затрудняет чтение кода • анализатор должен работать сразу 36
  • 37. Тестирование • есть только один верный способ тестирования - реальные проекты • это помогает понять, какие правила дают много ложных срабатываний • нельзя ругаться на код, если это общепринятая практика • даже если вы с ней не согласны 37
  • 38. Написание своих правил для анализатора • хорошо для линтеров, проверяющих простые паттерны ошибок • но плохо для статических анализаторов • написать API, позволяющий работать со всеми видами анализа - огромная работа • сделать его стабильным ещё сложнее • пользователи не захотят писать полноценные правила для анализатора 38
  • 39. Ранжирование результатов анализа • не все ошибки одинаково опасны • некоторые диагностики могут тяготеть к ложным срабатываниям • логично разделить ошибки на уровни • отдельные категории диагностик: 64-битные, микрооптимизации 39
  • 40. Как осуществить такой анализ? • анализ исходных файлов уже не работает • отталкиваться приходится от конкретных компиляторов • сборочные системы 40
  • 41. Как осуществить такой анализ? • такое многообразие окружений накладывает свои требования • необходимо уметь проверять проект, независимо от системы сборки • необходимо парсить код для любого компилятора • необходимо всё это тестировать (ура, больше исключений) 41
  • 42. Интеграция в процесс разработки • статический анализатор - инструмент для разработчика • инкрементальный анализ • приемлемая скорость анализа • подавление ложных срабатываний - assert, комментарии, база разметки 42
  • 43. Интеграция в QA • запуск на сборочных серверах • рассылка html-отчёта по почте • интеграция в Code Quality платформы (например, SonarQube) 43
  • 44. Q&A Почта: support@viva64.com Блог на хабре: https://habrahabr.ru/company/pvs-studio/ Скачать PVS-Studio: http://www.viva64.com/ru/pvs-studio/ 44 Для открытых некоммерческих проектов есть бесплатная лицензия