﻿# PVS\-Studio 7\.04

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

![0665_Release_7_04_ru/image1.png](https://import.viva64.com/docx/blog/0665_Release_7_04_ru/image1.png)

[PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/) \- это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках С, C\+\+, C\# и Java\. Работает в среде Windows, Linux и macOS\. 

Возможности анализатора хорошо демонстрирует обширная [коллекция ошибок](https://pvs-studio.ru/ru/blog/examples/) в коде, найденных нами в процессе [проверки](https://pvs-studio.ru/ru/blog/inspections/) различных отрытых проектов\.

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

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

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

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

* C, C\+\+: [V1042](https://pvs-studio.ru/ru/docs/warnings/v1042/)
* C\#: [V3144](https://pvs-studio.ru/ru/docs/warnings/v3144/)
* Java: [V6071](https://pvs-studio.ru/ru/docs/warnings/v6071/)

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

```cpp
/*  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 лицензий называют "[вирусными](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)" лицензиями, из\-за их свойства распространяться на остальные файлы проекта\. Проблема в том, что использование хотя бы одного файла с подобной лицензией в закрытом проекте автоматически делает весь исходный код открытым и обязывает распространять его вместе с бинарными файлами\. 

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

* AGPL\-3\.0
* GPL\-2\.0
* GPL\-3\.0
* LGPL\-3\.0

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

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

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

Мы понимаем, что данная диагностика неуместна для открытых проектов\. Команда PVS\-Studio способствует развитию открытых проектов, помогает исправлять в них [ошибки](https://pvs-studio.ru/ru/blog/examples/) и предоставляет бесплатные [варианты](https://pvs-studio.ru/ru/blog/posts/0614/) лицензий\. Однако, наш продукт является B2B решением и поэтому данная диагностика по умолчанию включена\.

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

* Если вы используете плагин PVS\-Studio для Visual Studio, то, перейдя в _Options \> PVS\-Studio \> Detectable Errors \> 1\.General Analysis \> V1042_ можно отключить отображение данной диагностики в окне вывода анализатора\. Минус данного способа в том, что ошибка всё равно будет записана в лог анализатора при его сохранении \(или если анализ запускался из командной строки\)\. Поэтому, при открытии такого лога на другой машине или конвертации результатов анализа в другой формат, отключенные таким образом сообщения могут появиться снова\.
* Если вы не используете плагин, хотите блокировать правило для всей команды или убрать сообщения его из отчёта анализатора, то можно добавить комментарий "//\-V::1042" в файл конфигурации \(\.pvsconfig\) или в один из глобальных заголовочных файлов\. Для разработчиков, использующих Visual C\+\+, хорошим вариантом будет добавить этот комментарий в файл "stdafx\.h"\. Этот комментарий указывает анализатору отключить диагностику V1042\. Подробнее об отключении диагностик с помощью комментариев рассказано в [документации](https://pvs-studio.ru/ru/docs/manual/0017/)\.
* Если для конвертации отчётов используется утилита [Plog Converter](https://pvs-studio.ru/ru/docs/manual/0036/), то можно отключить диагностику, используя ключ "\-d"\.

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

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

Если вам известны ещё типы "вирусных" лицензий, которые в данный момент не выявляет инструмент, то вы можете сообщить нам о них через [форму обратной связи](https://pvs-studio.ru/ru/about-feedback/)\. И мы добавим их выявление в следующем релизе\.

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

### C, C\+\+ \(General\)

* [V1040](https://pvs-studio.ru/ru/docs/warnings/v1040/)\. Possible typo in the spelling of a pre\-defined macro name\.
* [V1041](https://pvs-studio.ru/ru/docs/warnings/v1041/)\. Class member is initialized with dangling reference\.
* [V1042](https://pvs-studio.ru/ru/docs/warnings/v1042/)\. This file is marked with copyleft license, which requires you to open the derived source code\.
* [V1043](https://pvs-studio.ru/ru/docs/warnings/v1043/)\. 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](https://pvs-studio.ru/ru/docs/warnings/v1040/)\. Ещё в статусе беты она уже нашла интересную ошибку в библиотеке всем известного проекта CMake:

[V1040](https://pvs-studio.ru/ru/docs/warnings/v1040/) Possible typo in the spelling of a pre\-defined macro name\. The '\_\_MINGW32\_' macro is similar to '\_\_MINGW32\_\_'\. winapi\.h 4112

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

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

![0665_Release_7_04_ru/image3.png](https://import.viva64.com/docx/blog/0665_Release_7_04_ru/image3.png)

Посмотреть все найденные ошибки в проекте CMake можно в статье "[CMake: тот случай, когда проекту непростительно качество его кода](https://pvs-studio.ru/ru/blog/posts/cpp/0658/)"\.

### C, C\+\+ \(MISRA\)

* [V2551](https://pvs-studio.ru/ru/docs/warnings/v2551/)\. MISRA\. Variable should be  declared in a scope that minimizes its visibility\.
* [V2552](https://pvs-studio.ru/ru/docs/warnings/v2552/)\. MISRA\. Expressions with enum underlying type should have values corresponding to the enumerators of the enumeration\.
* [V2553](https://pvs-studio.ru/ru/docs/warnings/v2553/)\. MISRA\. Unary minus operator should not be applied to an expression of the unsigned type\.
* [V2554](https://pvs-studio.ru/ru/docs/warnings/v2554/)\. MISRA\. Expression containing increment \(\+\+\) or decrement \(\-\-\) should not have other side effects\.
* [V2555](https://pvs-studio.ru/ru/docs/warnings/v2555/)\. MISRA\. Incorrect shifting expression\.
* [V2556](https://pvs-studio.ru/ru/docs/warnings/v2556/)\. MISRA\. Use of a pointer to FILE when the associated stream has already been closed\.
* [V2557](https://pvs-studio.ru/ru/docs/warnings/v2557/)\. MISRA\. Operand of sizeof\(\) operator should not have other side effects\.

### C\#

* [V3140](https://pvs-studio.ru/ru/docs/warnings/v3140/)\. Property accessors use different backing fields\.
* [V3141](https://pvs-studio.ru/ru/docs/warnings/v3141/)\. Expression under 'throw' is a potential null, which can lead to NullReferenceException\.
* [V3142](https://pvs-studio.ru/ru/docs/warnings/v3142/)\. Unreachable code detected\. It is possible that an error is present\.
* [V3143](https://pvs-studio.ru/ru/docs/warnings/v3143/)\. The 'value' parameter is rewritten inside a property setter, and is not used after that\.
* [V3144](https://pvs-studio.ru/ru/docs/warnings/v3144/)\. This file is marked with copyleft license, which requires you to open the derived source code\.
* [V3145\.](https://pvs-studio.ru/ru/docs/warnings/v3145/) 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](https://pvs-studio.ru/ru/docs/warnings/v6068/)\. Suspicious use of BigDecimal class\.
* [V6069](https://pvs-studio.ru/ru/docs/warnings/v6069/)\. Unsigned right shift assignment of negative 'byte' / 'short' value\.
* [V6070](https://pvs-studio.ru/ru/docs/warnings/v6070/)\. Unsafe synchronization on an object\.
* [V6071](https://pvs-studio.ru/ru/docs/warnings/v6071/)\. 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\.

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

* [Sonar C\+\+ Community](https://github.com/SonarOpenCommunity/sonar-cxx/releases)
* [Sonar C Community](https://github.com/SonarOpenCommunity/sonar-cxx/releases)
* SonarC\#
* SonarJava
* SonarCFamily \(SQ Developer Edition\)

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

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

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

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

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

![0665_Release_7_04_ru/image5.png](https://import.viva64.com/docx/blog/0665_Release_7_04_ru/image5.png)

При задании настроек двумя способами, приоритетными являются те, что указаны в файле _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](https://plugins.jenkins.io/warnings-ng/) для просмотра результатов анализа от разных инструментов\. Недавно мы добавили поддержку PVS\-Studio в нём\. Возможность загружать результаты анализа PVS\-Studio с помощью этого плагина стала доступна в версии **6\.0\.0**, релиз которой случайно совпал с релизом PVS\-Studio 7\.04:

![0665_Release_7_04_ru/image6.png](https://import.viva64.com/docx/blog/0665_Release_7_04_ru/image6.png)

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

**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 проектов](https://pvs-studio.ru/ru/docs/manual/0043/)" были описаны изменения стандартных сборочных скриптов, которые позволят проводить сборку и анализ в одно действие\. Без модификации скриптов \(при добавлении флага _\-StaticAnalyzer\=PVSStudio_ к аргументам запуска\) проводится только анализ проекта, без выполнения его сборки\.

**CLMonitor**

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

**pvs\-studio\-analyzer**

В утилиту _pvs\-studio\-analyzer_, которая предназначена для проверки проектов в Linux и macOS, добавлен флаг _\-\-ignore\-ccache_:

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

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

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

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

1. Twitter: [pvsstudio\_rus](https://twitter.com/pvsstudio_rus)
1. ВКонтакте: [Анализатор PVS\-Studio](https://vk.com/pvsstudio_rus)
1. Telegram: [PVS\-Studio rus](https://t.me/pvsstudio_rus)
1. RSS: [viva64\-blog\-ru](http://feeds.feedburner.com/viva64-blog-ru)

PVS\-Studio:

1. [Страница продукта](https://pvs-studio.ru/ru/pvs-studio/)
1. [Скачать](https://pvs-studio.ru/ru/pvs-studio/download/)
1. [Документация](https://pvs-studio.ru/ru/docs/)
1. [Клиенты](https://pvs-studio.ru/ru/about/customers/)