SlideShare uma empresa Scribd logo
1 de 48
Как потратить 10 лет на
разработку анализатора кода
Андрей Карпов, Евгений Рыжков
OOO «СиПроВер» www.viva64.com
ООО "СиПроВер" (www.viva64.com)
• Занимаемся разработкой, продвижением и продажей
собственного программного продукта.
• Офис: г. Тула, 200 км от Москвы.
• Штат: 24 человека
PVS-Studio
• Более 340 диагностик для C, C++
• Более 130 диагностик для C#
• Windows
• Linux
• Плагин для Visual Studio
• Быстрый старт (мониторинг компиляции)
• SonarQube
Статический анализ – тема которая
становится модной
• Не хотим никого пугать или отговаривать заниматься статическим
анализом кода
• В конце концов мы этим сами занимаемся и нам это нравится
• Но стоит предупредить, что ждёт героя, который отправится по
этому пути
Проблема айсберга
• С ней же сталкиваются
разработчики компилятора
• Рекомендую книгу Евгения Зуева
«Редкая профессия»
• Он кстати выступит с докладом
«С++ в России: Стандарт языка и его
реализация»
Проблема айсберга
Проблема айсберга
Почему C/C++ ?
Из компилятора Cfront из 1985 года:
Pexpr expr::typ(Ptable tbl)
{
....
Pclass cl;
....
cl = (Pclass) nn->tp;
cl->permanent=1;
if (cl == 0) error('i',"%k %s'sT missing",CLASS,s);
Почему C/C++ ?
За 30 лет ничего не изменилось. Современный компилятор Clang:
Instruction *InstCombiner::visitGetElementPtrInst(....) {
....
Value *StrippedPtr = PtrOp->stripPointerCasts();
PointerType *StrippedPtrTy =
dyn_cast<PointerType>(StrippedPtr->getType());
if (!StrippedPtr)
return 0;
Почему свой движок
• Все так делают
• В свой проект легче вносить странные изменения
• Проблема нестандартных расширений
• Головная боль с Roslyn в анализаторе для C#
Сократить путь не удастся
• Необходимость препроцессорования и сложности
• Регулярные выражения не помощник
• Большая работа над исключениями
• Тестирование
• Дополнительные компоненты
Несовместимость препроцессоров
#define __XX_0__(_line) #_line
#define __XX__(_line) __XX_0__(_line)
#define SOURCE __FILE__":"__XX__(__LINE__)
// Макрос SOURCE разворачивается в:
"filename"":""42" // Visual C++
"filename"":"__XX__(42) // Clang
Двойной препроцессор
• А может и не препроцессировать?
• Нет. Нужно обязательно препроцессировать
• Несовместимости: как быть?
• В начале попробуем Clang
• А затем настаёт время медленного Visual C++
Препроцессирование «не до конца»
• Foo("Aaa" __FUNCDNAME__ "Bbb");
• __FUNCDNAME__ Defined as a string literal that contains the
decorated name of the enclosing function.
• The macro is defined only within a function. The __FUNCDNAME__
macro is not expanded if you use the /EP or /P compiler option.
Мы не используем поиск подстрок (string matching)
и регулярные выражения (regular expressions)
• Тупиковый путь
• Подводит даже в простейших ситуациях
• Пример: if (A+B == A+B)
• A+B == B+A
• A+(B) == (A)+B
• ((A+B)) == A+B
• Более фатально: типы, размеры объектов, наследование, значения
переменных и так далее
Исключения на примере V519
• Одному и тому же объекту дважды подряд присваиваются
значения.
• Что может быть проще?
x = 1;
x = 2;
Исключения на примере V519
• Использование до присваивания
x = 1;
Foo(x);
x = 2;
x = 1;
x = x + 2;
Исключения на примере V519
• Слева не тот же самый объект
*p++ = 1;
*p++ = 2;
p[i] = 1;
Foo(i); // “i” передаётся по неконстантной ссылке
p[i] = 2;
Исключения на примере V519
• Стиль: все переменные объявляются в начале функции и
инициализируются значениям и по умолчанию.
• А какая разница, что это в C++ лучше делать инициализацию при
объявлении? Вот перед нами 10 мегабайт кода 20-летней давности...
int A = 0;
float B = 0.0f;
int *x = NULL;
//....
x = (int *)malloc(count * sizeof(x));
Исключения на примере V519
• Слева переменная имеет особые исключительные имена
• gLibNcFTP_Uses_Me_To_Quiet_Variable_Unused_Warnings
Исключения на примере V519
• Переменная нужна исключительно для отладки
• Или для борьбы с предупреждениями, что значение функции не
используется
res = RegQueryValueEx(....);
res = RegQueryValueEx(....);
res = RegQueryValueEx(....);
res = RegQueryValueEx(....);
Исключения на примере V519
• Возможно изменение потока управление
void F(bool b, int &x)
{
x = 1;
if (b)
return;
x = 2;
}
Исключения на примере V519
• assert(x); -> ((void)0);
x = Foo();
assert(x == 1); // исчезает в i-файле,
// оставляя после себя
// ((void)0);
x = 2;
Исключения на примере V519
• Я у мамы программист
// Посчитаем, сколько символов в строке до '/'
temp = strchr(hoststr, '/');
*temp = '0';
hostlen = strlen(hoststr);
*temp = '/'; }
Исключения на примере V519
• Особенности некоторых библиотек
save_flags = p->flags;
p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
ptr = (png_voidp)
png_malloc((png_structp)png_ptr, num_bytes);
p->flags=save_flags;
Исключения на примере V519
• volatile
volatile char port;
port = hi;
port = lo;
Исключения на примере V519
• Есть ещё, но пожалуй хватит
• Спите спокойно
«Жить захочешь, не так раскорячишься»
Скроллинг в обратную сторону
• 6 лет прокрутка колесиком мыши не давала сбоев
• Пользователю не понравилось, что прокрутка списка работает
"наизнанку", не в ту сторону.
• В настройках мыши в системе есть опция "One screen at a time",
которая прокручивает страницу полного текста, помещающуюся
на экран.
• MouseWheelScrollLines. Это свойство возвращает "The number of
lines to scroll on a mouse wheel rotation, or -1 if the "One screen at a
time" mouse option is selected".
Ошибка интеграции Intel Parallel Studio
Service Pack 1 в Visual Studio 2005/2008
• Ошибка при попытке отображения окна настроек
Проблема с символами '(' и ')' в системной
переменной PATH
• UtilitiesBinx86";"C:WINDOWSsystem32";"C:WINDOWS";
"C:WINDOWSSystem32Wbem";"C:Program. was unexpected at this
time.
• Поведение вызвано ошибкой в vsvars32.bat файле для настройки
окружения Visual Studio.
• Проблема возникает если в путях есть скобки. Пример:
Microsoft DirectX SDK (August 2006)
@if not "%WindowsSdkDir%" == "" (
set "PATH=%WindowsSdkDir%bin;%PATH%"
set "INCLUDE=%WindowsSdkDir%include;%INCLUDE%"
set "LIB=%WindowsSdkDir%lib;%LIB%"
)
COM-интерфейсы Visual Studio
• COM-интерфейсы Visual Studio для получения информации о
проекте неожиданно могут кинуть исключение.
• Вызовы приходится заворачивать в цикл для многократного их
повторения.
• Танцы с бубном, которые не всегда помогают.
Антивирусы
• У разработчика стоит антивирус X и, согласно корпоративной
политике, у него нет прав менять его настройки.
• Этот антивирус "держит" какое-то время некоторые временные
файлы, и анализатор не может их удалить.
• В результате получается, что анализатор "гадит" в папку проекта.
Visual Studio 2017
• Вообще все поменялось…
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)))
Symbolic execution
• Символьное выполнение позволяет вычислять значения
переменных, которые могут приводить к ошибкам, производить
проверку диапазонов (range checking) значений
• Один из самых важных механизмов:
• Переполнения
• Выход за границы массива
• Нулевые указатели / ссылки
• Бессмысленные условия
• Деление на 0
• И так далее
Преждевременная оптимизация это зло
• Оптимизировать надо сразу
• Потом нельзя запустить профайлер и найти узкие места
• Задержки будут «размазаны по коду» тонким слоем
• Что ещё:
• Программирование в стиле Си
• Самостоятельное управление памятью
• Дерево не удаляется из памяти
• Свои контейнеры для некоторых типов
• Свой класс строки
Тестирование анализатора
• Тестирование анализатора важнейшая часть процесса его
разработки
• Самое сложное в статическом анализе: не ругаться
• Большая тестовая база:
• C++ Windows (Visual C++): 120 проектов
• C++ Linux (GCC): ещё 34 проекта
• C# Windows: 54 проекта
Не менее важно чем анализ
• Быстрый старт
• Windows: Standalone
• Linux: pvs-studio-analyzer
Не менее важно чем анализ
• Механизмы подавление ложных срабатываний
• База разметки!
Просим задавать вопросы
• Можно скачать и попробовать демонстрационную версию
• Windows:http://www.viva64.com/ru/pvs-studio-download/
• Linux: http://www.viva64.com/ru/pvs-studio-download-linux/
• Про ограничения демонстрационной версии:
http://www.viva64.com/ru/m/0009/
• Вы можете написать нам и получить на время полную версию:
support@viva64.com

