Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
Текстовая трансляция CppCast 298: Инстр…

Текстовая трансляция CppCast 298: Инструменты анализа SonarSource

04 Июл 2021
Автор:

Эпизод 298 CppCast вышел 5 мая 2021 года. В этом выпуске Роб Ирвинг и Джейсон Тернер беседуют с Лоиком Жоли об инструментах статического анализа SonarSource. Кроме того, они обсудят Visual Studio 2019 STL, обновление компилятора GCC 11.1 и результаты опроса C++.

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image1.png

Спонсор данного эпизода – C++ Builder, многофункциональная среда разработки C++ приложений для Windows, позволяющая создавать приложения в 5 раз быстрее с меньшим количеством кода. Инструмент обеспечивает поддержку на протяжении всего жизненного цикла разработки для создания единой базы исходного кода. Все это возможно благодаря усовершенствованному компилятору на базе Clang, Dinkum, STL и библиотекам Boost и SDL 2 в C++ Builder's Package Manager и многому другому. Быстрая интеграция с конфигурациями непрерывной сборки с поддержкой проектов MSBuild, CMake и Ninja для индивидуальных разработчиков или целой команды. Доступ к 20 базам данных, таким как MariaDB, Oracle, SQL Server, Postgres и многим другим с высокоскоростным прямым доступом через Firedocs. Основное преимущество C++ Builder – это его фреймворки, многофункциональные библиотеки, открывающие большие возможности, чем другие C++ инструменты. Доступно использование удостоенного награды фреймворка VCL для высокопроизводительных приложений Windows и мощный фреймворк FireMonkey для кросс-платформенных iOS. Попробуйте последнюю версию на embarcadero.com.

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image2.png

Введение

Роб: Добро пожаловать на 298 выпуск CppCast! Сегодня у нас в гостях Лоик Жоли, C++ программист, докладчик, преподаватель и профессионал. Он представляет Францию в комитете по стандартизации ISO C++, а также является членом комитета, разрабатывающего следующую версию стандарта MISRA C++ для систем с повышенными требованиями к безопасности. Помимо кодинга на C++, увлекается преподаванием IT и делится своим опытом с коллегами. Часто выступает на встречах и конференциях и преподает в Telecom SudParis. После того, как он присоединился к SonarSource в 2018 году, он занимался разработкой статического анализа для C++, составляя правила, помогающие другим разработчикам и получая удовольствие от их реализации.

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image3.png

Фичи VS 2019 STL для C++20

Роб: Итак, начнем с коротких новостей. Давайте обсудим Visual Studio 2019 16.10, который, по-моему, уже вышел. Согласно их журналу изменений, в STL будет завершена реализация новых функций C++20, что довольно интересно.

Джейсон: Весьма иронично, что в std::format есть баг. Его часть случайно полагается на <locale>. Std::format не должен зависеть от <locale>. Фактически они хотят быстро исправить это в С++20. Но Microsoft уже пообещали обеспечить совместимость ABI с их стандартной библиотекой. Так что, если они хотят исправить это в стандартной Visual Studio, они не смогут это сделать, им все равно придется сначала избавиться от <locale> зависимости.

Лоик Жоли: Мне кажется немного странным фокусироваться на полной поддержке библиотеки. Что действительно важно для меня, так это поддержка на протяжении всего жизненного цикла разработки. Уверен, что это большой шаг вперед. Я в предвкушении.

Джейсон: Они достаточно близки к тому, чтобы осуществить это.

Релиз GCC 11.1

Роб: Итак, теперь обсудим обновление GCC 11.1.

Роб: Разработчики объявили о релизе компилятора, а также о том, что он поддерживает C++20. Теперь версия языка по умолчанию будет C++17, что очень здорово. Они уточнили, насколько далеко они продвинулись с поддержкой С++20, или они просто рассказали о прогрессе?

Джейсон: Я зашел на сайт Cpp reference, чтобы посмотреть на их версию диаграммы поддержки компилятора для C++20 GCC. Они утверждают, что согласовали все языковые особенности, кроме модулей. Что забавно, потому что Clang обычно развивается быстрее других. По диаграмме видно, что GCC и Visual Studio сильно опережают Clang по поддержке C++20.

