Для получения триального ключа
заполните форму ниже
Team License (базовая версия)
Enterprise License (расширенная версия)
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
GBP
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

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

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

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

** На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Ваше сообщение отправлено.

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


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
Релиз PVS-Studio 6.26

Релиз PVS-Studio 6.26

18 Окт 2018

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

0585_PVS_Studio_6_26_ru/image1.png

Скоро Java

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

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

В новой версии мы немного увлеклись и добавили сразу 15 диагностик общего назначения для C и C++ (V1021-V1035). В минорном релизе ещё никогда не добавлялось сразу столько диагностик. Подробнее с каждой из диагностик можно ознакомиться в документации. На мой взгляд, наиболее интересными среди новых диагностик являются:

  • 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 создана по мотивам дискуссии на форуме linux.org.ru. Программист жаловался на глюк в компиляторе GCC 8, но, как затем выяснилось, виной всему является некорректный код, приводящий к неопределённому поведению. Давайте рассмотрим этот случай.

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

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 как раз и предназначена для выявления подобных ошибок. Чтобы исправить код, достаточно считать хеш, используя для этого беззнаковую переменную. Исправленный вариант кода:

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. Она интересна тем, что причиной возможных ошибок стало новое ключевое слово auto, появившееся в C++11. Причём виновато не само нововведение языка C++11, а нюансы психологического плана :). Сейчас поясню. Взгляните на этот код:

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

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

0585_PVS_Studio_6_26_ru/image2.png

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

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:

[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

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

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

Добавлена возможность проверять проекты для сборочной системы Waf.

Мы продолжаем развивать анализатор в сторону встроенных систем. В этой версии добавлена поддержка проверки проектов для 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 проектов.

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

Популярные статьи по теме
Эффект последней строки

Дата: 31 Май 2014

Автор: Андрей Карпов

Я изучил множество ошибок, возникающих в результате копирования кода. И утверждаю, что чаще всего ошибки допускают в последнем фрагменте однотипного кода. Ранее я не встречал в книгах описания этого …
PVS-Studio ROI

Дата: 30 Янв 2019

Автор: Андрей Карпов

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

Дата: 22 Дек 2018

Автор: Андрей Карпов

В канун празднования нового 2019 года команда PVS-Studio решила сделать приятный подарок всем контрибьюторам open-source проектов, хостящихся на GitHub, GitLab или Bitbucket. Им предоставляется возмо…
Любите статический анализ кода!

Дата: 16 Окт 2017

Автор: Андрей Карпов

Я в шоке от возможностей статического анализа кода, хотя сам участвую в разработке инструмента PVS-Studio. На днях я был искренне удивлён тому, что анализатор оказался умнее и внимательнее меня.
Статический анализ как часть процесса разработки Unreal Engine

Дата: 27 Июн 2017

Автор: Андрей Карпов

Проект Unreal Engine развивается - добавляется новый код и изменятся уже написанный. Неизбежное следствие развития проекта - появление в коде новых ошибок, которые желательно выявлять как можно раньш…
Характеристики анализатора PVS-Studio на примере EFL Core Libraries, 10-15% ложных срабатываний

Дата: 31 Июл 2017

Автор: Андрей Карпов

После большой статьи про проверку операционной системы Tizen мне было задано много вопросов о проценте ложных срабатываний и о плотности ошибок (сколько ошибок PVS-Studio выявляет на 1000 строк кода)…
PVS-Studio для Java

Дата: 17 Янв 2019

Автор: Андрей Карпов

В седьмой версии статического анализатора PVS-Studio мы добавили поддержку языка Java. Пришло время немного рассказать, как мы начинали делать поддержку языка Java, что у нас получилось и какие дальн…
Зло живёт в функциях сравнения

Дата: 19 Май 2017

Автор: Андрей Карпов

Возможно, читатели помнят мою статью под названием "Эффект последней строки". В ней идёт речь о замеченной мной закономерности: ошибка чаще всего допускается в последней строке однотипных блоков текс…
Технологии, используемые в анализаторе кода PVS-Studio для поиска ошибок и потенциальных уязвимостей

Дата: 21 Ноя 2018

Автор: Андрей Карпов

Краткое описание технологий, используемых в инструменте PVS-Studio, которые позволяют эффективно обнаруживать большое количество паттернов ошибок и потенциальных уязвимостей. Статья описывает реализа…
Как и почему статические анализаторы борются с ложными срабатываниями

Дата: 20 Мар 2017

Автор: Андрей Карпов

В своей предыдущей статье я писал, что мне не нравится подход, при котором статические анализаторы кода оцениваются с помощью синтетических тестов. В статье приводился пример, воспринимаемый анализат…

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

Следующие комментарии

На сайте установлена reCAPTCHA и применяются
Политика конфиденциальности и Условия использования Google.
Этот сайт использует куки и другие технологии, чтобы предоставить вам более персонализированный опыт. Продолжая просмотр страниц нашего веб-сайта, вы принимаете условия использования этих файлов. Если вы не хотите, чтобы ваши данные обрабатывались, пожалуйста, покиньте данный сайт. Подробнее →
Принять