Mais conteúdo relacionado

Mais procurados

Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxPlatonov Sergey
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1m2rus
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and catscorehard_by
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о BoostSergey Platonov
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типовcorehard_by
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IPlatonov Sergey
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 

Mais procurados (20)

Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
Антон Полухин, Немного о Boost
Антон Полухин, Немного о BoostАнтон Полухин, Немного о Boost
Антон Полухин, Немного о Boost
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 

Destaque

Jenkins vs GitLab CI
Jenkins vs GitLab CIJenkins vs GitLab CI
Jenkins vs GitLab CICEE-SEC(R)
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projectscorehard_by
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++NextSergey Platonov
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3Platonov Sergey
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Mikhail Matrosov
 

Destaque (6)

Jenkins vs GitLab CI
Jenkins vs GitLab CIJenkins vs GitLab CI
Jenkins vs GitLab CI
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projects
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 

Semelhante a Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора кода

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
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3it-people
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMTech Talks @NSU
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаAndrey Karpov
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаcorehard_by
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++Andrey Karpov
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотомRoman Grebennikov
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийOOO "Program Verification Systems"
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenAndrey Karpov
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокAndrey Karpov
 

Semelhante a Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора кода (20)

Python и Cython
Python и CythonPython и Cython
Python и Cython
 
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#
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3ekbpy'2012 - Михаил Коробов - Python 3
ekbpy'2012 - Михаил Коробов - Python 3
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Как команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы TizenКак команда PVS-Studio может улучшить код операционной системы Tizen
Как команда PVS-Studio может улучшить код операционной системы Tizen
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 