Лоик Жоли: Я тоже заметил такую тенденцию. Меня это даже немного беспокоит, потому что это говорит о снижении темпов развития Clang. Раньше он был одним из первых по внедрению языковых особенностей. Я часто использую Clang.

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image4.png

Clang – замечательный инструмент. Но то, что он отстает от Visual Studio и от GCC – плохой знак. В Clang сейчас практически ничего нет для модулей. Даже в GCC не согласовали модули, но все остальное готово.

Джейсон: Просматривая этот список сравнений, я обратил внимание на пункт лямбды в невычисляемом контексте. Кажется, что согласовать это просто, но для разработчиков библиотек это достаточно сложно. В Clang нет даже частичной поддержки этого.

Роб: Надеюсь, скоро они наверстают упущенное.

Результаты опроса Meeting C++: самые востребованные фичи С++

Роб: Meeting C++ опубликовали результаты опроса. Пользователи голосовали за самые востребованные фичи С++. Основатель Meeting С++, Дженс Веллер сравнил результаты прошлогоднего опроса с результатами опроса этого года. Некоторые фичи стали менее актуальными, но большинство из них довольно стабильно используются из года в год.

Джейсон: Я ожидал, что гистограммы изменятся за год, а они практически идентичны. Изменения вовсе не значительные. Кажется, в том году количество людей, заявивших, что они не используют C++14 было больше. Может, конечно, это просто были разные группы людей.

Роб: Или они просто перешли на 17.

Джейсон: А возможно они неправильно поняли вопрос и ответили, что не используют 14, а используют 17.

SonarSource: SonarLint, SonarQube и SonarCloud

Роб: Итак, Лоик, что вы расскажете нам об инструментах SonarSource?

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image5.png

Лоик Жоли: Мы занимаемся разработкой SonarLint, SonarQube и SonarCloud. SonarLint – это расширение для IDE. Еще у нас есть SonarQube и SonarCloud, в которых используется концепция непрерывной интеграции. Например, наши инструменты позволяют проводить анализ pull request-ов и блокировать pull request-ы, которые угрожают безопасности вашего кода. Также имеется возможность просмотреть историю изменений кода.

Наша цель – предоставить удобные инструменты, помогающие разработчикам на протяжении всего процесса разработки продукта.

Роб: Для каких IDE доступен SonarLint?

Лоик Жоли: Он доступен для различных IDE в зависимости от языка. Для C++ мы поддерживаем Visual Studio. Некоторые инструменты поддерживают CLion.

Джейсон: Вот интересно, для чего может потребоваться полный доступ к проекту?

Лоик Жоли: Например, чтобы определить неиспользуемые функции.

Джейсон: Интересно. Недавно, работая с одним из клиентов, я потратил неделю или около того, чтобы удалить около ста тысяч строк кода, которые не использовались. Производительность проекта значительно улучшилась.

Лоик Жоли: В С++ не так-то просто обнаружить то, что не используется. Это очень сложно, потому что есть некоторые функции, которые не используются, но удалять их не хочется.

Джейсон: Ваш инструмент умеет находить те функции, которые вообще не используются?

Лоик Жоли: Нет. Мы не предоставляем инструмент, анализирующий код. Наш инструмент выдает предупреждения и пытается объяснить, почему они появились. Он находит подозрительные места в коде, чтобы вы могли понять, откуда появилась ошибка, однако наш инструмент не позволяет редактировать вашу кодовую базу.

Роб: Для каких языков можно использовать SonarSource?

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image6.png

Лоик Жоли: По-моему, мы работаем с 27 языками, но основной язык – Java. Изначально мы работали только с Java. Поэтому наши продукты часто используются Java-программистами. Кроме того, у нас также есть инструменты для C#, Python, JavaScript, Apps Script. Вроде, я упомянул самые основные, а если и забыл какие-то, мои коллеги убьют меня завтра :).

