Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V1007. Value from the uninitialized...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V1007. Value from the uninitialized optional is used. It may be an error.

25 Дек 2017

Анализатор обнаружил обращение к значению объекта класса optional, который ранее не был проинициализирован, т.е. не хранит никакого значения. Формально это приводит к неопределенному поведению, а также служит источником других ошибок.

Рассмотрим пример некорректного кода:

std::optional<Value> opt;
if (cond)
{
  opt->max = 10;
  opt->min = 20;
}

if (opt)
{
  ....
}

В данном примере opt так и не был проинициализирован, что в свою очередь приводит к тому, что код под условием if (opt) никогда не выполняется.

Исправленный вариант:

std::optional<Value> opt;
if (cond)
{
  opt = Value(10, 20);
}

if (opt)
{
    ....
}

Также, анализатор умеет обнаруживать обращение к значению потенциально неинициализированного объекта типа optional. Например:

boost::optional<int> opt = boost::none;
opt = interpret(tr);
    
if (cond)
  opt = {};
    
process(*opt);

Исправленный вариант:

boost::optional<int> opt = boost::none;
opt = interpret(tr);
    
if (!cond)
  process(*opt);

Примечание. Диагностическое правило имеет дополнительные настройки. Для включения какой-либо настройки необходимо добавить соответствующий комментарий в файл с исходным кодом или в файл конфигурации диагностических правил (.pvsconfig).

Расширенное сообщение. Данная настройка позволяет выдавать расширенное сообщение: в нём будет содержаться список функций, при помощи которых следует проверить объект опционального типа перед получением значения:

//+V1007 PRINT_CHECKERS

Чувствительный режим. При включении данной настройки анализатор будет выдавать предупреждение V1007 в любом месте, где используется непроверенный объект опционального типа:

//+V1007 PEDANTIC_MODE

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки использования неинициализированных переменных.

Данная диагностика классифицируется как:

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