Mais de Platonov Sergey

Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Platonov Sergey
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеPlatonov Sergey
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIДмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIPlatonov Sergey
 
QML\Qt Quick на практике
QML\Qt Quick на практикеQML\Qt Quick на практике
QML\Qt Quick на практикеPlatonov Sergey
 
Визуализация автомобильных маршрутов
Визуализация автомобильных маршрутовВизуализация автомобильных маршрутов
Визуализация автомобильных маршрутовPlatonov Sergey
 
Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Platonov Sergey
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Platonov Sergey
 
HPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийHPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийPlatonov Sergey
 
Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Platonov Sergey
 
Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Platonov Sergey
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
 
One definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьOne definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьPlatonov Sergey
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыPlatonov Sergey
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузераPlatonov Sergey
 
Денис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система QtДенис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система QtPlatonov Sergey
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsPlatonov Sergey
 
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Platonov Sergey
 
High quality library from scratch
High quality library from scratchHigh quality library from scratch
High quality library from scratchPlatonov Sergey
 

Mais de Platonov Sergey (20)

Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIДмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
 
QML\Qt Quick на практике
QML\Qt Quick на практикеQML\Qt Quick на практике
QML\Qt Quick на практике
 
Визуализация автомобильных маршрутов
Визуализация автомобильных маршрутовВизуализация автомобильных маршрутов
Визуализация автомобильных маршрутов
 
Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
 
HPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийHPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычислений
 
Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08
 
Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
One definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьOne definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим жить
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
 
Денис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система QtДенис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система Qt
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
 
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
 