Джейсон: По счастливой случайности, один из моих друзей только что поделился со мной багом, которую SonarQube обнаружил в его кодовой базе на C#. Этот баг было практически невозможно найти, но SonarQube справился.

Джейсон: SonarLint – это проект с открытым исходным кодом?

Лоик Жоли: Интеграция IDE имеет открытый исходный код, но ядро анализатора C++ – закрытый исходный код. Вообще, SonarLint – бесплатный инструмент. Его также можно использовать бесплатно, если используете SonarCloud в проектах с открытым исходным кодом. Но если хотите использовать SonarCloud в закрытом проекте или если нужно проанализировать C++ проект в SonarQube, вам придется заплатить.

Роб: Итак, есть ли какие-то конкретные типы ошибок, с которыми часто сталкиваются ваши инструменты анализа SonarSource?

Лоик Жоли: Мы работаем с различными типами ошибок по самым разным направлениям. У нас много преимуществ по сравнению с другими инструментами. Мы не только ищем ошибки, но и создаем правила.

Компиляторы выдают предупреждения только при угрозе того, что код не скомпилируется. А мы же стараемся выдавать предупреждения только в случаях, когда код плохо написан.

Это и отличает наши инструменты от других. Например, у нас есть такие правила, как правило пяти (rule of five) или правило ноля (rule of zero). Код может быть написан правильно и без этих правил, но читать код, написанный в соответствии с этими правилами, гораздо проще.

Джейсон: Интересно, есть ли у вас правила, с помощью которых можно обнаружить неправильное использование умных указателей (smart pointers)?

Лоик Жоли: Нет, боюсь, такого у нас нет.

Роб: Вы упомянули плагин Visual Studio, работает ли SonarSource на Windows, Linux и Mac?

Лоик Жоли: Ядро SonarSource работает на Windows, Linux и Mac iOS. SonarLint скорее подходит для индивидуального использования. В то время как SonarCloud и SonarQube больше для командного использования. То, на какой платформе работает SonarLint, зависит от языка. Например, для Java мы работаем в Eclipse и в VS Code. Я точно не могу сказать, какой язык поддерживаются в каких IDE. Но мы стараемся поддерживать основные системы.

Для SonarQube и SonarCloud у нас есть некоторые правила, которыми могут пользоваться все члены команды. Это правило будет работать при каждом pull request-е. А в SonarLint также есть то, что мы называем режимом подключения (connected mode). Если вы запускаете SonarQube или SonarCloud, вы можете синхронизироваться с SonarLint.

0841_CppCast_298_SonarSource_Analysis_Tools_ru/image7.png

Так, например, если в SonarQube вы обозначаете правило ложноположительным или если вы хотите, чтобы оно больше не появлялось, мы перестанем выдавать предупреждения на него. То есть, наши инструменты лучше использовать в совокупности.

Джейсон: Итак, вы сказали, что SonarCloud доступен для проектов с открытым исходным кодом, верно?

Лоик Жоли: SonarCloud можно использовать для открытых или закрытых проектов. Для открытых проектов его можно использовать без каких-либо ограничений. Если нужно настроить SonarCloud или SonarQube, потребуется приложить немного усилий, чтобы интегрировать SonarSource в вашу систему. Но это не займет много времени, нужно всего лишь добавить пару строк кода. У нас есть несколько кратких руководств для начала работы и несколько примеров проектов, которые пользователь может посмотреть.

Реализация правил

Роб: Итак, вы упомянули, что, работая с анализом стека, вы реализуете правила и помогаете другим разработчикам в этом. Как появляются новые правила для инструментов анализа SonarSource?

Лоик Жоли: Иногда это оказывается сложной задачей. Бывают правила, на реализацию которых уходит времени больше, чем на разработку. Это может показаться странным, но я даже опубликовал статью в блоге об одном из таких правил.

Также я собираюсь написать статью о том, почему так трудно писать правила. С первого взгляда все просто. У вас есть четкое представление о том, как должно выглядеть правило, но как только приступаете к его реализации, все оказывается намного сложнее.

