SlideShare a Scribd company logo
1 of 33
Принципы работы статического
анализатора кода PVS-Studio
Авторы:
к.т.н. Евгений Рыжков, evg@viva64.com
к.ф.-м.н. Андрей Карпов, karpov@viva64.com
ООО "СиПроВер" (www.viva64.com)
• Занимаемся разработкой, продвижением и продажей
собственного программного продукта.
• Офис: г. Тула, 200 км от Москвы.
• Штат: 24 человека
PVS-Studio
• Более 320 диагностик для C, C++
• Более 120 диагностик для C#
• Windows
• Linux
• Плагин для Visual Studio
• Быстрый старт (мониторинг компиляции)
• SonarQube
Наши достижения
• Для рекламы мы проверяем открытые проекты. На данный момент мы
проверили около 270 проектов.
• Побочный эффект: нашли более 10000 ошибок в открытых проектах, не задаваясь
такой целью.
• В среднем 40 ошибок на проект – вроде немного.
• Важно ещё раз подчеркнуть, что это побочный эффект. У нас нет цели найти как
можно больше ошибок. Часто мы останавливаемся, когда нашли достаточное
количество дефектов в проекте, чтобы написать статью.
• Вывод: легко проверять даже незнакомые проекты и находить в них ошибки.
В начале, что мы НЕ ИСПОЛЬЗУЕМ
Мы не используем математический
аппарат грамматик
• Анализатор работает на более высоком уровне
• Анализируется дерево разбора
• Для построения дерева мы опираемся на уже существующие
компоненты:
• Внешний препроцессор
• Библиотека OpenC++, которую мы дорабатываем с развитием C++ по
мере необходимости (собственно от OpenC++ уже ничего не осталось)
• При работе с C# кодом мы опираемся на Roslyn
Мы не используем методики доказательства
правильности программ (program proof).
• PVS-Studio не имеет ничего общего с Prototype Verification System
(PVS) http://pvs.csl.sri.com/
• PVS-Studio сокращение от OOO "Program Verification Systems"
(ООО "Системы программной верификации")
Мы не используем поиск подстрок (string matching)
и регулярные выражения (regular expressions)
• Тупиковый путь
• Подводит даже в простейших ситуациях
• Пример: if (A+B == A+B)
• A+B == B+A
• A+(B) == (A)+B
• ((A+B)) == A+B
• Более фатально: типы, размеры объектов, наследование, значения
переменных и так далее
Что МЫ используем
Детали анализа C++ и C# кода разнятся, но мы не будем делать в
докладе уточнения.
Pattern-based analysis
• Сопоставление с шаблоном на основе дерева разбора
• Применяется для поиска мест в исходном коде, которые похожи
на известные шаблоны кода с ошибкой
• Сложность диагностик крайне разнится
• В некоторых случаях работают эмпирические алгоритмы
if ((*path)[0]->e->dest->loop_father != path->last()->e->....)
{
delete_jump_thread_path (path);
e->aux = NULL;
ei_next (&ei;);
}
else
{
delete_jump_thread_path (path);
e->aux = NULL;
ei_next (&ei;);
}
Простой случай: copy-paste
Проект GCC
V523 The 'then' statement is equivalent to the 'else' statement. tree-ssa-
threadupdate.c 2596
Средний случай: проверка не той переменной
public override Predicate JoinWith(Predicate other)
{
var right = other as PredicateNullness;
if (other != null)
{
if (this.value == right.value)
{
Проект CodeContracts
V3019 Possibly an incorrect variable is compared to null after type conversion
using 'as' keyword. Check variables 'other', 'right'. CallerInvariant.cs 189
Сложный случай: неудачный макрос
#define ICB2400_VPINFO_PORT_OFF(chan) 
(ICB2400_VPINFO_OFF + 
sizeof (isp_icb_2400_vpinfo_t) + 
(chan * ICB2400_VPOPT_WRITE_SIZE))
off += ICB2400_VPINFO_PORT_OFF(chan - 1);
V733 It is possible that macro expansion resulted in incorrect evaluation
order. Check expression: chan - 1 * 20. isp.c 2301
Проект FreeBSD
Type inference
• Вывод типов на основе семантической модели программы
позволяет анализатору иметь полную информацию о всех
переменных и выражениях, встречающихся в коде
• Важно для выявления ошибок
• Важно для исключений
• Особенно важна информация о классах
Типы важны для выявления ошибок
Проект Cocos2d-x
WCHAR *gai_strerrorW(int ecode);
#define gai_strerror gai_strerrorW
fprintf(stderr, "net_listen error for %s: %s",
serv, gai_strerror(n));
V576 Incorrect format. Consider checking the fourth actual argument of
the 'fprintf' function. The pointer to string of char type symbols is
expected. ccconsole.cpp 341
Типы важны для исключений
// volatile переменная присваивается сама себе
volatile int *ptr;
....
*ptr = *ptr; // Нет срабатывания V570
Особенно важна информация о классах:
например, иерархия наследования
class sg_throwable : public std::exception { .... };
class sg_exception : public sg_throwable { .... };
if (!aInstall) {
sg_exception("missing argument to scheduleToUpdate");
}
V596 The object was created but it is not being used. The 'throw' keyword
could be missing: throw sg_exception(FOO); root.cxx 239
Проект FlightGear
Symbolic execution
• Символьное выполнение позволяет вычислять значения
переменных, которые могут приводить к ошибкам, производить
проверку диапазонов (range checking) значений
• Один из самых важных механизмов:
• Переполнения
• Утечки памяти
• Выход за границы массива
• Нулевые указатели / ссылки
• Бессмысленные условия
• Деление на 0
• И так далее
Значения переменных: размер массива,
индексы
Handle<YieldTermStructure> md0Yts() {
double q6mh[] = {
0.0001,0.0001,0.0001,0.0003,0.00055,0.0009,0.0014,0.0019,
0.0025,0.0031,0.00325,0.00313,0.0031,0.00307,0.00309,
........................................................
0.02336,0.02407,0.0245 }; 60 элементов
....
for(int i=0;i<10+18+37;i++) { i < 65
q6m.push_back(
boost::shared_ptr<Quote>(new SimpleQuote(q6mh[i])));
Проект QuantLib
V557 Array overrun is possible. The value of 'i' index could reach 64.
markovfunctional.cpp 176
Значения переменных: использование
условий для определения диапазона
std::string rangeTypeLabel(int idx)
{
const char* rangeTypeLabels[] = {"Self", "Touch", "Target"};
if (idx >= 0 && idx <= 3)
return rangeTypeLabels[idx];
else
return "Invalid";
}
V557 Array overrun is possible. The value of 'idx' index could reach 3.
esmtool labels.cpp 502
Проект OpenMW
Значения функций
static inline size_t UnboxedTypeSize(JSValueType type)
{
switch (type) {
.......
default: return 0;
}
}
Minstruction *loadUnboxedProperty(size_t offset, ....)
{
size_t index = offset / UnboxedTypeSize(unboxedType);
Проект Thunderbird
V609 Divide by zero. Denominator range [0..8]. ionbuilder.cpp 10922
Значения переменных: указатели / ссылки
if (providerName == null)
{
ProviderNotFoundException e =
new ProviderNotFoundException(
providerName.ToString(),
SessionStateCategory.CmdletProvider,
"ProviderNotFound",
SessionStateStrings.ProviderNotFound);
throw e;
V3080 Possible null dereference. Consider inspecting 'providerName'.
System.Management.Automation SessionStateProviderAPIs.cs 1004
Проект PowerShell
Method annotations
• Аннотирование методов предоставляет больше информации об
используемых методах, чем может быть получено путём анализа
только их сигнатуры.
• C/C++. На данный момент проаннотировано 6570 функций
(стандартные библиотеки C и C++, POSIX, MFC, Qt, ZLib и так
далее).
• C#. На данный момент проаннотировано 920 функций.
Пример аннотирования функции memcmp
C_"int memcmp(const void *buf1, const void *buf2, size_t count);"
ADD(REENTERABLE | RET_USE | F_MEMCMP | STRCMP | HARD_TEST | INT_STATUS,
nullptr, nullptr, "memcmp", POINTER_1, POINTER_2, BYTE_COUNT);
• C_ - вспомогательный механизм контроля аннотаций (юнит-тесты)
• REENTERABLE – повторный вызов с теми же аргументами даст тот-же результат
• RET_USE – результат должен быть использован
• F_MEMCMP – запуск определённых проверок выхода за границы буфера
• STR_CMP – При равенстве функция возвращает 0.
• HARD_TEST – особая функция. Некоторые программисты определяют
собственные такие функции в своих namespace. Не учитывать namespace.
• INT_STATUS – результат явно сравнивать с 1 или -1.
• POINTER_1, POINTER_2 – указатели должны быть не нулевыми и разными.
• BYTE_COUNT – параметр задает количество байт и должен быть больше 0.
Аннотация memcmp: проверка результата
bool operator()(const GUID& _Key1, const GUID& _Key2) const
{
return memcmp(&_Key1, &_Key2, sizeof(GUID)) == -1;
}
Проект CoreCLR
V698 Expression 'memcmp(....) == -1' is incorrect. This function can
return not only the value '-1', but any negative value. Consider using
'memcmp(....) < 0' instead. sos util.cpp 142
Аннотация memcmp: хранение результата
Проект Firebird
V642 Saving the 'memcmp' function result inside the 'short' type variable is
inappropriate. The significant bits could be lost breaking the program's logic.
texttype.cpp 3
SSHORT TextType::compare(ULONG len1, const UCHAR* str1,
ULONG len2, const UCHAR* str2)
{
....
SSHORT cmp = memcmp(str1, str2, MIN(len1, len2));
if (cmp == 0)
cmp = (len1 < len2 ? -1 : (len1 > len2 ? 1 : 0));
return cmp;
}
Аннотация memcmp: неверный аргумент
Проект GLG3D
V575 The 'memcmp' function processes '0' elements. Inspect
the 'third' argument. graphics3D matrix4.cpp 269
bool Matrix4::operator==(const Matrix4& other) const {
if (memcmp(this, &other, sizeof(Matrix4) == 0)) {
return true;
}
...
}
static int
psymbol_compare (const void *addr1, const void *addr2,
int length)
{
struct partial_symbol *sym1 = (struct partial_symbol *) addr1;
struct partial_symbol *sym2 = (struct partial_symbol *) addr2;
return (memcmp (&sym1->ginfo.value, &sym1->ginfo.value,
sizeof (sym1->ginfo.value)) == 0
&& .......
Аннотация memcmp: разные аргументы
Проект GDB
V549 The first argument of 'memcmp' function is equal to the second
argument. psymtab.c 1580
dst_s_read_private_key_file(....)
{
....
if (memcmp(in_buff, "Private-key-format: v", 20) != 0)
goto fail;
....
} 21 символ
Аннотация memcmp: buffer underrun
Проект Haiku
V512 A call of the 'memcmp' function will lead to underflow of the
buffer '"Private-key-format: v"'. dst_api.c 858
Аннотация memcmp: нет состояния
Проект PHP
V501 There are identical sub-expressions '!memcmp("auto", charset_hint,
4)' to the left and to the right of the '||' operator. html.c 396
if ((len == 4) /* sizeof (none|auto|pass) */ &&
(!memcmp("pass", charset_hint, 4) ||
!memcmp("auto", charset_hint, 4) ||
!memcmp("auto", charset_hint, 4)))
Аннотирование пользовательских функций
• Практически отсутствует (кроме отдельных элементов, как
собственной функции printf)
• Развивать механизм нет смысла
• В больших проектах никто не станет тратить месяцы на разметку
• Анализатор должен работать сразу
Тестирование анализатора
• Тестирование анализатора важнейшая часть процесса его
разработки
• Самое сложное в статическом анализе: не ругаться
• Большая тестовая база:
• C++ Windows (Visual C++): 120 проектов
• C++ Linux (GCC): ещё 34 проекта
• C# Windows: 54 проекта
Вышлем по почте более подробный
вариант презентации
• Написать письмо: support@viva64.com
• Подписаться на твиттер: @Code_Analysis
• Скачать PVS-Studio для Windows:
http://www.viva64.com/ru/pvs-studio/
• Скачать PVS-Studio для Linux:
http://www.viva64.com/ru/pvs-studio-download-linux/

More Related Content

What's hot

Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияPlatonov Sergey
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Dima Dzuba
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and catscorehard_by
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IPlatonov Sergey
 
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Tatyanazaxarova
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 

What's hot (20)

Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализацияЕвгений Зуев, С++ в России: Стандарт языка и его реализация
Евгений Зуев, С++ в России: Стандарт языка и его реализация
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 

Viewers also liked

COLOR PSYCHOLOGY OF MIDDLE EAST COMPANY LOGOS [Infographics]
COLOR PSYCHOLOGY OF MIDDLE EAST COMPANY LOGOS [Infographics]COLOR PSYCHOLOGY OF MIDDLE EAST COMPANY LOGOS [Infographics]
COLOR PSYCHOLOGY OF MIDDLE EAST COMPANY LOGOS [Infographics]Lava Brands
 
Autoidentificacion del uso del lenguaje
Autoidentificacion del uso del lenguajeAutoidentificacion del uso del lenguaje
Autoidentificacion del uso del lenguajenalma pimentel
 
Mortgage Compliance Magazine - July 2016
Mortgage Compliance Magazine - July 2016Mortgage Compliance Magazine - July 2016
Mortgage Compliance Magazine - July 2016Heather Blasko
 
Competitic Dématérialisation des documents - numerique en entreprise
Competitic  Dématérialisation des documents - numerique en entrepriseCompetitic  Dématérialisation des documents - numerique en entreprise
Competitic Dématérialisation des documents - numerique en entrepriseCOMPETITIC
 
Presentazione rbrake mar16
Presentazione rbrake mar16Presentazione rbrake mar16
Presentazione rbrake mar16Dino De Masi
 
Продающий сайт - Hospitality IT, Александр Орлов
Продающий сайт - Hospitality IT, Александр ОрловПродающий сайт - Hospitality IT, Александр Орлов
Продающий сайт - Hospitality IT, Александр ОрловOlga Prokhorova
 
Rilevamento di facce in flussi video per l'ausilio ai non vedenti - Presentaz...
Rilevamento di facce in flussi video per l'ausilio ai non vedenti - Presentaz...Rilevamento di facce in flussi video per l'ausilio ai non vedenti - Presentaz...
Rilevamento di facce in flussi video per l'ausilio ai non vedenti - Presentaz...temp temp
 
Cadime algoritmo 2016. Tratamiento de la DM tipo 2
Cadime algoritmo 2016. Tratamiento de la DM tipo 2Cadime algoritmo 2016. Tratamiento de la DM tipo 2
Cadime algoritmo 2016. Tratamiento de la DM tipo 2Ricardo Ruiz de Adana
 
Casal que faz coach, Faz sucesso - Workshop CESFI - Santa Maria 27/06/2015
Casal que faz coach, Faz sucesso - Workshop CESFI - Santa Maria 27/06/2015Casal que faz coach, Faz sucesso - Workshop CESFI - Santa Maria 27/06/2015
Casal que faz coach, Faz sucesso - Workshop CESFI - Santa Maria 27/06/2015Dolores Bordignon
 
The Secrets is with the Righteous - Read only
The Secrets is with the Righteous - Read onlyThe Secrets is with the Righteous - Read only
The Secrets is with the Righteous - Read onlyDr. Bobbie E. Emerald Way
 

Viewers also liked (11)

COLOR PSYCHOLOGY OF MIDDLE EAST COMPANY LOGOS [Infographics]
COLOR PSYCHOLOGY OF MIDDLE EAST COMPANY LOGOS [Infographics]COLOR PSYCHOLOGY OF MIDDLE EAST COMPANY LOGOS [Infographics]
COLOR PSYCHOLOGY OF MIDDLE EAST COMPANY LOGOS [Infographics]
 
Tanyaresume2
Tanyaresume2Tanyaresume2
Tanyaresume2
 
Autoidentificacion del uso del lenguaje
Autoidentificacion del uso del lenguajeAutoidentificacion del uso del lenguaje
Autoidentificacion del uso del lenguaje
 
Mortgage Compliance Magazine - July 2016
Mortgage Compliance Magazine - July 2016Mortgage Compliance Magazine - July 2016
Mortgage Compliance Magazine - July 2016
 
Competitic Dématérialisation des documents - numerique en entreprise
Competitic  Dématérialisation des documents - numerique en entrepriseCompetitic  Dématérialisation des documents - numerique en entreprise
Competitic Dématérialisation des documents - numerique en entreprise
 
Presentazione rbrake mar16
Presentazione rbrake mar16Presentazione rbrake mar16
Presentazione rbrake mar16
 
Продающий сайт - Hospitality IT, Александр Орлов
Продающий сайт - Hospitality IT, Александр ОрловПродающий сайт - Hospitality IT, Александр Орлов
Продающий сайт - Hospitality IT, Александр Орлов
 
Rilevamento di facce in flussi video per l'ausilio ai non vedenti - Presentaz...
Rilevamento di facce in flussi video per l'ausilio ai non vedenti - Presentaz...Rilevamento di facce in flussi video per l'ausilio ai non vedenti - Presentaz...
Rilevamento di facce in flussi video per l'ausilio ai non vedenti - Presentaz...
 
Cadime algoritmo 2016. Tratamiento de la DM tipo 2
Cadime algoritmo 2016. Tratamiento de la DM tipo 2Cadime algoritmo 2016. Tratamiento de la DM tipo 2
Cadime algoritmo 2016. Tratamiento de la DM tipo 2
 
Casal que faz coach, Faz sucesso - Workshop CESFI - Santa Maria 27/06/2015
Casal que faz coach, Faz sucesso - Workshop CESFI - Santa Maria 27/06/2015Casal que faz coach, Faz sucesso - Workshop CESFI - Santa Maria 27/06/2015
Casal que faz coach, Faz sucesso - Workshop CESFI - Santa Maria 27/06/2015
 
The Secrets is with the Righteous - Read only
The Secrets is with the Righteous - Read onlyThe Secrets is with the Righteous - Read only
The Secrets is with the Righteous - Read only
 

Similar to Принципы работы статического анализатора кода PVS-Studio

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
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Пояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteПояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteTatyanazaxarova
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибкиAndrey Karpov
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська Tatyanazaxarova
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаAndrey Karpov
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаcorehard_by
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаAndrey Karpov
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Mikhail Kurnosov
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
 

Similar to Принципы работы статического анализатора кода PVS-Studio (20)

PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Пояснения к статье про Copy-Paste
Пояснения к статье про Copy-PasteПояснения к статье про Copy-Paste
Пояснения к статье про Copy-Paste
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
PVS-Studio vs Chromium
PVS-Studio vs ChromiumPVS-Studio vs Chromium
PVS-Studio vs Chromium
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Фибоначчиевы кучи (Fibonacci heaps)
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Что могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщикиЧто могут статические анализаторы, чего не могут программисты и тестировщики
Что могут статические анализаторы, чего не могут программисты и тестировщики
 

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
 

Принципы работы статического анализатора кода PVS-Studio

  • 1. Принципы работы статического анализатора кода PVS-Studio Авторы: к.т.н. Евгений Рыжков, evg@viva64.com к.ф.-м.н. Андрей Карпов, karpov@viva64.com
  • 2. ООО "СиПроВер" (www.viva64.com) • Занимаемся разработкой, продвижением и продажей собственного программного продукта. • Офис: г. Тула, 200 км от Москвы. • Штат: 24 человека
  • 3. PVS-Studio • Более 320 диагностик для C, C++ • Более 120 диагностик для C# • Windows • Linux • Плагин для Visual Studio • Быстрый старт (мониторинг компиляции) • SonarQube
  • 4. Наши достижения • Для рекламы мы проверяем открытые проекты. На данный момент мы проверили около 270 проектов. • Побочный эффект: нашли более 10000 ошибок в открытых проектах, не задаваясь такой целью. • В среднем 40 ошибок на проект – вроде немного. • Важно ещё раз подчеркнуть, что это побочный эффект. У нас нет цели найти как можно больше ошибок. Часто мы останавливаемся, когда нашли достаточное количество дефектов в проекте, чтобы написать статью. • Вывод: легко проверять даже незнакомые проекты и находить в них ошибки.
  • 5. В начале, что мы НЕ ИСПОЛЬЗУЕМ
  • 6. Мы не используем математический аппарат грамматик • Анализатор работает на более высоком уровне • Анализируется дерево разбора • Для построения дерева мы опираемся на уже существующие компоненты: • Внешний препроцессор • Библиотека OpenC++, которую мы дорабатываем с развитием C++ по мере необходимости (собственно от OpenC++ уже ничего не осталось) • При работе с C# кодом мы опираемся на Roslyn
  • 7. Мы не используем методики доказательства правильности программ (program proof). • PVS-Studio не имеет ничего общего с Prototype Verification System (PVS) http://pvs.csl.sri.com/ • PVS-Studio сокращение от OOO "Program Verification Systems" (ООО "Системы программной верификации")
  • 8. Мы не используем поиск подстрок (string matching) и регулярные выражения (regular expressions) • Тупиковый путь • Подводит даже в простейших ситуациях • Пример: if (A+B == A+B) • A+B == B+A • A+(B) == (A)+B • ((A+B)) == A+B • Более фатально: типы, размеры объектов, наследование, значения переменных и так далее
  • 9. Что МЫ используем Детали анализа C++ и C# кода разнятся, но мы не будем делать в докладе уточнения.
  • 10. Pattern-based analysis • Сопоставление с шаблоном на основе дерева разбора • Применяется для поиска мест в исходном коде, которые похожи на известные шаблоны кода с ошибкой • Сложность диагностик крайне разнится • В некоторых случаях работают эмпирические алгоритмы
  • 11. if ((*path)[0]->e->dest->loop_father != path->last()->e->....) { delete_jump_thread_path (path); e->aux = NULL; ei_next (&ei;); } else { delete_jump_thread_path (path); e->aux = NULL; ei_next (&ei;); } Простой случай: copy-paste Проект GCC V523 The 'then' statement is equivalent to the 'else' statement. tree-ssa- threadupdate.c 2596
  • 12. Средний случай: проверка не той переменной public override Predicate JoinWith(Predicate other) { var right = other as PredicateNullness; if (other != null) { if (this.value == right.value) { Проект CodeContracts V3019 Possibly an incorrect variable is compared to null after type conversion using 'as' keyword. Check variables 'other', 'right'. CallerInvariant.cs 189
  • 13. Сложный случай: неудачный макрос #define ICB2400_VPINFO_PORT_OFF(chan) (ICB2400_VPINFO_OFF + sizeof (isp_icb_2400_vpinfo_t) + (chan * ICB2400_VPOPT_WRITE_SIZE)) off += ICB2400_VPINFO_PORT_OFF(chan - 1); V733 It is possible that macro expansion resulted in incorrect evaluation order. Check expression: chan - 1 * 20. isp.c 2301 Проект FreeBSD
  • 14. Type inference • Вывод типов на основе семантической модели программы позволяет анализатору иметь полную информацию о всех переменных и выражениях, встречающихся в коде • Важно для выявления ошибок • Важно для исключений • Особенно важна информация о классах
  • 15. Типы важны для выявления ошибок Проект Cocos2d-x WCHAR *gai_strerrorW(int ecode); #define gai_strerror gai_strerrorW fprintf(stderr, "net_listen error for %s: %s", serv, gai_strerror(n)); V576 Incorrect format. Consider checking the fourth actual argument of the 'fprintf' function. The pointer to string of char type symbols is expected. ccconsole.cpp 341
  • 16. Типы важны для исключений // volatile переменная присваивается сама себе volatile int *ptr; .... *ptr = *ptr; // Нет срабатывания V570
  • 17. Особенно важна информация о классах: например, иерархия наследования class sg_throwable : public std::exception { .... }; class sg_exception : public sg_throwable { .... }; if (!aInstall) { sg_exception("missing argument to scheduleToUpdate"); } V596 The object was created but it is not being used. The 'throw' keyword could be missing: throw sg_exception(FOO); root.cxx 239 Проект FlightGear
  • 18. Symbolic execution • Символьное выполнение позволяет вычислять значения переменных, которые могут приводить к ошибкам, производить проверку диапазонов (range checking) значений • Один из самых важных механизмов: • Переполнения • Утечки памяти • Выход за границы массива • Нулевые указатели / ссылки • Бессмысленные условия • Деление на 0 • И так далее
  • 19. Значения переменных: размер массива, индексы Handle<YieldTermStructure> md0Yts() { double q6mh[] = { 0.0001,0.0001,0.0001,0.0003,0.00055,0.0009,0.0014,0.0019, 0.0025,0.0031,0.00325,0.00313,0.0031,0.00307,0.00309, ........................................................ 0.02336,0.02407,0.0245 }; 60 элементов .... for(int i=0;i<10+18+37;i++) { i < 65 q6m.push_back( boost::shared_ptr<Quote>(new SimpleQuote(q6mh[i]))); Проект QuantLib V557 Array overrun is possible. The value of 'i' index could reach 64. markovfunctional.cpp 176
  • 20. Значения переменных: использование условий для определения диапазона std::string rangeTypeLabel(int idx) { const char* rangeTypeLabels[] = {"Self", "Touch", "Target"}; if (idx >= 0 && idx <= 3) return rangeTypeLabels[idx]; else return "Invalid"; } V557 Array overrun is possible. The value of 'idx' index could reach 3. esmtool labels.cpp 502 Проект OpenMW
  • 21. Значения функций static inline size_t UnboxedTypeSize(JSValueType type) { switch (type) { ....... default: return 0; } } Minstruction *loadUnboxedProperty(size_t offset, ....) { size_t index = offset / UnboxedTypeSize(unboxedType); Проект Thunderbird V609 Divide by zero. Denominator range [0..8]. ionbuilder.cpp 10922
  • 22. Значения переменных: указатели / ссылки if (providerName == null) { ProviderNotFoundException e = new ProviderNotFoundException( providerName.ToString(), SessionStateCategory.CmdletProvider, "ProviderNotFound", SessionStateStrings.ProviderNotFound); throw e; V3080 Possible null dereference. Consider inspecting 'providerName'. System.Management.Automation SessionStateProviderAPIs.cs 1004 Проект PowerShell
  • 23. Method annotations • Аннотирование методов предоставляет больше информации об используемых методах, чем может быть получено путём анализа только их сигнатуры. • C/C++. На данный момент проаннотировано 6570 функций (стандартные библиотеки C и C++, POSIX, MFC, Qt, ZLib и так далее). • C#. На данный момент проаннотировано 920 функций.
  • 24. Пример аннотирования функции memcmp C_"int memcmp(const void *buf1, const void *buf2, size_t count);" ADD(REENTERABLE | RET_USE | F_MEMCMP | STRCMP | HARD_TEST | INT_STATUS, nullptr, nullptr, "memcmp", POINTER_1, POINTER_2, BYTE_COUNT); • C_ - вспомогательный механизм контроля аннотаций (юнит-тесты) • REENTERABLE – повторный вызов с теми же аргументами даст тот-же результат • RET_USE – результат должен быть использован • F_MEMCMP – запуск определённых проверок выхода за границы буфера • STR_CMP – При равенстве функция возвращает 0. • HARD_TEST – особая функция. Некоторые программисты определяют собственные такие функции в своих namespace. Не учитывать namespace. • INT_STATUS – результат явно сравнивать с 1 или -1. • POINTER_1, POINTER_2 – указатели должны быть не нулевыми и разными. • BYTE_COUNT – параметр задает количество байт и должен быть больше 0.
  • 25. Аннотация memcmp: проверка результата bool operator()(const GUID& _Key1, const GUID& _Key2) const { return memcmp(&_Key1, &_Key2, sizeof(GUID)) == -1; } Проект CoreCLR V698 Expression 'memcmp(....) == -1' is incorrect. This function can return not only the value '-1', but any negative value. Consider using 'memcmp(....) < 0' instead. sos util.cpp 142
  • 26. Аннотация memcmp: хранение результата Проект Firebird V642 Saving the 'memcmp' function result inside the 'short' type variable is inappropriate. The significant bits could be lost breaking the program's logic. texttype.cpp 3 SSHORT TextType::compare(ULONG len1, const UCHAR* str1, ULONG len2, const UCHAR* str2) { .... SSHORT cmp = memcmp(str1, str2, MIN(len1, len2)); if (cmp == 0) cmp = (len1 < len2 ? -1 : (len1 > len2 ? 1 : 0)); return cmp; }
  • 27. Аннотация memcmp: неверный аргумент Проект GLG3D V575 The 'memcmp' function processes '0' elements. Inspect the 'third' argument. graphics3D matrix4.cpp 269 bool Matrix4::operator==(const Matrix4& other) const { if (memcmp(this, &other, sizeof(Matrix4) == 0)) { return true; } ... }
  • 28. static int psymbol_compare (const void *addr1, const void *addr2, int length) { struct partial_symbol *sym1 = (struct partial_symbol *) addr1; struct partial_symbol *sym2 = (struct partial_symbol *) addr2; return (memcmp (&sym1->ginfo.value, &sym1->ginfo.value, sizeof (sym1->ginfo.value)) == 0 && ....... Аннотация memcmp: разные аргументы Проект GDB V549 The first argument of 'memcmp' function is equal to the second argument. psymtab.c 1580
  • 29. dst_s_read_private_key_file(....) { .... if (memcmp(in_buff, "Private-key-format: v", 20) != 0) goto fail; .... } 21 символ Аннотация memcmp: buffer underrun Проект Haiku V512 A call of the 'memcmp' function will lead to underflow of the buffer '"Private-key-format: v"'. dst_api.c 858
  • 30. Аннотация memcmp: нет состояния Проект PHP V501 There are identical sub-expressions '!memcmp("auto", charset_hint, 4)' to the left and to the right of the '||' operator. html.c 396 if ((len == 4) /* sizeof (none|auto|pass) */ && (!memcmp("pass", charset_hint, 4) || !memcmp("auto", charset_hint, 4) || !memcmp("auto", charset_hint, 4)))
  • 31. Аннотирование пользовательских функций • Практически отсутствует (кроме отдельных элементов, как собственной функции printf) • Развивать механизм нет смысла • В больших проектах никто не станет тратить месяцы на разметку • Анализатор должен работать сразу
  • 32. Тестирование анализатора • Тестирование анализатора важнейшая часть процесса его разработки • Самое сложное в статическом анализе: не ругаться • Большая тестовая база: • C++ Windows (Visual C++): 120 проектов • C++ Linux (GCC): ещё 34 проекта • C# Windows: 54 проекта
  • 33. Вышлем по почте более подробный вариант презентации • Написать письмо: support@viva64.com • Подписаться на твиттер: @Code_Analysis • Скачать PVS-Studio для Windows: http://www.viva64.com/ru/pvs-studio/ • Скачать PVS-Studio для Linux: http://www.viva64.com/ru/pvs-studio-download-linux/