﻿# Релиз PVS\-Studio 6\.26

Обычно мы не пишем заметки про выход новой версии анализатора PVS\-Studio\. Однако в новый релиз вошло много интересных изменений, касающихся анализа C и C\+\+ кода, о которых хочется рассказать нашим пользователям\.

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

## Скоро Java

Если честно, самые последние и интересные нововведения в PVS\-Studio пока всё ещё скрыты\. Я имею в виду поддержку в анализаторе языка Java\. Пока ещё нет публичной beta\-версии PVS\-Studio for Java, но она очень скоро появится\. Если есть желание принять участие в её тестировании, то можно написать нам в [поддержку](https://pvs-studio.ru/ru/about-feedback/) \(выбрать: Хочу анализатор для Java\)\.

## Новые диагностики для C и C\+\+

В новой версии мы немного увлеклись и добавили сразу 15 диагностик общего назначения для C и C\+\+ \(V1021\-V1035\)\. В минорном релизе ещё никогда не добавлялось сразу столько диагностик\. Подробнее с каждой из диагностик можно ознакомиться в [документации](https://pvs-studio.ru/ru/docs/warnings/v1010/)\. На мой взгляд, наиболее интересными среди новых диагностик являются:

* V1026\. The variable is incremented in the loop\. Undefined behavior will occur in case of signed integer overflow\.
* V1033\. Variable is declared as auto in C\. Its default type is int\.

Диагностика [V1026](https://pvs-studio.ru/ru/docs/warnings/v1026/) создана по мотивам [дискуссии](https://www.linux.org.ru/forum/development/14422428) на форуме linux\.org\.ru\. Программист жаловался на глюк в компиляторе GCC 8, но, как затем выяснилось, виной всему является некорректный код, приводящий к неопределённому поведению\. Давайте рассмотрим этот случай\.

**Примечание\.** В оригинальной дискуссии переменная _s_ имеет тип _const char \*s_\. При этом на целевой платформе тип _char_ является беззнаковым\. Поэтому для наглядности я сразу написал в примере, что тип указателя \- это _const unsigned char \*_\.

```cpp
int foo(const unsigned char *s)
{
  int r = 0;
  while(*s) {
    r += ((r * 20891 + *s *200) | *s ^ 4 | *s ^ 3) ^ (r >> 1);
    s++;
  }
  return r & 0x7fffffff;
}
```

Компилятор не генерирует код для оператора побитового И \(&\)\. Из\-за этого функция возвращает отрицательные значения, хотя по задумке программиста этого происходить не должно\.

Разработчик считает, что это глюк в компиляторе\. Но на самом деле неправ программист, который написал такой код\. Функция работает неправильно из\-за того, что в ней возникает неопределённое поведение\.

Компилятор видит, что в переменной _r_ считается некоторая сумма\. Переполнения переменной _r_ произойти не должно\. Иначе это неопределённое поведение, которое компилятор никак не должен рассматривать и учитывать\. Итак, компилятор считает, что раз значение в переменной _r_ после окончания цикла не может быть отрицательным, то операция _r & 0x7fffffff_ для сброса знакового бита является лишней и компилятор просто возвращает из функции значение переменной _r_\.

Диагностика V1026 как раз и предназначена для выявления подобных ошибок\. Чтобы исправить код, достаточно считать хеш, используя для этого беззнаковую переменную\. Исправленный вариант кода:

```cpp
int foo(const unsigned char *s)
{
  unsigned r = 0;
  while(*s) {
    r += ((r * 20891 + *s *200) | *s ^ 4 | *s ^ 3) ^ (r >> 1);
    s++;
  }
  return (int)(r & 0x7fffffff);
}
```

Теперь давайте рассмотрим другую диагностику [V1033](https://pvs-studio.ru/ru/docs/warnings/v1033/)\. Она интересна тем, что причиной возможных ошибок стало новое ключевое слово _auto_, появившееся в C\+\+11\. Причём виновато не само нововведение языка C\+\+11, а нюансы психологического плана :\)\. Сейчас поясню\. Взгляните на этот код:

```cpp
float d = 3.14f;
int i = 1;
auto sum = d + i;
```

Видите в нём ошибку? Подумайте\. Вот картинка, чтобы сразу не читать текст дальше\.

![0585_PVS_Studio_6_26_ru/image2.png](https://import.viva64.com/docx/blog/0585_PVS_Studio_6_26_ru/image2.png)

Догадались, что может быть не так? Если нет, вот ещё интересная информация\. Переменная _sum_ будет равна 4, а не 4\.14\. Почему?

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

Сейчас читатель скажет, что это была нечестная загадка\! Всё дело в том, что это не C\+\+, а C\.

Бывает, что в проекте одновременно используется и C\+\+, и старый добрый C\. Программист привыкает к использованию _auto_ в C\+\+ и случайно может воспользоваться этим словом в C\. Вот только там оно означает совсем другое:

_**auto**_

_Defines a local variable as having a local lifetime\. Keyword auto uses the following syntax:_

```cpp
[auto] data-definition;
```

_As the local lifetime is the default for local variables, auto keyword is extremely rarely used\._

Получается, что переменная _sum_ имеет тип _int_, и именно поэтому её значение будет равно 4\.

![0585_PVS_Studio_6_26_ru/image4.png](https://import.viva64.com/docx/blog/0585_PVS_Studio_6_26_ru/image4.png)

Хоть ошибка может показаться экзотичной, на самом деле в проекте, где используется смесь из C и C\+\+ файлов, её сделать очень легко\. Соответственно, PVS\-Studio при анализе C\-файлов предупреждает о подобных подозрительных конструкциях\.

## Другие нововведения

Добавлена возможность [проверять проекты](https://github.com/viva64/pvs-studio-waf-examples) для сборочной системы [Waf](https://ru.wikipedia.org/wiki/Waf)\.

Мы продолжаем [развивать](https://pvs-studio.ru/ru/blog/posts/cpp/0561/) анализатор в сторону встроенных систем\. В этой версии добавлена поддержка проверки проектов для GNU Arm Embedded Toolchain, Arm Embedded GCC compiler\. 

При анализе проектов для Visual C\+\+ компилятора \(cl\.exe, проекты vcxproj для Visual Studio/Standalone\), в отчёте анализатора теперь сохраняется регистр в путях до проверенных файлов\. Доработка со стороны выглядит проще, чем является на самом деле\. При препроцессировании файлов компилятор cl\.exe портит регистр в именах файлов\. И приходится в анализаторе восстанавливать их обратно\.

Добавлена возможность использовать pvsconfig файлы с CLMonitor/Standalone на Windows\.

Добавлен режим инкрементального анализа для pvs\-studio\-analzyer/CMake модуля\. PVS\-Studio CMake модуль можно теперь использовать на Windows для проектов, использующих компилятор Visual C\+\+ \(cl\.exe\)\.

Добавлена поддержка инкрементального анализа для \.NET Core/\.NET Standard Visual Studio проектов\.

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

1. PVS\-Studio\. [История версий](https://pvs-studio.ru/ru/docs/manual/0010/)\.
1. Андрей Карпов\. [Undefined behavior ближе, чем вы думаете](https://pvs-studio.ru/ru/blog/posts/cpp/0374/)\.
1. Will Dietz, Peng Li, John Regehr, and Vikram Adve\. [Understanding Integer Overflow in C/C\+\+](https://pvs-studio.ru/ru/blog/posts/cpp/0374/)\.
1. Егор Бредихин\. [Разработка нового статического анализатора: PVS\-Studio Java](https://pvs-studio.ru/ru/blog/posts/java/0572/)\.