PVS-Studio - это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках С, C++, C# и Java. Работает в 64-битных системах на Windows, Linux и macOS и может анализировать код, предназначенный для 32-битных, 64-битных и встраиваемых ARM платформ.
Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...Andrey Karpov
Будут продемонстрированы интересные ошибки и потенциальные уязвимости, обнаруженные в открытых проектах с помощью статического анализатора кода PVS-Studio. Подробно разберём эти ошибки и расскажем, как именно анализатор их обнаруживает. После чего, основываясь на вопросах из аудитории, будет рассказано о принципах работы анализатора и тех возможностях, которые вызовут наибольший интерес у слушателей.
Опыт разработки статического анализатора кодаAndrey Karpov
Один из основателей проекта PVS-Studio расскажет об опыте разработки статического анализатора кода C++. У инструментов статического анализа кода существует "проблема айсберга". От пользователей скрыты сложные механизмы анализа кода, и иногда им кажется, что статические анализаторы – это просто какие-то утилиты, ищущие опечатки с помощью регулярных выражений. Автор доклада постарается в общих чертах описать, как всё обстоит на самом деле. Он покажет на примерах, почему нормальный анализ с помощью регулярных выражений нереализуем, что такое Data Flow анализ, а также расскажет о других технологиях, применяемых при анализе кода. Вкратце будет затронут вопрос использования нейронных сетей, обсуждение которых сейчас является очень модной темой, и рассказано, почему с точки зрения анализа кода отношение к этому направлению является очень скептическим.
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья СтусьMail.ru Group
Основой доклада будет как и полгода назад: наш опыт построения тестирования фронтенда в Авто.ру на базе Jest и Puppeteer: юнит-тесты, тесты на отдельные React-компоненты, интеграционные тесты. За это время накопили интересные примеры тестирования, о чем и хотим рассказать.
Выполняет анализ кода на языках: C, C++, C++/CLI, C++/CX, C#. Plugin для Visual Studio 2010-2015. Интеграция с SonarQube, QtCreator, CLion, Eclipse CDT, Anjuta DevStudio и т.д. Быстрый старт (мониторинг компиляции). Прямая интеграция анализатора в системы автоматизации сборки и утилита BlameNotifier (рассылка писем). Режим автоматического анализа изменённых файлов. Почему нужны анализаторы кода?
Андрей Карпов
Вы узнаете, что такое статический анализ кода и историю его развития. Узнаете, как эффективно применять инструменты статического анализа в своей работе, увидите практические примеры использования этой методологии. Доклад ориентирован на программистов, использующих языки Си/Си++, но будет полезен всем
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Стандартная библиотека C++ крайне гибка и позволяет решать множество задач. Однако мало кто знает о некоторых её возможностях, из-за чего порой вместо написания нескольких строчек кода люди неделями пишут своё решение или переизобретают готовые алгоритмы. В докладе вас ждёт рассказ о полезных "фишках" стандартной библиотеки на которые почему-то мало кто обращает внимание.
Выявление ошибок и потенциальных уязвимостей в C и C++ коде с помощью анализа...Andrey Karpov
Будут продемонстрированы интересные ошибки и потенциальные уязвимости, обнаруженные в открытых проектах с помощью статического анализатора кода PVS-Studio. Подробно разберём эти ошибки и расскажем, как именно анализатор их обнаруживает. После чего, основываясь на вопросах из аудитории, будет рассказано о принципах работы анализатора и тех возможностях, которые вызовут наибольший интерес у слушателей.
Опыт разработки статического анализатора кодаAndrey Karpov
Один из основателей проекта PVS-Studio расскажет об опыте разработки статического анализатора кода C++. У инструментов статического анализа кода существует "проблема айсберга". От пользователей скрыты сложные механизмы анализа кода, и иногда им кажется, что статические анализаторы – это просто какие-то утилиты, ищущие опечатки с помощью регулярных выражений. Автор доклада постарается в общих чертах описать, как всё обстоит на самом деле. Он покажет на примерах, почему нормальный анализ с помощью регулярных выражений нереализуем, что такое Data Flow анализ, а также расскажет о других технологиях, применяемых при анализе кода. Вкратце будет затронут вопрос использования нейронных сетей, обсуждение которых сейчас является очень модной темой, и рассказано, почему с точки зрения анализа кода отношение к этому направлению является очень скептическим.
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья СтусьMail.ru Group
Основой доклада будет как и полгода назад: наш опыт построения тестирования фронтенда в Авто.ру на базе Jest и Puppeteer: юнит-тесты, тесты на отдельные React-компоненты, интеграционные тесты. За это время накопили интересные примеры тестирования, о чем и хотим рассказать.
Выполняет анализ кода на языках: C, C++, C++/CLI, C++/CX, C#. Plugin для Visual Studio 2010-2015. Интеграция с SonarQube, QtCreator, CLion, Eclipse CDT, Anjuta DevStudio и т.д. Быстрый старт (мониторинг компиляции). Прямая интеграция анализатора в системы автоматизации сборки и утилита BlameNotifier (рассылка писем). Режим автоматического анализа изменённых файлов. Почему нужны анализаторы кода?
Андрей Карпов
Вы узнаете, что такое статический анализ кода и историю его развития. Узнаете, как эффективно применять инструменты статического анализа в своей работе, увидите практические примеры использования этой методологии. Доклад ориентирован на программистов, использующих языки Си/Си++, но будет полезен всем
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
В докладе рассмотрены подходы к созданию надежных юнит-тестов, которые просты в поддержке и модернизации, а также принципы создания кода пригодного для покрытия автотестами. Приведены два способа внедрения зависимости: с использованием конструктора тестируемого объекта, а также с использованием подхода "выделить и переопределить". Каждый из способов разобран на примере, демонстрирующем особенности его реализации и применения. Приведен ряд практических советов, нацеленных на создание надежных юнит-тестов. Использование на практике приведенных подходов и принципов позволяет упростить процесс поддержки и модификации существующего кода, а также дает уверенность в надежности работы добавляемого нового функционала. В конечном итоге это приводит к повышению качества разрабатываемого продукта.
Стандартная библиотека C++ крайне гибка и позволяет решать множество задач. Однако мало кто знает о некоторых её возможностях, из-за чего порой вместо написания нескольких строчек кода люди неделями пишут своё решение или переизобретают готовые алгоритмы. В докладе вас ждёт рассказ о полезных "фишках" стандартной библиотеки на которые почему-то мало кто обращает внимание.
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
Это моя очередная заметка о том, как PVS-Studio делает программы более надёжными. То есть где, и какие ошибки он обнаруживает. На этот раз под молоток попали примеры, демонстрирующие работу с библиотекой IPP 7.0 (Intel Performance Primitives Library).
Двойное освобождение ресурсов. Недостижимый код. Некорректные операции сдвига. Неправильная работа с типами. Опечатки и copy-paste. Проблемы безопасности. Путаница с приоритетом операций.
Как показывает практика, повсеместное применение классического, основанного на callback’ах подхода к асинхронному программированию обычно оказывается неудобным. Для упрощения написания и поддержки сложного асинхронного кода можно использовать иной подход — с использованием сопрограмм. Он значительно сокращает объём и сложность кода, превращая код из асинхронного в синхронный.
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...corehard_by
- Организация программной системы как совокупности модулей, интерфейсов и управляющих систем.
- Многопоточность - предпосылки для использования и объективная необходимость.
- Организация многопоточности при проектировании алгоритмов, основанных на событиях.
В рамках данного выступления вас ждут:
* рассказ о полезных и интересных вещах из Boost
* новости с передовиц разработки Boost и о новинках ожидаемых в следующих версиях
* что из Boost готовится к переезду в новый стандарт С++
* как экспериментировать с Boost, имея под рукой только браузер
* что людям не нравится в Boost и как с этими людьми бороться (-:
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Улучшение качества открытого программного обеспечения с помощью инструментов ...Andrey Karpov
Одним из способов внести свой вклад в развитие открытого программного обеспечения, является поиск и исправление
различных программных ошибок и потенциальных уязвимостей. Достаточно просто, это можно осуществить, используя статические анализаторы кода. Это можно делать даже в том случае, если вы ещё мало знакомы с устройством работы проекта, но хотите внести вклад в его улучшение. Поговорим о методологии анализа исходного кода, бесплатных инструментах и автоматизации процессов проверки.
Запись доклада: https://youtu.be/-eUxbZ6W5Ig
О сложностях программирования, или C# нас не спасет?Tatyanazaxarova
Программирование это сложно. С этим никто, надеюсь, не спорит. Но вот тема новых языков программирования, а точнее поиск "серебряной пули" всегда находит бурных отклик в умах разработчиков программного обеспечения. Особенно "модной" является тема превосходства одного языка программирования над другим. Ну, к примеру, что C# "круче", чем C++. И хотя holy wars – это не та причина, по которой я пишу этот пост, тем не менее, что называется "наболело". Ну не поможет C#/lisp/F#/Haskell/... написать изящное приложение, взаимодействующее с внешним миром, и все тут. Вся изящность теряется, стоит захотеть написать что-то реальное, а не пример "сам в себе".
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
В C++11 добавили новое ключевое слово - constexpr. Выглядит оно весьма невзрачно, да и на первый взгляд кажется, что смысла в нём маловато... Для чего же оно нужно, какие у него есть тайные супер способности и какую роль оно сыграет в дальнейшем развитии языка C++ - обо всём об этом мы и поговорим.
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Tatyanazaxarova
В статье показаны ошибки, выявленные с помощью статического анализатора кода, встроенного в Visual Studio 2010. Исследование проводилось на пяти open source проектах. Эти же проекты были проверены с помощью PVS-Studio. Приведены результаты сравнения этих двух инструментов.
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
Это моя очередная заметка о том, как PVS-Studio делает программы более надёжными. То есть где, и какие ошибки он обнаруживает. На этот раз под молоток попали примеры, демонстрирующие работу с библиотекой IPP 7.0 (Intel Performance Primitives Library).
Двойное освобождение ресурсов. Недостижимый код. Некорректные операции сдвига. Неправильная работа с типами. Опечатки и copy-paste. Проблемы безопасности. Путаница с приоритетом операций.
Как показывает практика, повсеместное применение классического, основанного на callback’ах подхода к асинхронному программированию обычно оказывается неудобным. Для упрощения написания и поддержки сложного асинхронного кода можно использовать иной подход — с использованием сопрограмм. Он значительно сокращает объём и сложность кода, превращая код из асинхронного в синхронный.
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
В последнее время в промышленной разработке ПО особую популярность обретают Domain-Specific Lanugages (DSL). Они драматически упрощают разработку и дают возможность “программировать” не только программистам, но и пользователям прикладных программ.
В своем докладе я расскажу об опыте использования DSL применительно к С++, причем упор будет сделан на производительность кода DSL, и его мгновенную “встраиваемость” в запущенную программу путем компиляции DSL-кода в нативный код с помощью инструментария LLVM.
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...corehard_by
- Организация программной системы как совокупности модулей, интерфейсов и управляющих систем.
- Многопоточность - предпосылки для использования и объективная необходимость.
- Организация многопоточности при проектировании алгоритмов, основанных на событиях.
В рамках данного выступления вас ждут:
* рассказ о полезных и интересных вещах из Boost
* новости с передовиц разработки Boost и о новинках ожидаемых в следующих версиях
* что из Boost готовится к переезду в новый стандарт С++
* как экспериментировать с Boost, имея под рукой только браузер
* что людям не нравится в Boost и как с этими людьми бороться (-:
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Улучшение качества открытого программного обеспечения с помощью инструментов ...Andrey Karpov
Одним из способов внести свой вклад в развитие открытого программного обеспечения, является поиск и исправление
различных программных ошибок и потенциальных уязвимостей. Достаточно просто, это можно осуществить, используя статические анализаторы кода. Это можно делать даже в том случае, если вы ещё мало знакомы с устройством работы проекта, но хотите внести вклад в его улучшение. Поговорим о методологии анализа исходного кода, бесплатных инструментах и автоматизации процессов проверки.
Запись доклада: https://youtu.be/-eUxbZ6W5Ig
О сложностях программирования, или C# нас не спасет?Tatyanazaxarova
Программирование это сложно. С этим никто, надеюсь, не спорит. Но вот тема новых языков программирования, а точнее поиск "серебряной пули" всегда находит бурных отклик в умах разработчиков программного обеспечения. Особенно "модной" является тема превосходства одного языка программирования над другим. Ну, к примеру, что C# "круче", чем C++. И хотя holy wars – это не та причина, по которой я пишу этот пост, тем не менее, что называется "наболело". Ну не поможет C#/lisp/F#/Haskell/... написать изящное приложение, взаимодействующее с внешним миром, и все тут. Вся изящность теряется, стоит захотеть написать что-то реальное, а не пример "сам в себе".
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
В докладе перед нами откроется великолепный мир велосипедов и устаревших технологий, которые люди продолжают переносить в новые проекты и повсеместно использовать. Мы поговорим о:
Copy-On-Write
разработке без оглядки на готовые решения и к чему это приводит
force inline
оптимизациях, которые отлично себя показывают на бенчмарках и плохо себя ведут в реальной жизни
бездумно отключаемых оптимизациях компилятора
тонкостях стандартной библиотеки для повседневного использования
супер качественном велосипедостроении
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
В C++11 добавили новое ключевое слово - constexpr. Выглядит оно весьма невзрачно, да и на первый взгляд кажется, что смысла в нём маловато... Для чего же оно нужно, какие у него есть тайные супер способности и какую роль оно сыграет в дальнейшем развитии языка C++ - обо всём об этом мы и поговорим.
Сравнение статического анализа общего назначения из Visual Studio 2010 и PVS-...Tatyanazaxarova
В статье показаны ошибки, выявленные с помощью статического анализатора кода, встроенного в Visual Studio 2010. Исследование проводилось на пяти open source проектах. Эти же проекты были проверены с помощью PVS-Studio. Приведены результаты сравнения этих двух инструментов.
Будут рассмотрены следующие вопросы:
— С++ живее всех живых;
— Embedded системы и язык C и C++;
— Немного о новшествах, внесённые в новые стандарты языка;
— О тенденции безопасного программирования;
— О развитии инструментария;
Многим читателя понравилась моя статья "Последствия использования технологии Copy-Paste при программировании на Си++ и как с этим быть" [1]. Обратил на неё внимание и Scott Meyers [2] и задал вопрос о том, как же собственно статический анализ помог выявить описанные в статье ошибки.
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
Методология статического анализа год за годом зарекомендовывает себя в поисках дефектов в исходном коде программ.
Максим расскажет про:
- методологию статического анализа и какие плюсы и минусы у нее есть;
- технологии этой методологии, которые позволяют выявлять разнообразнейшие дефекты в коде;
- интересные примеры ошибок в реальных проектах, которые были найдены при помощи статического анализа;
- интеграцию инструментов статического анализа в проекты любой сложности, и почему так важно регулярное использование подобных инструментов.
SAST и Application Security: как бороться с уязвимостями в кодеAndrey Karpov
Проблематика: Объёмы кода растут; Плотность ошибок растёт нелинейно; Все хотят качественный и БЕЗОПАСНЫЙ код; Старых методов контроля качества уже недостаточно.
Статический анализ и написание качественного кода на C/C++ для встраиваемых с...Andrey Karpov
Как учит печальный опыт множества инцидентов, требования к качеству программного кода встраиваемых систем намного выше, чем для классического программного обеспечения (игры, офисные пакеты, графические редакторы и т.д.). Поговорим о стандартах кодирования, таких как MISRA, SEI CERT, и инструментах статического анализа кода. Статические анализаторы решают две смежные, но всё-таки разные задачи: поиск ошибок и поиск запахов кода. Оба эти направления важны и должны использоваться. Однако часто эти два направления смешивают, что приводят к недоразумениям и отторжению методологии статического анализа кода. Попробуем расставить точки над i.
Как команда PVS-Studio может улучшить код операционной системы TizenAndrey Karpov
Цель: Контрактная работа команды PVS-Studio по исправлению ошибок и регулярному аудиту кода. Сейчас анализатор PVS-Studio выявляет более 10% ошибок, которые присутствуют в коде проекта Tizen. В случае регулярного использования PVS-Studio, в новом коде можно будет предотвратить около 20% ошибок.
Я прогнозирую, что команда PVS-Studio может на данный момент выявить и исправить около 27000 ошибок в проекте Tizen.
SAST, борьба с потенциальными уязвимостямиAndrey Karpov
Доклад посвящен статическому анализу кода и ориентирован на тех, кто заинтересован в надёжности и безопасности разрабатываемого в компании программного кода. Условно можно выделить два направления статического тестирования защищённости приложений. Первый - это поиск уже известных уязвимостей методом сопоставления с шаблоном. Такой подход имеет право на существование и может обнаружить в вашем проекте код, взятый из старой библиотеки, подверженной определённой уязвимости. Второе направление - это выявление в новом коде участков кода, содержащих дефекты с точки зрения безопасности, то есть потенциальные уязвимости. Второе направление будет рассмотрено более подробно, а также будет рассказано что означают термины CWE, CVE и какая между ними связь. Дополнительно обсудим тему внедрения SAST в цикл разработки программного обеспечения, что может представлять интерес для DevSecOps специалистов.
Статический анализ: ищем ошибки... и уязвимости?Andrey Karpov
Новости об очередной найденной уязвимости регулярно всплывают то тут, то там. Сопутствующие потери $, как правило, колоссальны. Поэтому вместо исправления уязвимостей, следует не допускать их появления. Один из способов борьбы с ошибками в коде – использование статического анализа. Но насколько он подходит для поиска уязвимостей? И так ли велика разница между простыми ошибками и уязвимостями с точки зрения кода? Эти вопросы мы и обсудим в ходе доклада, а заодно поговорим о том, каким образом использовать статический анализ так, чтобы извлечь из него максимум пользы.
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Platonov Sergey
Размер и сложность проектов растёт. С кодом всё сложнее совладать, поэтому статический анализ всё больше набирает популярность. А лидеры отрасли все чаще внедряют такие инструменты у себя. Мы расскажем об использования статического анализатора кода в игровой индустрии на примере работы с проектом Unreal Engine 4. Про это на сайте компании Epic Games можно найти статью. Но одно дела статья, а другое дело живой рассказ. Вы услышите интересные истории, увидите примеры ошибок в коде Epic Games, да и просто пообщаетесь с участниками внедрения анализатора. Если вы ещё не решили, нужен ли статический анализатор вашему проекту, обязательно приходите послушать наш доклад.
Статический анализ: вокруг Java за 60 минутAndrey Karpov
Статический анализ всё больше воспринимается как неотъемлемая часть процесса разработки качественного программного обеспечения. Разумеется, у этой технологии уже есть свои сторонники и противники, но, несмотря на это, тема статического анализа всё более актуальна и требует детального рассмотрения. Рассмотрим, что такое статический анализ, как он применяется и как влияет на качество и надёжность кода. Поговорим о важности раннего обнаружения ошибок и дефектов уязвимости. Рассмотрим существующие инструменты для Java, такие как Sonar Java, FindBugs и анализатор встроенном в среду разработки IntelliJ IDEA. Расскажем историю, почему несмотря на уже существующие инструменты, мы решили разработать PVS-Studio для Java, как мы это делали и что в итоге получилось. В конце затронем вопрос интеграции статических анализаторов кода в большие старые проекты. Другими словами, как увидеть 100500 срабатываний и не упасть духом.
Всё о статическом анализе кода для Java программистаAndrey Karpov
Этот доклад для тех, кто не знаком со статическими анализаторами кода, или знаком, но ещё не внедрил эти инструменты в процесс разработки. Будет описана методология статического анализа и как она используется для выявления ошибок и запахов кода. Будут кратко рассмотрены некоторые популярные инструменты статического анализа для языка Java, а также платформа SonarQube способная объединить и визуализировать отчёты различных анализаторов. Немного заглянем внутрь и поговорим о технологиях, используемых в современных статических анализаторах кода и позволяющих находить разнообразнейшие паттерны ошибок. Затронем вопрос, почему несмотря на уже существующие инструменты наша команда решила сделать ещё один: PVS-Studio for Java :). В конце рассмотрим важный вопрос интеграции инструментов статического анализа в большие старые проекты и почему так важно регулярное использование подобных инструментов.
Что могут статические анализаторы, чего не могут программисты и тестировщикиAndrey Karpov
Одной из технологий выявления ошибок на ранних этапах является статический анализ кода. К сожалению, ряд инструментов реализуют анализ весьма поверхностно, что снижает доверие к методологии статического анализа в целом. Некоторые программисты начинают думать, что анализ кода — это нечто, базирующееся на регулярных выражениях и они сами легко найдут такие ошибки. На самом деле всё гораздо сложнее и интересней. Более того, многие ошибки невероятно сложно найти, если не использовать инструменты статического анализа кода. И в этом докладе будет продемонстрировано множество таких случаев. Послушав доклад, вы взглянете на статический анализ совсем по-новому. Дополнительно будет рассказано с чего начать, если вы захотите внедрить инструмент статического анализа в уже существующий процесс разработки.
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
Статический анализ появился почти 40 лет назад. В своём докладе мы хотим показать, чему за это время научились статические анализаторы. Мы рассмотрим различные методики анализа, как они появлялись и какие ошибки можно найти с помощью них. Посмотрим на примеры ошибок, найденных PVS-Studio в Open Source проектах. Поговорим о том, чем статический анализатор отличается от "линтеров" и некоторых других инструментов, а также какие проблемы решает современный статический анализатор C++ кода, помимо собственно анализа кода.
Павел Беликов
@PVS-Studio, Тула, Россия
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
Сегодня я хочу посвятить пост тематике, почему инструменты анализа исходного кода полезны вне зависимости от уровня знаний и опыта программиста. А польза такого анализа будет продемонстрирована на примере инструмента, который известен всем программистам - WinMerge.
Здесь вы найдёте 60 вредных советов для программистов и пояснение, почему они вредные. Всё будет одновременно в шутку и серьёзно. Как бы глупо ни смотрелся вредный совет, он не выдуман, а подсмотрен в реальном мире программирования.
In this article, you're going to find 60 terrible coding tips — and explanations of why they are terrible. It's a fun and serious piece at the same time. No matter how terrible these tips look, they aren't fiction, they are real: we saw them all in the real programming world.
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Andrey Karpov
Есть ошибки, которые легко прячутся от программистов на обзорах кода. Чаще всего они связаны с опечатками или недостаточным знанием тонких нюансах языка/библиотеки. Давайте посмотрим интересные примеры таких ошибок и как их можно выявить с помощью статического анализа. При этом анализаторы не конкурируют с обзорами кода или, например, юнит-тестами. Они отлично дополняют другие методологии борьбы с ошибками.
PVS-Studio analyzes source code and finds various errors and code quality issues across multiple languages and frameworks. The document highlights 20 examples of issues found, including uninitialized variables, unreachable code, incorrect operations, security flaws, and typos. PVS-Studio is able to find these issues using techniques such as data-flow analysis, method annotation analysis, symbolic execution, type inference, and pattern-based analysis to precisely evaluate the code and pinpoint potential bugs or code smells.
When should you start using PVS-Studio? What can PVS-Studio detect? Supported standards: MISRA, CWE, CERT, OWASP, AUTOSAR. What about analysis options? What about legacy code?
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Andrey Karpov
George Gribkov presented on how to introduce static analysis to make programmers' and QA engineers' lives easier. Static analysis automatically checks code for bugs without executing it. While initial attempts to analyze Unreal Engine 4 failed, monitoring compiler calls directly succeeded in finding over 1800 warnings. Epic Games now uses continuous static analysis to receive early warnings. The best practices are to start analysis early and regularly in development and CI/CD pipelines, and to gradually fix old warnings using suppression files to ratchet down reported issues over time. Static and dynamic analysis complement each other to thoroughly check for errors.
Best Bugs from Games: Fellow Programmers' MistakesAndrey Karpov
George Gribkov will present on errors found in the code of popular games like System Shock, Doom 3, and osu!. He will discuss how his tool searches for code errors, provide examples of bugs detected, and conclude his presentation. The examples will showcase issues like unused variables, incorrect increment variables in for loops, null pointer dereferences, and misunderstandings of operators like ??. Corrections will be proposed to address the bugs.
Does static analysis need machine learning?Andrey Karpov
This document discusses whether static analysis needs machine learning. It begins with an introduction to static analysis and outlines existing static analysis solutions like DeepCode, Infer, SapFix, Embold, Source{d}, Clever-Commit, and CodeGuru. It then addresses problems with learning manually or from real large code bases, like outdated code and lack of documentation. Finally, it discusses promising approaches like analyzing code style, collecting additional metrics, and best practices for specific frameworks.
Typical errors in code on the example of C++, C#, and JavaAndrey Karpov
Objectives of this webinar
How we detected error patterns
Patterns themselves and how to avoid them:
3.1 Copy-paste and last line effect
3.2 if (A) {...} else if (A)
3.3 Errors in checks
3.4 Array index out of bounds
3.5 Operator precedence
3.6 Typos that are hard to spot
How to use static analysis properly
Conclusion
Q&A
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)Andrey Karpov
How to fight bugs in legacy code?
Should you do it at all?
What to do if there are hundreds or even thousands of errors?(that’s usually the case)
How to avoid spending a plethora of man-hours on this?
And still, how did you work with Unreal Engine?
C++ Code as Seen by a Hypercritical ReviewerAndrey Karpov
We all do code reviews. Who doesn't admit this – does it twice as often. C++ code reviewers look like a sapper. .. except that they can make a mistake more than once. But sometimes the consequences are painful . Brave code review world.
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareAndrey Karpov
The document discusses using static code analysis when teaching or developing open-source software. It outlines how static analysis can help instructors check student homework and projects more efficiently, and help students learn about error patterns. When using static analysis for open-source projects, it recommends integrating it into developers' workflows locally and via continuous integration systems. Regular use is key to maximizing its benefits for finding and fixing bugs.
Static Code Analysis for Projects, Built on Unreal EngineAndrey Karpov
Why Do You Need Static Analysis? Detect errors early in the program development process. Get recommendations on code formatting. Check your spelling. Calculate various software metrics.
Are С and C++ Alive? Even More, IBM RPG Is! C and C++ Are Not Just for Old Systems. Are С and C++ Alive? Summary for C, C++. Embedded: C and С++ Are on the Rise.
Zero, one, two, Freddy's coming for youAndrey Karpov
This post continues the series of articles, which can well be called "horrors for developers". This time it will also touch upon a typical pattern of typos related to the usage of numbers 0, 1, 2. The language you're writing in doesn't really matter: it can be C, C++, C#, or Java. If you're using constants 0, 1, 2 or variables' names contain these numbers, most likely, Freddy will come to visit you at night. Go on, read and don't say we didn't warn you.
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOpsAndrey Karpov
The document discusses integrating the PVS-Studio static code analyzer with Azure DevOps and Chocolatey. It provides steps to configure a build pipeline in Azure DevOps to install PVS-Studio using Chocolatey, run analysis on a project, and publish the results. The analysis found several potential bugs in the Chocolatey code including logical errors, redundant checks, and null reference issues. Integrating PVS-Studio with these tools helps improve code quality.
2. Статический анализатор кода PVS-Studio
• Windows. Visual Studio 2010-2019. C, C++, C++/CLI, C++/CX, C#
• Windows/Linux. Keil µVision, DS-MDK. ARM Compiler 5/6: C, C++
• Windows. IAR Embedded Workbench. C/C++ Compiler for ARM: C, C++
• Windows/Linux. Texas Instruments Code Composer Studio,
ARM Code Generation Tools - Compiler: C, C++
• Windows/Linux/macOS. Clang. C, C++, Java
• Linux/macOS. GCC. C, C++
• Windows. MinGW. C, C++
3. Статический анализатор кода PVS-Studio
• Плагин для Visual Studio 2010-2019
• Интеграция с SonarQube, QtCreator, CLion, Eclipse CDT, Anjuta
DevStudio и так далее
• Интеграция с облачными CI платформами, например, Travis CI
• C and C++ Compiler Monitoring UI утилита для IDE-независимой
проверки проектов и работы с отчётом анализатора
• HTML отчёт с встроенным текстом программы
4. К августу 2019 года в PVS-Studio
реализовано:
• C, C++ диагностик: 465
• C# диагностик: 141
• Java диагностик: 69
5. Большое внимание уделяется
предупреждениям
• Поддерживается классификация предупреждений согласно:
• Common Weakness Enumeration (CWE)
• SEI CERT C Coding Standard
• SEI CERT C++ Coding Standard
• MISRA C, MISRA C++
• Подробная документация на русском и английском языках:
• Online
• PDF
6. Основные возможности
• Быстрый старт (мониторинг компиляции)
• Windows утилита: CLMonitoring
• Linux/macOS утилита: pvs-studio-analyzer
• Возможность просматривать сообщения только в новом коде
(suppress файлы)
• Прямая интеграция анализатора в системы автоматизации сборки
и утилита BlameNotifier (рассылка писем)
• Режим автоматического анализа изменённых файлов
• Отличная масштабируемость
• Работа с ложными срабатываниями
7. Интеграция в облачные CI-системы
• Возможна реализация интеграции со сторонними облачными
платформами (напр. CircleCI, Travis CI, GitLab).
• Подробнее с этой возможностью можно ознакомиться в статье:
«PVS-Studio идёт в облака – запуск анализа на Travis CI»
9. Условие всегда истинно
• Данная ошибка хорошо демонстрирует, как в PVS-Studio работает
Data Flow анализ
• Эту ошибку мы нашли с помощью PVS-Studio в проекте Chromium
(Protocol Buffers)
• Анализатор выдаёт два предупреждения:
• V547 Expression 'time.month <= kDaysInMonth[time.month] + 1' is always
true. time.cc 83
• V547 Expression 'time.month <= kDaysInMonth[time.month]' is always true.
time.cc 85
14. Адрес локальной переменной
возвращается из функции по ссылке
Эту ошибку мы нашли с помощью PVS-Studio в проекте LLVM
V558 Function returns the reference to temporary local object: res. LiveInterval.h
679
SingleLinkedListIterator<T> &operator++(int) {
SingleLinkedListIterator res = *this;
++*this;
return res;
}
15. Арифметическое переполнение, потеря
значимости
Эту ошибку мы нашли с помощью PVS-Studio в проекте OpenXRay
V636 The '1 / 100' expression was implicitly cast from 'int' type to 'float' type.
Consider utilizing an explicit type cast to avoid the loss of a fractional part. An
example: double A = (double)(X) / Y;. gl_rendertarget.cpp 245
float CRenderTarget::im_noise_time;
....
param_noise_fps = 25.f;
param_noise_scale = 1.f;
im_noise_time = 1/100;
....
16. Выход за границу массива
Эту ошибку мы нашли с помощью PVS-Studio в проекте Notepad++
V557 Array overrun is possible. The value of 'i' index could reach 46. Notepad++
preferencedlg.cpp 984
int encodings[] = {1250, 1251, 1252, .... };
for (int i = 0; i <= sizeof(encodings)/sizeof(int); i++)
{
int cmdID = em->getIndexFromEncoding(encodings[i]);
....
}
17. Мёртвый код
Эту ошибку мы нашли с помощью PVS-Studio в проекте Unreal Engine 4
V607 Ownerless expression 'NumByteProperties'. codegenerator.cpp 633
int32 NumByteProperties = 0;
....
if (bIsByteProperty)
{
NumByteProperties;
}
18. Недостижимый код
Эту ошибку мы нашли с помощью PVS-Studio в проекте Linux Kernel
V695 Range intersections are possible within conditional expressions. Example: if
(A < 5) { ... } else if (A < 2) { ... }. Check lines: 439, 441. ad5933.c 441
if (val > 511)
val = (val >> 1) | (1 << 9);
else if (val > 1022)
val = (val >> 2) | (3 << 9);
19. Неинициализированные переменные
Эту ошибку мы нашли с помощью PVS-Studio в проекте Mono
V3070 Uninitialized variable 'schema' is used when initializing the
'ResourceSchema' variable. ResXResourceWriter.cs 59
class ResXResourceWriter : IResourceWriter, IDisposable
{
public static readonly string ResourceSchema = schema;
....
static string schema = ....;
}
На момент инициализации ResourceSchema, поле schema будет
проинициализировано значением по умолчанию (null в данном случае).
20. Неиспользуемые переменные и аргументы
Эту ошибку мы нашли с помощью PVS-Studio в проекте Xenko
V3065 Parameter 'height' is not utilized inside method's body. SiliconStudio.Xenko
Image.cs 473
public static Image New3D(int width, int height, int depth, ....)
{
return new Image(
CreateDescription(
TextureDimension.Texture3D,
width, width, depth,
mipMapCount, format, 1),
dataPointer, 0, null, false);
}
21. Некорректные операции сдвига
Эту ошибку мы нашли с помощью PVS-Studio в проекте Bitcoin
V629 Consider inspecting the '0x80 << (8 * (vch.size() - 1))' expression. Bit shifting
of the 32-bit value with a subsequent expansion to the 64-bit type. script.h 169
Происходит переполнение при сдвиге 32-битного значения 0x80. Сейчас
исправленный вариант кода выглядит так:
static int64_t set_vch(....) {
int64_t result = 0;
....
return -(result & ~(0x80 << (8 * (vch.size() - 1))));
return -((int64_t)(result & ~(0x80ULL << (8 * (vch.size() - 1)))));
22. Неправильная работа с типами
Эту ошибку мы нашли с помощью PVS-Studio в проекте VirtualBox
V745 A 'wchar_t *' type string is incorrectly converted to 'BSTR' type string.
Consider using 'SysAllocString' function. vboxcredentialprovider.cpp 231
HRESULT EventClassID(BSTR bstrEventClassID);
static HRESULT VBoxCredentialProviderRegisterSENS(void)
{
hr = pIEventSubscription->put_EventClassID(
L"{d5978630-5b9f-11d1-8dd2-00aa004abd5e}");
23. Неправильное представление о работе
функции/класса
Эту ошибку мы нашли с помощью PVS-Studio в проекте Unity3D
V3057 Invalid regular expression patern in constructor. Inspect the first argument.
AssetBundleDemo ExecuteInternalMono.cs 48
private static readonly Regex UnsafeCharsWindows =
new Regex("[^A-Za-z0-9_-.:,/@]");
При попытке создания экземпляра класса Regex с данным паттерном, мы
получим исключение System.ArgumentException с сообщением:
parsing "[^A-Za-z0-9_-.:,/@]" -
Unrecognized escape sequence '_'.
25. Оформление кода не совпадает с логикой
его работы
Эту ошибку мы нашли с помощью PVS-Studio в проекте Sony ATF
V3043 The code's operational logic does not correspond with its formatting. The
statement is indented to the right, but it is always executed. It is possible that
curly brackets are missing. Atf.Core.vs2010 QuatF.cs 282
public static QuatF Slerp(QuatF q1, QuatF q2, float t)
{
double dot = q2.X * q1.X + q2.Y * q1.Y +
q2.Z * q1.Z + q2.W * q1.W;
if (dot < 0)
q1.X = -q1.X; q1.Y = -q1.Y; q1.Z = -q1.Z; q1.W = -q1.W;
26. Ошибки при работе с исключениями
Эту ошибку мы нашли с помощью PVS-Studio в проекте OpenMW
V596 The object was created but it is not being used. The 'throw' keyword could
be missing: throw logic_error(FOO); components exprparser.cpp 101
if (t1==t2)
mOperands.push_back (t1);
else if (t1=='f' || t2=='f')
mOperands.push_back ('f');
else
std::logic_error ("failed to ....... ");throw
27. Переполнение буфера
Эту ошибку мы нашли с помощью PVS-Studio в проекте FreeBSD
V512 A call of the 'strcpy' function will lead to overflow of the buffer 'p->vendor'.
aacraid_cam.c 571
#define SID_VENDOR_SIZE 8
char vendor[SID_VENDOR_SIZE];
....
strcpy(p->vendor,"Adaptec ");
Строка содержит 8 символов. Однако следует учитывать, что функция strcpy
добавит терминальный ноль. Он будет записан за пределами буфера.
28. Проблемы безопасности
Эту ошибку мы нашли с помощью PVS-Studio в проекте PostgreSQL
V597 The compiler could delete the 'memset' function call, which is used to flush
'final' buffer. The RtlSecureZeroMemory() function should be used to erase the
private data. pgcrypto crypt-md5.c 157
Компилятор удаляет вызов функции memset: http://www.viva64.com/ru/w/V597/
char *px_crypt_md5(....) {
unsigned char final[MD5_SIZE];
....
/* Don't leave anything around in vm they could use. */
memset(final, 0, sizeof final);
}
29. Путаница с приоритетом операций
Эту ошибку мы нашли с помощью PVS-Studio в проекте Linux Kernel
V502 Perhaps the '?:' operator works in a different way than it was expected. The
'?:' operator has a lower priority than the '|' operator. core.c 1046
static int nvme_pr_preempt(struct block_device *bdev,
u64 old, u64 new, pr_type type, bool abort)
{
u32 cdw10 = nvme_pr_type(type) << 8 | abort ? 2 : 1;
1
2
30. Разыменование нулевого указателя /
нулевой ссылки
Эту ошибку мы нашли с помощью PVS-Studio в проекте LibreOffice
V595 The 'pSysWin' pointer was utilized before it was verified against nullptr.
Check lines: 738, 739. updatecheckui.cxx 738
MenuBar *pMBar = pSysWin->GetMenuBar();
if ( pSysWin && pMBar )
{
AddMenuBarIcon( pSysWin, true );
}
31. Ошибки синхронизации
Эту ошибку мы нашли с помощью PVS-Studio в проекте Unity3D
V3083 Unsafe invocation of event 'unload', NullReferenceException is possible.
Consider assigning event to a local variable before invoking it. AssetBundleDemo
AssetBundleManager.cs 47
internal void OnUnload()
{
m_AssetBundle.Unload(false);
if (unload != null)
unload();
}
32. Целочисленное деление на 0
Эту ошибку мы нашли с помощью PVS-Studio в проекте Inkscape
V609 Divide by zero. Denominator range [0..999]. lpe-fillet-chamfer.cpp 607
} else if (type >= 3000 && type < 4000) {
unsigned int chamferSubs = type-3000;
double chamfer_stepsTime = 1.0/chamferSubs;
Диапазон
[0..999]
33. Утечки памяти
• Частый вопрос: обнаруживает ли анализатор PVS-Studio утечки
памяти?
• Короткий ответ: да
• Более полный ответ: да, но, как и любой статический анализатор,
делает это иногда хуже, чем динамические анализаторы кода
• Подробнее про поиск утечек памяти с помощью PVS-Studio:
https://www.viva64.com/ru/b/0543/
• Рассмотрим пример
34. Утечки памяти
Эту ошибку мы нашли с помощью PVS-Studio в проекте PDFium
V773 The function was exited without releasing the 'pContext' pointer. A memory
leak is possible. fx_codec_jpeg.cpp 421
std::unique_ptr<CCodec_JpegModule::Context>
CCodec_JpegModule::Start()
{
auto* pContext = new CJpegContext();
if (setjmp(pContext->m_JumpMark) == -1)
return nullptr;
....
}
35. Ошибки при переносе кода на 64-битные
платформы
Эту ошибку мы нашли с помощью PVS-Studio в проекте TortoiseSVN
DialogBoxParam(g_hmodThisDll,
MAKEINTRESOURCE(IDD_LOGIN),
g_hwndMain,
(DLGPROC)(LoginDialogProc),
(long)this);
V220 Suspicious sequence of types castings: memsize -> 32-bit integer ->
memsize. The value being casted: 'this'. logindialog.cpp 105
Тип long в Win64 по прежнему 32-битный. В 64-битной программе объект может быть создан за
пределами младших 4 Гигабайт памяти. В этом случае значение указателя будет испорчено.
Неприятная ошибка, которая может проявляться очень редко после долгой работы программы.
Правильно: (LPARAM)(this).
36. PVS-Studio и Java-проекты
Целочисленное деление
Эту ошибку мы нашли с помощью PVS-Studio в проекте IntelliJ IDEA
private static boolean checkSentenceCapitalization(@NotNull String value)
{
List<String> words = StringUtil.split(value, " ");
....
int capitalized = 1;
....
return capitalized/words.size() < 0.2; // allow reasonable amount of
// capitalized words
}
V6011 [CWE-682] The '0.2' literal of the 'double' type is compared to a value of the 'int' type.
TitleCapitalizationInspection.java 169
37. PVS-Studio и Java-проекты
NullPointerException
Эту ошибку мы нашли с помощью PVS-Studio в проекте Elasticsearch
private static PathTrie<RequestHandler> defaultHandlers(....) {
....
handlers.insert("POST /batch/storage/v1", (request) -> {
....
line = reader.readLine();
byte[] batchedBody = new byte[0];
if ((line != null) ||
(line.startsWith("--" + boundary) == false))
{
....
}
....
});
....
}
V6008 Null dereference of 'line'. GoogleCloudStorageFixture.java(451)
38. Динамический анализ лучше статического?
• Нет
• У каждого вида анализа есть слабые и сильные стороны
• Эти подходы не конкурируют между собой
• Статический и динамический анализ дополняют друг друга
• Зачем нужен динамический анализ кода, если есть статический?
https://www.viva64.com/ru/b/0643/
39. Пример ошибки, «невидимой» для
динамического анализа
Эту ошибку мы нашли с помощью PVS-Studio в проекте Valgrind
V779 Unreachable code detected. It is possible that an error is present.
host_arm_isel.c 461
if (guard->tag == Iex_Const
&& guard->Iex.Const.con->tag == Ico_U1
&& guard->Iex.Const.con->Ico.U1 == True) {
/* unconditional -- do nothing */
} else {
goto no_match; //ATC
cc = iselCondCode( env, guard );
}
40. Опечатки и Copy-Paste
• Анализатор PVS-Studio эффективно выявляет опечатки и
последствия неудачного Copy-Paste
• В анализаторе реализовано много диагностик для выявления
ошибок этого рода
• Остановимся на них чуть подробнее и рассмотрим несколько
примеров ошибок этого типа
• Дополнительно рекомендуем для чтения интересные статьи:
• Эффект последней строки - http://www.viva64.com/ru/b/0260/
• Зло живёт в функциях сравнения - https://www.viva64.com/ru/b/0509/
41. Опечатки и Copy-Paste (пример N1)
Эту ошибку мы нашли с помощью PVS-Studio в проекте Clang
V501 There are identical sub-expressions 'OpcodeLHS == BO_LE' to the left and to
the right of the '||' operator. RedundantExpressionCheck.cpp 174
if ((OpcodeLHS == BO_EQ ||
OpcodeLHS == BO_LE ||
OpcodeLHS == BO_LE)
&&
(OpcodeRHS == BO_EQ ||
OpcodeRHS == BO_GT ||
OpcodeRHS == BO_GE))
42. Опечатки и Copy-Paste (пример N2)
Эту ошибку мы нашли с помощью PVS-Studio в проекте GCC
V501 There are identical sub-expressions '!strcmp(a->v.val_vms_delta.lbl1, b-
>v.val_vms_delta.lbl1)' to the left and to the right of the '&&' operator.
dwarf2out.c 1428
return (!strcmp (a->v.val_vms_delta.lbl1,
b->v.val_vms_delta.lbl1)
&& !strcmp (a->v.val_vms_delta.lbl1,
b->v.val_vms_delta.lbl1));
43. Опечатки и Copy-Paste (пример N3)
Эту ошибку мы нашли с помощью PVS-Studio в проекте MySQL
V525 The code containing the
collection of similar blocks. Check
items '0', '1', '2', '3', '4', '1', '6' in
lines 680, 682, 684, 689, 691, 693,
695. sql records.cc 680
static int rr_cmp(uchar *a,uchar *b)
{
if (a[0] != b[0])
return (int) a[0] - (int) b[0];
if (a[1] != b[1])
return (int) a[1] - (int) b[1];
if (a[2] != b[2])
return (int) a[2] - (int) b[2];
if (a[3] != b[3])
return (int) a[3] - (int) b[3];
if (a[4] != b[4])
return (int) a[4] - (int) b[4];
if (a[5] != b[5])
return (int) a[1] - (int) b[5];
if (a[6] != b[6])
return (int) a[6] - (int) b[6];
return (int) a[7] - (int) b[7];
}
5
44. Опечатки и Copy-Paste (пример N4)
Эту ошибку мы нашли с помощью PVS-Studio в проекте PowerShell
V3001 There are identical sub-expressions 'BaseMaximumVersion != null' to the
left and to the right of the '&&' operator. System.Management.Automation
ImportModuleCommand.cs 1663
internal Version BaseMinimumVersion { get; set; }
internal Version BaseMaximumVersion { get; set; }
protected override void ProcessRecord()
{
if (BaseMaximumVersion != null &&
BaseMaximumVersion != null &&
BaseMaximumVersion < BaseMinimumVersion)
46. Демонстрация возможностей PVS-Studio
• Для демонстрации возможностей анализатора мы проверяем
открытые проекты.
• Побочный результат: в этих проектах нашей командой было
найдено 13 124 ошибок
• Это именно 13 124 ошибок, а не количество сообщений,
выданных анализатором
47. Демонстрация возможностей PVS-Studio
• Благодаря нашей команде и анализатору PVS-Studio в открытых
проектах исправили более 10 000 ошибок
• Вы можете увидеть все эти ошибки здесь:
http://www.viva64.com/ru/examples/
• База ошибок постоянно пополнятся и её можно использовать при
написании статей о качестве кода и составлении стандартов
кодирования
48. Правильный сценарий использования
• Конечно, интересно и полезно запустить анализатор PVS-Studio и
найти ошибку, которую до этого безуспешно искали 50 часов
http://www.viva64.com/ru/b/0221/
• Хорошо проверять проекты и описывать найденные ошибки, как
обычно мы это делаем в рекламных целях
http://www.viva64.com/ru/inspections/
• Но следует помнить, что разовые проверки - это неправильный
способ использования анализаторов кода!
49. Правильный сценарий использования
• Статический анализатор приносит пользу, когда он используется
регулярно
• Два основных варианта:
• Автоматический анализ изменённого кода
• Ночные проверки
• Подробнее эти режимы рассмотрены в документации
https://www.viva64.com/ru/m/
53. Например, вот эту известную уязвимость
можно было бы найти с помощью PVS-Studio
static OSStatus
SSLVerifySignedServerKeyExchange(.....)
{
OSStatus err;
....
if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
goto fail;
goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
goto fail;
....
fail:
SSLFreeBuffer(&signedHashes);
SSLFreeBuffer(&hashCtx);
return err;
}
CVE-2014-1266
54. Например, вот эту известную уязвимость
можно было бы найти с помощью PVS-Studio
• PVS-Studio сообщает сразу о двух аномалиях:
• V640 / CWE-483 The code's operational logic does not correspond
with its formatting. The statement is indented to the right, but it is
always executed. It is possible that curly brackets are missing.
• V779 / CWE-561 Unreachable code detected. It is possible that an
error is present.
• Подробности в статье "Как PVS-Studio может помочь в
поиске уязвимостей?"
https://www.viva64.com/ru/b/0514/
55. V1010
• В 2018 году появилась специализированная диагностика V1010,
которая выявляет использование недостоверных данных
(полученных извне) без их проверки
• Диагностика поможет выявлять потенциальные уязвимости,
которые можно классифицировать как CWE-20: Improper
Input Validation
56. Пример V1010 в проекте NcFTP
static int NcFTPConfirmResumeDownloadProc(....)
{
....
(void) fgets(newname, sizeof(newname) - 1, stdin);
newname[strlen(newname) - 1] = '0';
if (newname[0] == '0') {
....
} else {
....
}
....
}
V1010 Unchecked tainted data is used in index: 'strlen(newname)'. ncftp cmds.c 1228
59. Использование PVS-Studio: внедрение
• Бывает непросто начать использовать статический анализ в
большом проекте
• Непонятно, что делать с сообщениями в старом коде…
• Мы предлагаем решение: скрытие предупреждений с помощью
suppress-файлов
• Подробнее: http://www.viva64.com/ru/b/0364/
60. Использование PVS-Studio: подавление
ложных срабатываний
• Различные способы подавить ложные срабатывания в
конкретных строках кода
• Подавление ложных срабатываний в макросах
• Подавление ложных предупреждений с помощью файлов
конфигурации диагностик pvsconfig
• Подробнее: http://www.viva64.com/ru/m/0017/
61. Использование PVS-Studio: исключение из
анализа
• Возможность исключить из анализа файлы по имени, папке или
маске
• Интерактивная фильтрация результатов анализа (лога) в окне PVS-
Studio:
• по коду диагностики
• по имени файла
• по включению слова в текст диагностики
64. Использование PVS-Studio: непрерывная
интеграция
• Запуск из командной строки для проверки всего решения:
позволяет интегрировать PVS-Studio в ночные сборки, чтобы
утром у всех был свежий лог
• Сохранение и загрузка результатов анализа: можно ночью
проверить код, сохранить результаты, а утром загрузить их и
смотреть
• Утилита BlameNotifier: инструмент позволяет рассылать письма
разработчикам об ошибках, которые PVS-Studio нашел во время
ночного прогона
• Использование относительных путей в файлах отчета
65. Использование PVS-Studio: прочее
• Удобная online-справка по всем диагностикам, которая доступна и
из программы, и на сайте, а также документация в .pdf одним
файлом
• Интерактивная фильтрация результатов анализа (лога) в окне PVS-
Studio
• Автоматическая проверка на наличие новых версий PVS-Studio
66. Использование PVS-Studio: Linux/macOS
• PVS-Studio легко использовать в Linux/macOS
• Но, чтобы не гадать с настройками и ключами запуска, просим
ознакомиться с инструкцией
• Как запустить PVS-Studio в Linux/macOS:
http://www.viva64.com/ru/m/0036/
• Я знаю, что мы все не любим читать инструкции. Но поверьте,
этот тот случай, когда всё просто, кратко и экономит ваше время!
67. Использование PVS-Studio: быстрый старт
• Отдельного внимания заслуживает возможность быстро
попробовать PVS-Studio на любом проекте
• Для этого можно отследить запуски компилятора и собрать всю
необходимую для анализа информацию
• Windows:
• Утилита C and C++ Compiler Monitoring UI
• Инструкция: http://www.viva64.com/ru/m/0033/
• Linux/macOS
• Утилита pvs-studio-analyzer
• Инструкция: см. «Быстрый старт» в документе
http://www.viva64.com/ru/m/0036/
68. Использование PVS-Studio: SonarQube
• Для импорта результатов анализа в
SonarQube мы разработали плагин
• Использование плагина позволяет
добавлять сообщения, найденные
анализатором PVS-Studio, в базу
сообщений сервера SonarQube
69. Использование PVS-Studio: SonarQube
• Подробности изложены в статье
«Контролируем качество кода с помощью платформы SonarQube»
http://www.viva64.com/ru/b/0452/
72. Скачать и попробовать PVS-Studio
• Можно скачать демонстрационную версию и запросить
триальный ключ полной версии для Windows Linux или macOS
http://www.viva64.com/ru/pvs-studio-download/
• Про ограничения демонстрационной версии:
http://www.viva64.com/ru/m/0009/
78. Типы лицензий
Team License Enterprise License
Подходит небольшим отделам, обычно это первый
опыт использования анализаторов
Подходит сразу для нескольких отделов в
компании
Или Windows, или Linux, или macOS версия Версии для Linux, Windows и macOS
Поддержка систем непрерывной интеграции
(continuous integration)
Интеграция с SonarQube
Инструмент BlameNotifier
Поддержка IncrediBuild
Возможность предлагать для реализации
собственные диагностики.
Лицензию возможно купить на 1, 2 или 3 года Лицензию возможно купить на 1, 2 или 3 года
Ответ на письма в течение 48 часов Ответ на письма в течение 24 часов
Обычно используется в командах до 9 человек
В основном используется при размере команд
более 10 человек
79. Индивидуальные лицензии
• Мы позиционируем свой продукт как B2B решение, и у нас нет
индивидуальных лицензий
• Почему так получилось: http://www.viva64.com/ru/b/0320/
• Индивидуальные разработчики могут воспользоваться вариантом
бесплатного лицензирования
• Бесплатные варианты лицензирования PVS-Studio:
https://www.viva64.com/ru/b/0614/
80. Купить PVS-Studio
• Подробнее о лицензировании: https://www.viva64.com/ru/order
• Для заказа лицензии и получения информации о ценах,
напишите нам: support@viva64.com