Расскажу вам, где мы ищем вдохновение для написания правил. Сначала мы находим проблему, а затем определяем способы ее оптимизации. Когда что-то не получается, мы стараемся запомнить проблему, чтобы потом попробовать написать правило.

Мы черпаем вдохновение для разработки правил из опыта и новых версий стандартов. Так, недавно мы потратили некоторое время на изучение нового стандарта C++20, чтобы понять, получится ли создать новые правила.

Мы также ищем вдохновение в CppCoreGuidelines, но мы не можем напрямую реализовывать правила из CppCoreGuidelines. Часто CppCoreGuideline требует пользователя писать код определенным способом, что вовсе не типично для написания кода на C++.

Мы не просим пользователей писать код определенным образом, чтобы мы смогли правильно его анализировать. Наш инструмент – инструмент для всех С++ разработчиков. Мы работаем с уже написанным кодом.

У нас также есть MISRA – стандарт разработки программного обеспечения, используемый в основном в автомобильной промышленности для обеспечения безопасности. Когда мы внедряли MISRA, мы использовали официальную версию MISRA 2008. В то время это был совершенно другой C++. Сейчас мы обновляемся до C++17. Не знаю точно, когда это завершится, но мы стараемся создать правила, применимые в любой ситуации, потому что безопасность кода очень важна и требует особой осторожности. Некоторые правила могут быть универсальными. А некоторые из них, скорее всего, будут применяться исключительно для обеспечения безопасности ПО.

Роб: То есть, если использовать какой-либо из инструментов SonarSource в кодовой базе, можно выбрать между правилами MISRA, Core Guidelines и другими?

Лоик Жоли: У нас есть несколько флажков в правилах, поясняющих их происхождение. У нас есть возможность создавать разные наборы правил. У нас нет полного покрытия MISRA C++ 2008, но мы и не хотели полностью покрывать MISRA C++ 2008. Сейчас мы работаем со следующей версией MISRA. У нас есть один профиль качества (Quality Profile) – Sonar way. Он представляет собой набор правил, которые, по нашему мнению, являются универсальными.

Когда мы создаем правило, мы тестируем его на 30-50 проектах с открытым исходным кодом. Мы запускаем его в LibreOffice, в Clang и в ядре Linux. Мы тестируем его на многих крупных проектах с открытым исходным кодом и смотрим результаты.

Джейсон: Собираете ли вы статистику того, как часто люди выбирают игнорировать правило в SonarCloud? Бывает ли такое, что сто тысяч пользователей взяли и проигнорировали определенное правило, и вам пришлось разбираться, что с ним не так.

Лоик Жоли: Мы только начинаем собирать такого рода отзывы от пользователей. Сначала мы должны были убедиться, что это будет абсолютно конфиденциально. Нужно осторожно обращаться с такого рода информацией от пользователей. Мы приложили много усилий, чтобы обеспечить безопасность данных.

Джейсон: Это так захватывающе. Вот кажется, что тысячи программистов, проигнорировавшие правило, просто не могут ошибаться, а в итоге они оказываются абсолютно не правы!

Лоик Жоли: У нас проводился эксперимент по проверке ПО. Программное обеспечение должно было быть протестировано дважды и дважды запущено на двух разных компьютерах параллельно, просто чтобы убедиться в надежности системы. Командам, которые принимали в этом участие, было запрещено общаться между собой. Были случаи, когда они находили один и тот же баг в одном и том же месте.

Джейсон: Вау.

Роб: Вы упомянули про реализацию некоторых новых правил безопасности для C++, что это за правила?

Лоик Жоли: Одним из не самых сложных в разработке правил было использование memset_s для очистки памяти. Даже если кто-то получит доступ к памяти, он не сможет узнать пароль, находящийся там.

У нас также есть куча правил для POSIX-функций, которые в основном предназначены для C, потому что в C проще получить переполнение буфера, чем в C++. У нас есть много POSIX-функций для char*, для аргументов, буфера и определения его размера.

