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

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

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

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

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

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

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


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

>
>
Заметка о новых настройках диагностик

Заметка о новых настройках диагностик

15 Дек 2014

Несмотря на то, что наш анализатор позиционирует себя как одно из наиболее простых средств в установке и повседневном использовании (всё работает "из коробки" и не требует никакой особенной настройки), некоторым пользователям иногда недостаёт гибкости отдельных диагностик. К сожалению, простота использования и гибкость настроек - требования если уж не противоположные по своему духу, то иногда несколько конфликтующие друг с другом. В данной заметке речь пойдёт о дополнительном механизме настройки некоторых диагностик, который может пригодиться некоторым из наших уважаемых пользователей.

Настройки

Ранее уже можно было управлять некоторыми диагностиками с помощью специальных комментариев. Про них можно узнать из описания диагностик в документации. Например, см. комментарий //-V610_LEFT_SIGN_OFF для диагностики V610.

Но все эти настройки касались подавления ложных срабатываний. Теперь же появились настройки, наоборот позволяющие пользователям подсказать анализатору, где он ещё может найти ту или иную ошибку.

Синтаксис новых настроек

Общий синтаксис нового механизма следующий: для того, чтобы активировать некоторое дополнительное правило, требуется использовать комментарий //+V. Мы выбрали такую форму из-за того, что она похожа на уже широко использующейся комментарий для подавления ложных срабатываний: //-V. Формат добавления нового правила для некоторой диагностики довольно прост:

//+V<Номер диагностики>, <Ключ>:<Значение>, ... , <Ключ>:<Значение>

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

Настройки диагностик могут быть записаны:

  • Во включаемом во весь проект файле (stdafx.h),
  • Если они касаются некоторой функции или метода класса - рядом с их прототипами или реализацией в заголовочном файле,
  • Если требуется, чтобы настройка действовала на один .cpp-файл - в любом месте этого .cpp-файла.

Ограничение - правило должно быть записано в одну строчку.

Примеры:

//+V128,function:N128_write_it,non_memsize:2,class:N128_T

//+V576,function:foo,format_arg:1,ellipsis_arg:3,namespace:X,class:Y

На момент написания статьи новые настройки реализованы для двух диагностик: V128 и V576. В дальнейшем, могут появиться новые настройки для других диагностик.

Настройка диагностики V128

Диагностика V128 предназначена для поиска в коде мест, где переменная memsize-типа записывается в файл или считывается из файла. Полное описание диагностики можно прочесть по ссылке, а здесь будет рассказано про её новую настройку. Один из пользователей попросил расширить диагностику V128 путём добавления возможности выдачи предупреждения на пользовательские функции.

Формат расширения следующий: возле прототипа функции (или возле её реализации, или в общем заголовочном файле) пишется комментарий специального вида. Начнём с примера использования:

//+V128, function:write, non_memsize:2
void write(string name, char);
void write(string name, int32);
void write(string name, int64);
foo()
{
  write("zz", array.size()); // warning V128
}

Формат:

  • Ключ function задаёт имя функции, на которую будет обращать внимание анализатор. Это обязательный ключ - без его указания расширение, разумеется, работать не будет.
  • Ключ class - необязательный ключ, который позволяет указать класс, к которому относится функция (то есть в этом случае - метод класса). Без указания этого ключа анализатор будет обращать внимание на все функции с данным именем, с указанием - лишь на методы указанного класса.
  • Ключ namespace - необязательный ключ, который позволяет указать пространство имён, к которому относится функция. Без указания ключа, опять же, анализатор будет обращать внимание на все функции, с указанием - лишь на функции, принадлежащие к заданному параметром пространству имён. Ключ может быть задан совместно с ключом class - тогда анализатор будет обращать внимание лишь на методы некоторого класса из некоторого пространства имён.
  • Ключ non_memsize позволяет задавать номер аргумента, в который нельзя погружать аргумент меняющегося в зависимости от архитектуры размера. Номера считаются с единицы. Также имеется техническое ограничение - этот номер не должен превышать число 14. Ключей non_memsize может быть задано несколько, если требуется обращать внимание сразу на несколько аргументов.

Уровень диагностики в случае срабатывания на пользовательской функции - всегда первый.

Напоследок дадим наиболее полный пример использования:

//Предупреждать, когда в метод C класса B
//из пространства имён A во второй или третий
//аргумент была помещена переменная типа memsize
//+V128,namespace:A,class:B,function:C,non_memsize:3,non_memsize:2

Настройка диагностики V576

Диагностика V576 предназначена для поиска несоответствия аргументов функций наподобие printf() их форматной строке. Потенциальный пользователей попросил расширить эту диагностику на случай собственных функций. Нужно, чтобы анализатор выдавал предупреждения на случай, если в некотором месте в функцию помещён аргумент, несоответствующий форматной строке. Подразумевается, что принцип форматирования строк совпадает с функцией printf().

Опять же, сказано - сделано.

Формат расширения аналогичен формату настройки диагностики V128. Возле прототипа функции (или возле её реализации, или в общем заголовочном файле) пишется комментарий специального вида. Начнём, опять же, с примера использования:

//+V576, function:Mylog, format_arg:1, ellipsis_arg:2
Mylog("%f", time(NULL)); // warning V576

Формат:

  • Ключи function, class и namespace задают имя функции, имя класса (если нужно анализировать вызов только этого метода класса) и имя пространства имён (если требуется анализировать функцию или метод класса только этого пространства имён).
  • Ключ format_arg задаёт номер аргумента функции, в котором будет находиться форматная строка. Это обязательный аргумент. Номера также считаются с единицы и также не должны превышать число 14.
  • Ключ ellipsis_arg задаёт номер аргумента функции с эллипсисом (то есть многоточием). К этому номеру предъявляются те же ограничения, что и к номеру форматной строки. Более того, номер аргумента с эллипсисом должен быть больше номера аргумента с форматной строкой (всё-таки эллипсис - исключительно последний аргумент). Это также обязательный аргумент.

Напоследок, дадим наиболее полный пример использования:

//Предупреждать, когда в методе C класса B
//из пространства имён A аргументы, начиная с
//третьего, не совпадают с типом, заданным в
//форматной строке второго аргумента. 
//+V576,namespace:A,class:B,function:C,format_arg:2,ellipsis_arg:3

Заключение

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

Популярные статьи по теме
Обрабатывать ли в PVS-Studio вывод других инструментов?

Дата: 26 Май 2022

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

Анализатор PVS-Studio умеет "схлопывать" повторяющиеся предупреждения. Предоставляет возможность задать baseline, что позволяет легко внедрять статический анализ в legacy-проекты. Стоит ли предостави…
15000 ошибок в открытых проектах

Дата: 24 Май 2022

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

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

Дата: 04 Май 2022

Автор: Сергей Хренов

Приветствую всех программистов, а также сочувствующих. Кто из нас хотя бы раз в жизни не оставлял комментарии в коде? Был ли это ваш код, а может, чужой? Что за комментарии вы написали: полезные или …
Visual Studio 2022 стильно и свежо. История о её поддержке в PVS-Studio

Дата: 15 Фев 2022

Автор: Николай Миронов

Кажется, анонс Visual Studio 2022 был только недавно, и вот она уже вышла. Это означало ровно одно – поддержать данную IDE нужно в ближайшем релизе PVS-Studio. О том, с какими сложностями пришлось ст…
Лучшие срабатывания статического анализатора

Дата: 29 Окт 2021

Автор: Максим Звягинцев

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

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

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