High quality library from scratch
High quality library from scratchHigh quality library from scratch
High quality library from scratch
 

Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора кода

  • 1. Как потратить 10 лет на разработку анализатора кода Андрей Карпов, Евгений Рыжков OOO «СиПроВер» www.viva64.com
  • 2. ООО "СиПроВер" (www.viva64.com) • Занимаемся разработкой, продвижением и продажей собственного программного продукта. • Офис: г. Тула, 200 км от Москвы. • Штат: 24 человека
  • 3. PVS-Studio • Более 340 диагностик для C, C++ • Более 130 диагностик для C# • Windows • Linux • Плагин для Visual Studio • Быстрый старт (мониторинг компиляции) • SonarQube
  • 4. Статический анализ – тема которая становится модной • Не хотим никого пугать или отговаривать заниматься статическим анализом кода • В конце концов мы этим сами занимаемся и нам это нравится • Но стоит предупредить, что ждёт героя, который отправится по этому пути
  • 5. Проблема айсберга • С ней же сталкиваются разработчики компилятора • Рекомендую книгу Евгения Зуева «Редкая профессия» • Он кстати выступит с докладом «С++ в России: Стандарт языка и его реализация»
  • 8. Почему C/C++ ? Из компилятора Cfront из 1985 года: Pexpr expr::typ(Ptable tbl) { .... Pclass cl; .... cl = (Pclass) nn->tp; cl->permanent=1; if (cl == 0) error('i',"%k %s'sT missing",CLASS,s);
  • 9. Почему C/C++ ? За 30 лет ничего не изменилось. Современный компилятор Clang: Instruction *InstCombiner::visitGetElementPtrInst(....) { .... Value *StrippedPtr = PtrOp->stripPointerCasts(); PointerType *StrippedPtrTy = dyn_cast<PointerType>(StrippedPtr->getType()); if (!StrippedPtr) return 0;
  • 10. Почему свой движок • Все так делают • В свой проект легче вносить странные изменения • Проблема нестандартных расширений • Головная боль с Roslyn в анализаторе для C#
  • 11. Сократить путь не удастся • Необходимость препроцессорования и сложности • Регулярные выражения не помощник • Большая работа над исключениями • Тестирование • Дополнительные компоненты
  • 12. Несовместимость препроцессоров #define __XX_0__(_line) #_line #define __XX__(_line) __XX_0__(_line) #define SOURCE __FILE__":"__XX__(__LINE__) // Макрос SOURCE разворачивается в: "filename"":""42" // Visual C++ "filename"":"__XX__(42) // Clang
  • 13. Двойной препроцессор • А может и не препроцессировать? • Нет. Нужно обязательно препроцессировать • Несовместимости: как быть? • В начале попробуем Clang • А затем настаёт время медленного Visual C++
  • 14. Препроцессирование «не до конца» • Foo("Aaa" __FUNCDNAME__ "Bbb"); • __FUNCDNAME__ Defined as a string literal that contains the decorated name of the enclosing function. • The macro is defined only within a function. The __FUNCDNAME__ macro is not expanded if you use the /EP or /P compiler option.
  • 15. Мы не используем поиск подстрок (string matching) и регулярные выражения (regular expressions) • Тупиковый путь • Подводит даже в простейших ситуациях • Пример: if (A+B == A+B) • A+B == B+A • A+(B) == (A)+B • ((A+B)) == A+B • Более фатально: типы, размеры объектов, наследование, значения переменных и так далее
  • 16. Исключения на примере V519 • Одному и тому же объекту дважды подряд присваиваются значения. • Что может быть проще? x = 1; x = 2;
  • 17. Исключения на примере V519 • Использование до присваивания x = 1; Foo(x); x = 2; x = 1; x = x + 2;
  • 18. Исключения на примере V519 • Слева не тот же самый объект *p++ = 1; *p++ = 2; p[i] = 1; Foo(i); // “i” передаётся по неконстантной ссылке p[i] = 2;
  • 19. Исключения на примере V519 • Стиль: все переменные объявляются в начале функции и инициализируются значениям и по умолчанию. • А какая разница, что это в C++ лучше делать инициализацию при объявлении? Вот перед нами 10 мегабайт кода 20-летней давности... int A = 0; float B = 0.0f; int *x = NULL; //.... x = (int *)malloc(count * sizeof(x));
  • 20. Исключения на примере V519 • Слева переменная имеет особые исключительные имена • gLibNcFTP_Uses_Me_To_Quiet_Variable_Unused_Warnings
  • 21. Исключения на примере V519 • Переменная нужна исключительно для отладки • Или для борьбы с предупреждениями, что значение функции не используется res = RegQueryValueEx(....); res = RegQueryValueEx(....); res = RegQueryValueEx(....); res = RegQueryValueEx(....);
  • 22. Исключения на примере V519 • Возможно изменение потока управление void F(bool b, int &x) { x = 1; if (b) return; x = 2; }
  • 23. Исключения на примере V519 • assert(x); -> ((void)0); x = Foo(); assert(x == 1); // исчезает в i-файле, // оставляя после себя // ((void)0); x = 2;
  • 24. Исключения на примере V519 • Я у мамы программист // Посчитаем, сколько символов в строке до '/' temp = strchr(hoststr, '/'); *temp = '0'; hostlen = strlen(hoststr); *temp = '/'; }
  • 25. Исключения на примере V519 • Особенности некоторых библиотек save_flags = p->flags; p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; ptr = (png_voidp) png_malloc((png_structp)png_ptr, num_bytes); p->flags=save_flags;
  • 26. Исключения на примере V519 • volatile volatile char port; port = hi; port = lo;
  • 27. Исключения на примере V519 • Есть ещё, но пожалуй хватит • Спите спокойно
  • 28. «Жить захочешь, не так раскорячишься»
  • 29. Скроллинг в обратную сторону • 6 лет прокрутка колесиком мыши не давала сбоев • Пользователю не понравилось, что прокрутка списка работает "наизнанку", не в ту сторону. • В настройках мыши в системе есть опция "One screen at a time", которая прокручивает страницу полного текста, помещающуюся на экран. • MouseWheelScrollLines. Это свойство возвращает "The number of lines to scroll on a mouse wheel rotation, or -1 if the "One screen at a time" mouse option is selected".
  • 30. Ошибка интеграции Intel Parallel Studio Service Pack 1 в Visual Studio 2005/2008 • Ошибка при попытке отображения окна настроек
  • 31. Проблема с символами '(' и ')' в системной переменной PATH • UtilitiesBinx86";"C:WINDOWSsystem32";"C:WINDOWS"; "C:WINDOWSSystem32Wbem";"C:Program. was unexpected at this time. • Поведение вызвано ошибкой в vsvars32.bat файле для настройки окружения Visual Studio. • Проблема возникает если в путях есть скобки. Пример: Microsoft DirectX SDK (August 2006) @if not "%WindowsSdkDir%" == "" ( set "PATH=%WindowsSdkDir%bin;%PATH%" set "INCLUDE=%WindowsSdkDir%include;%INCLUDE%" set "LIB=%WindowsSdkDir%lib;%LIB%" )
  • 32. COM-интерфейсы Visual Studio • COM-интерфейсы Visual Studio для получения информации о проекте неожиданно могут кинуть исключение. • Вызовы приходится заворачивать в цикл для многократного их повторения. • Танцы с бубном, которые не всегда помогают.
  • 33. Антивирусы • У разработчика стоит антивирус X и, согласно корпоративной политике, у него нет прав менять его настройки. • Этот антивирус "держит" какое-то время некоторые временные файлы, и анализатор не может их удалить. • В результате получается, что анализатор "гадит" в папку проекта.
  • 34. Visual Studio 2017 • Вообще все поменялось…
  • 35. Method annotations • Аннотирование методов предоставляет больше информации об используемых методах, чем может быть получено путём анализа только их сигнатуры. • C/C++. На данный момент проаннотировано 6570 функций (стандартные библиотеки C и C++, POSIX, MFC, Qt, ZLib и так далее). • C#. На данный момент проаннотировано 920 функций.
  • 36. Пример аннотирования функции 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.
  • 37. Аннотация 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
  • 38. Аннотация 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; }
  • 39. Аннотация 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; } ... }
  • 40. 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
  • 41. 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
  • 42. Аннотация 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)))
  • 43. Symbolic execution • Символьное выполнение позволяет вычислять значения переменных, которые могут приводить к ошибкам, производить проверку диапазонов (range checking) значений • Один из самых важных механизмов: • Переполнения • Выход за границы массива • Нулевые указатели / ссылки • Бессмысленные условия • Деление на 0 • И так далее
  • 44. Преждевременная оптимизация это зло • Оптимизировать надо сразу • Потом нельзя запустить профайлер и найти узкие места • Задержки будут «размазаны по коду» тонким слоем • Что ещё: • Программирование в стиле Си • Самостоятельное управление памятью • Дерево не удаляется из памяти • Свои контейнеры для некоторых типов • Свой класс строки
  • 45. Тестирование анализатора • Тестирование анализатора важнейшая часть процесса его разработки • Самое сложное в статическом анализе: не ругаться • Большая тестовая база: • C++ Windows (Visual C++): 120 проектов • C++ Linux (GCC): ещё 34 проекта • C# Windows: 54 проекта
  • 46. Не менее важно чем анализ • Быстрый старт • Windows: Standalone • Linux: pvs-studio-analyzer
  • 47. Не менее важно чем анализ • Механизмы подавление ложных срабатываний • База разметки!
  • 48. Просим задавать вопросы • Можно скачать и попробовать демонстрационную версию • Windows:http://www.viva64.com/ru/pvs-studio-download/ • Linux: http://www.viva64.com/ru/pvs-studio-download-linux/ • Про ограничения демонстрационной версии: http://www.viva64.com/ru/m/0009/ • Вы можете написать нам и получить на время полную версию: support@viva64.com