При работе с такими функциями невозможно сделать все идеально, но мы постоянно совершенствуемся. Кроме того, мы также хотим улучшить процесс нотификации пользователей о найденных проблемах. У нас есть правила, которые помогают обнаружить неправильное использование POSIX-функций, из-за которого может возникнуть переполнение буфера. Мы также отслеживаем неправильное использование API.

Джейсон: Круто! Такие правила и правда сложно реализовывать.

Лоик Жоли: Да. Возможно, когда мы реализуем все эти правила, я выйду на пенсию. На данный момент мы уже добились значительных результатов, но многие процессы все еще нуждаются в улучшении.

Джейсон: Вы сказали, что используете статический анализатор Clang для бэкенда. Получается, если я запущу свой проект в SonarCloud, он будет проверяться по правилам Clang-Tidy и по вашим правилам? Или только по вашим правилам?

Лоик Жоли: Наши правила основаны на правилах Clang, но мы не берем все из Clang IDE. Мы сами разрабатываем правила. Конечно, мы просматриваем все возможные источники, но мы не просто копипастим правила Clang IDE.

Джейсон: Если я получу предупреждение о нарушении правил от одного из ваших инструментов, откуда будет получена эта информация? Вы сказали, что многие ваши правила основаны на Core Guidelines. Мне любопытно, если я получу уведомление о нарушении правил, получу ли я документацию, объясняющую, почему так делать нельзя?

Лоик Жоли: Фактически, для каждого правила у нас есть документация, в которой мы пытаемся объяснить, почему существует то или иное правило. Также вы всегда можете найти примеры плохого кода и пример того, как переписать его так, чтобы он стал лучше. Если мы используем некоторые сторонние источники для создания правила, такие как CppCoreGuideline или MISRA, мы ссылаемся на них. Предупреждение относится к определенному месту в коде, но мы также стараемся указывать и другие места в коде, с помощью которых можно понять, почему было выдано это предупреждение.

Роб: Лоик, круто, что вы пришли сегодня к нам. Всю информацию о SonarSource можно найти на sonarsource.com. А как слушатели могут с вами связаться? Есть ли у вас аккаунт в Твиттере, блог или что-то в этом роде?

Лоик Жоли: Ну, я человек старой закалки. Не сижу в Твиттере. Но я написал несколько статей в блоге SonarSource. Со мной можно связываются только по почте. Вот знаете, в девяностые только так и общались. Почему бы не использовать почту и сегодня? :)

Роб: Хорошо, ссылки на все новости, а также ссылку на ваш блог, можно найти в описании подкаста. Спасибо, что пришел.

Лоик Жоли: Спасибо.

Большое спасибо, что прослушали нашу беседу о C++.

Мы хотим узнать, что вы думаете о подкасте. Пожалуйста, дайте нам знать, интересно ли то, что мы обсуждаем, а также не стесняйтесь предлагать новые темы для подкастов. Отправляйте отзывы на feedback@cppcast.com. Можете поставить CppCast лайк или подписаться на наш Tвиттер. А также на наши аккаунты: @robirwing и Джейсона @lefticus в Twitter.

Мы также хотели бы поблагодарить всех наших спонсоров, которые поддерживают шоу через Patreon. Хотите поддержать CppCast на Patreon? Переходите по ссылке patreon.com/CppCast. Всю необходимую информацию можно найти в заметках к выпуску на сайте cppcast.com. Музыка для этого выпуска была предоставлена podcastthemes.com.

Ресурсы

Подкаст

Новости

Ссылки

Спонсоры

Примечание команды PVS-Studio

Хочется напомнить, что статический анализатор PVS-Studio можно интегрировать с SonarQube. В этом случае, PVS-Studio становится ещё одним источником данных об ошибках и потенциальных уязвимостей. SonarQube в свою очередь позволяет удобно, и что важно, единообразно, работать с предупреждениями, полученными от разных инструментов. См. раздел документации "Интеграция результатов анализа PVS-Studio в SonarQube" и мастер-класс "SonarQube: от установки до анализа production-кода".

Популярные статьи по теме


Комментарии (0)

Следующие комментарии next comments
close comment form
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS‑Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам