- PVSM.RU - https://www.pvsm.ru -

PVS-Studio 7.04

Picture 4

Лето — не только сезон отпусков, но и время плодотворной работы. Солнечные дни так сильно заряжают энергией, что хватает сил и на поздние прогулки, и объёмные коммиты кода. Второй летний релиз PVS-Studio 7.04 получился достаточно большой, поэтому предлагаем вашему вниманию пресс-релиз, в котором обо всём и расскажем.

PVS-Studio [1] — это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках С, C++, C# и Java. Работает в среде Windows, Linux и macOS.

Возможности анализатора хорошо демонстрирует обширная коллекция ошибок [2] в коде, найденных нами в процессе проверки [3] различных отрытых проектов.

Предлагаем вашему вниманию обзор новых возможностей, вошедших в релиз PVS-Studio 7.04.

Поиск файлов с Copyleft-лицензиями

Разработчики откуда только не берут код, работая над поставленной задачей. Популярным источником Copy-Paste-кода является сайт Stackoverflow и ему подобные. Но возможны и ситуации, когда программист берёт код из Open Source проекта и не проверяет требования лицензии. Таким образом, в проект с закрытым исходным кодом может случайно попасть несколько файлов из Open Source проекта с Copyleft-лицензией, т.е. обязывающей делать весь код проекта публичным. В компаниях с большим количеством сотрудников за этим сложно уследить, а риски и проблемы могут быть серьёзными из-за таких действия. Так, в PVS-Studio для всех поддерживаемых языков (C, C++, C#, Java) появилась диагностика, которая поможет найти такие файлы.

Номера диагностик для разных языков:

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

/*  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

Для закрытых проектов

Если в закрытый проект добавить файл с такой лицензией (GPL3 в данном случае), то остальной исходный код необходимо будет открыть, из-за особенностей данной лицензии.

Такой тип copyleft лицензий называют "вирусными [7]" лицензиями, из-за их свойства распространяться на остальные файлы проекта. Проблема в том, что использование хотя бы одного файла с подобной лицензией в закрытом проекте автоматически делает весь исходный код открытым и обязывает распространять его вместе с бинарными файлами.

Диагностика занимается поиском следующих «вирусных» лицензий:

  • AGPL-3.0
  • GPL-2.0
  • GPL-3.0
  • LGPL-3.0

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

  1. Отказаться от использования данного кода (библиотеки) в своём проекте;
  2. Заменить используемую библиотеку;
  3. Сделать свой проект открытым.

Для открытых проектов

Мы понимаем, что данная диагностика неуместна для открытых проектов. Команда PVS-Studio способствует развитию открытых проектов, помогает исправлять в них ошибки [2] и предоставляет бесплатные варианты [8] лицензий. Однако, наш продукт является B2B решением и поэтому данная диагностика по умолчанию включена.

Если же ваш код распространяется под одной из указанных выше copyleft лицензий, то вы можете отключить данную диагностику следующими способами (для СС++ это V1042):

  • Если вы используете плагин PVS-Studio для Visual Studio, то, перейдя в Options > PVS-Studio > Detectable Errors > 1.General Analysis > V1042 можно отключить отображение данной диагностики в окне вывода анализатора. Минус данного способа в том, что ошибка всё равно будет записана в лог анализатора при его сохранении (или если анализ запускался из командной строки). Поэтому, при открытии такого лога на другой машине или конвертации результатов анализа в другой формат, отключенные таким образом сообщения могут появиться снова.
  • Если вы не используете плагин, хотите блокировать правило для всей команды или убрать сообщения его из отчёта анализатора, то можно добавить комментарий "//-V::1042" в файл конфигурации (.pvsconfig) или в один из глобальных заголовочных файлов. Для разработчиков, использующих Visual C++, хорошим вариантом будет добавить этот комментарий в файл «stdafx.h». Этот комментарий указывает анализатору отключить диагностику V1042. Подробнее об отключении диагностик с помощью комментариев рассказано в документации [9].
  • Если для конвертации отчётов используется утилита Plog Converter [10], то можно отключить диагностику, используя ключ "-d".

Для C# соответственно имеется в виду V3144, а для Java — V6071.

Пополнение списка опасных лицензий

Если вам известны ещё типы «вирусных» лицензий, которые в данный момент не выявляет инструмент, то вы можете сообщить нам о них через форму обратной связи [11]. И мы добавим их выявление в следующем релизе.

Новые диагностики

C, C++ (General)

  • V1040 [12]. Possible typo in the spelling of a pre-defined macro name.
  • V1041 [13]. Class member is initialized with dangling reference.
  • V1042 [13]. This file is marked with copyleft license, which requires you to open the derived source code.
  • V1043 [14]. A global object variable is declared in the header. Multiple copies of it will be created in all translation units that include this header file.

Отдельно хочется отметить диагностику с номером V1040 [12]. Ещё в статусе беты она уже нашла интересную ошибку в библиотеке всем известного проекта CMake:

V1040 [12] Possible typo in the spelling of a pre-defined macro name. The '__MINGW32_' macro is similar to '__MINGW32__'. winapi.h 4112

/* from winternl.h */
#if !defined(__UNICODE_STRING_DEFINED) && defined(__MINGW32_)
#define __UNICODE_STRING_DEFINED
#endif

Здесь допустили опечатку в имени __MINGW32_. В конце не хватает одного символа подчёркивания. Если сделать поиск по коду с этим именем, то можно убедиться, что в проекте действительно используют версию именно с двумя подчёркиваниями с двух сторон:

Picture 8

Посмотреть все найденные ошибки в проекте CMake можно в статье "CMake: тот случай, когда проекту непростительно качество его кода [15]".

C, C++ (MISRA)

  • V2551 [16]. MISRA. Variable should be declared in a scope that minimizes its visibility.
  • V2552 [17]. MISRA. Expressions with enum underlying type should have values corresponding to the enumerators of the enumeration.
  • V2553 [18]. MISRA. Unary minus operator should not be applied to an expression of the unsigned type.
  • V2554 [19]. MISRA. Expression containing increment (++) or decrement (--) should not have other side effects.
  • V2555 [20]. MISRA. Incorrect shifting expression.
  • V2556 [21]. MISRA. Use of a pointer to FILE when the associated stream has already been closed.
  • V2557 [22]. MISRA. Operand of sizeof() operator should not have other side effects.

C#

  • V3140 [23]. Property accessors use different backing fields.
  • V3141 [24]. Expression under 'throw' is a potential null, which can lead to NullReferenceException.
  • V3142 [25]. Unreachable code detected. It is possible that an error is present.
  • V3143 [26]. The 'value' parameter is rewritten inside a property setter, and is not used after that.
  • V3144 [5]. This file is marked with copyleft license, which requires you to open the derived source code.
  • V3145. [27] Unsafe dereference of a WeakReference target. The object could have been garbage collected before the 'Target' property was accessed.

Также в C# анализаторе добавлено вычисление возвращаемыхзаписываемых значений из get и set методов доступа свойств и async методов.

Сейчас мы работаем над улучшением отслеживания значений полей и свойств у объектов при передаче их в методы, а также отслеживанием содержимого кортежей. Эти улучшения будут доступны в следующем релизе анализатора.

Java

  • V6068 [28]. Suspicious use of BigDecimal class.
  • V6069 [29]. Unsigned right shift assignment of negative 'byte' / 'short' value.
  • V6070 [30]. Unsafe synchronization on an object.
  • V6071 [6]. This file is marked with copyleft license, which requires you to open the derived source code.

SonarQube 7.9 LTS

Долгожданный релиз

Почти 2 года прошло с момента последнего релиза LTS-версии SonarQube 6.7. Новую версию с особым рвением ждали, начиная с SQ 7.x, и, когда состоялся релиз LTS, пользователи начали активно переходить на неё, что повлекло разные проблемы. Вскоре вышел SQ 7.9.1 LTS с небольшими исправлениями, и разработчики сторонних плагинов тоже подготовили патчи.

К счастью, в плагине PVS-Studio возникла всего одна небольшая проблема, связанная с переходом на Java 11, которую мы оперативно исправили, и наши клиенты сразу перешли на работоспособную версию.

Также мы сохранили совместимость со старыми версиями SonarQube, и список поддерживаемых версий сейчас выглядит так: SonarQube 6.7 LTS и выше.

Поддержано больше языковых плагинов

Плагин PVS-Studio выполняет только конвертацию результатов анализа в формат базы данных SonarQube. Другими словами, просто загружает результаты анализа PVS-Studuio в SQ. Но для полноценной работы утилиты SonarScanner должны быть установлены плагины для языков программирования. Мы не стали разрабатывать то, что уже существует, поэтому просто добавляем поддержку уже существующих популярных плагинов. В этой версии мы добавили совместимость с языковыми плагинами Sonar C Community и SonarCFamily.

Весь список поддерживаемых языковых плагинов выглядит так:

Для загрузки результатов анализа PVS-Studio достаточно установить хотя бы один плагин из этого списка. Большинству пользователей достаточно установить только Sonar C++ Community, SonarC# или SonarJava. Остальные плагины могут понадобиться для более специфичных проектов.

При выборе плагинов необходимо учесть тот факт, что Community-плагины не совместимы с SonarCFamily. Но если вы используете только SonarQube Community Edition, то такой проблемы не возникнет.

Новая страница настроек

Ранее настраивать анализатор можно было только через конфигурационный файл sonar-project.properties. К этому способу никаких претензий нет. Он очень удобный и используется в 99% случаев, но мы дополнительно сделали страницу настроек в Administration > Configuration > PVS-Studio на сервере SonarQube, т.к. этим тоже удобно пользоваться в некоторых сценариях.

Страница настроек выглядит так:

Picture 10

При задании настроек двумя способами, приоритетными являются те, что указаны в файле sonar-project.properties.

Плагин для IntelliJ IDEA

Релизы новых версий IntelliJ IDEA и PVS-Studio отличаются по датам, и недавно возникла ситуация, когда вышла IntelliJ IDEA 192.*, а плагин PVS-Studio на ней не устанавливался. В этом релизе мы добавили поддержку последние версии IntelliJ IDEA, а также сделали доработки, чтобы избежать подобных проблем в будущем.

Плагины для Jenkins

PVS-Studio Plugin

PVS-Studio Plugin предназначен для публикации результатов работы анализатора PVS-Studio в системе непрерывной интеграции Jenkins в формате HTML. Ранее этот плагин был доступен только пользователям Windows, т.к. вызывал конвертер отчёта автоматически и делал это только для Windows. В PVS-Studio 7.04 плагин поддерживает только HTML-отчёты, которые необходимо сгенерировать отдельным шагом, но это позволило сделать плагин кросс-платформенным.

Warnings NG Plugin

Для Jenkins существует полезный плагин Warnings Next Generation Plugin [32] для просмотра результатов анализа от разных инструментов. Недавно мы добавили поддержку PVS-Studio в нём. Возможность загружать результаты анализа PVS-Studio с помощью этого плагина стала доступна в версии 6.0.0, релиз которой случайно совпал с релизом PVS-Studio 7.04:

Picture 1

Прочие улучшения

PVS-Studio_Cmd

В PVS-Studio_Cmd.exe был добавлен специальный режим работы — credentials. Этот режим позволит создавать файл настроек и вводить лицензионную информацию без использования GUI интерфейса (например, плагина для Visual Studio или утилиты C and C++ Compiler Monitoring UI). Особенно актуален этот режим при использовании на сборочном сервере (где может не быть описанных GUI утилит), в контейнерах, при интеграции с облачными решениями.

Анализ Unreal Engine проектов

В плагине PVS-Studio для Visual Studio была добавлена опция AutoloadUnrealEngineLog, включение которой позволяет автоматически загружать отчёт анализатора в окно вывода PVS-Studio после прохождения анализа. Без этой опции загрузку лога необходимо делать вручную через меню плагина.

Также в разделе документации "Проверка Unreal Engine проектов [33]" были описаны изменения стандартных сборочных скриптов, которые позволят проводить сборку и анализ в одно действие. Без модификации скриптов (при добавлении флага -StaticAnalyzer=PVSStudio к аргументам запуска) проводится только анализ проекта, без выполнения его сборки.

CLMonitor

Для утилиты CLMonitor была добавлена возможность отслеживания запусков компилятора для конкретного процесса. Это позволит отслеживать запуски компиляторов, относящихся только к конкретному проекту, даже при параллельной сборке нескольких проектов. Для работы в таком режиме используются флаги --parentProcessID %PID% (CLMonitor отслеживает процессы, дочерние относительно указанного) и --attach (CLMonitor отслеживает процессы, дочерние относительно текущей консоли).

pvs-studio-analyzer

В утилиту pvs-studio-analyzer, которая предназначена для проверки проектов в Linux и macOS, добавлен флаг --ignore-ccache:

pvs-studio-analyzer analyze ... --ignore-ccache ...

Если в сборке проекта используется утилита ccache, то PVS-Studio работает в режиме инкрементального анализа. Чтобы проверить проект полностью, не сбрасывая кэш утилиты ccache, используйте этот флаг.

Дополнительные ссылки

Чтобы быть в курсе наших новых публикаций, приглашаем подписаться на нас:

  1. Twitter: pvsstudio_rus [34]
  2. ВКонтакте: Анализатор PVS-Studio [35]
  3. Facebook: @StaticCodeAnalyzer [36]
  4. Instagram: @pvsstudio_rus [37]
  5. Telegram: PVS-Studio rus [38]
  6. RSS: viva64-blog-ru [39]

PVS-Studio:

  1. Страница продукта [1]
  2. Скачать [40]
  3. Документация [41]
  4. Клиенты [42]

PVS-Studio 7.04 - 5 [43]

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Svyatoslav Razmyslov. PVS-Studio 7.04 [43].

Автор: Святослав

Источник [44]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/pvs-studio/329031

Ссылки в тексте:

[1] PVS-Studio: https://www.viva64.com/ru/pvs-studio/

[2] коллекция ошибок: https://www.viva64.com/ru/examples/

[3] проверки: https://www.viva64.com/ru/inspections/

[4] V1042: https://www.viva64.com/ru/w/v1042/

[5] V3144: https://www.viva64.com/ru/w/v3144/

[6] V6071: https://www.viva64.com/ru/w/v6071/

[7] вирусными: https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%83%D1%81%D0%BD%D0%B0%D1%8F_%D0%BB%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F

[8] варианты: https://www.viva64.com/ru/b/0614/

[9] документации: https://www.viva64.com/ru/m/0017/

[10] Plog Converter: https://www.viva64.com/ru/m/0036/

[11] форму обратной связи: https://www.viva64.com/ru/about-feedback/

[12] V1040: https://www.viva64.com/ru/w/v1040/

[13] V1041: https://www.viva64.com/ru/w/v1041/

[14] V1043: https://www.viva64.com/ru/w/v1043/

[15] CMake: тот случай, когда проекту непростительно качество его кода: https://www.viva64.com/ru/b/0658/

[16] V2551: https://www.viva64.com/ru/w/v2551/

[17] V2552: https://www.viva64.com/ru/w/v2552/

[18] V2553: https://www.viva64.com/ru/w/v2553/

[19] V2554: https://www.viva64.com/ru/w/v2554/

[20] V2555: https://www.viva64.com/ru/w/v2555/

[21] V2556: https://www.viva64.com/ru/w/v2556/

[22] V2557: https://www.viva64.com/ru/w/v2557/

[23] V3140: https://www.viva64.com/ru/w/v3140/

[24] V3141: https://www.viva64.com/ru/w/v3141/

[25] V3142: https://www.viva64.com/ru/w/v3142/

[26] V3143: https://www.viva64.com/ru/w/v3143/

[27] V3145.: https://www.viva64.com/ru/w/v3145/

[28] V6068: https://www.viva64.com/ru/w/v6068/

[29] V6069: https://www.viva64.com/ru/w/v6069/

[30] V6070: https://www.viva64.com/ru/w/v6070/

[31] Sonar C++ Community: https://github.com/SonarOpenCommunity/sonar-cxx/releases

[32] Warnings Next Generation Plugin: https://plugins.jenkins.io/warnings-ng

[33] Проверка Unreal Engine проектов: https://www.viva64.com/ru/m/0043/

[34] pvsstudio_rus: https://twitter.com/pvsstudio_rus

[35] Анализатор PVS-Studio: https://vk.com/pvsstudio_rus

[36] @StaticCodeAnalyzer: https://www.facebook.com/StaticCodeAnalyzer/

[37] @pvsstudio_rus: https://www.instagram.com/pvsstudio_rus/

[38] PVS-Studio rus: https://t.me/pvsstudio_rus

[39] viva64-blog-ru: http://feeds.feedburner.com/viva64-blog-ru

[40] Скачать: https://www.viva64.com/ru/pvs-studio-download/

[41] Документация: https://www.viva64.com/ru/m/

[42] Клиенты: https://www.viva64.com/ru/customers/

[43] Image: https://habr.com/en/company/pvs-studio/blog/466195/

[44] Источник: https://habr.com/ru/post/466197/?utm_source=habrahabr&utm_medium=rss&utm_campaign=466197