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

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

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

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

if (opt)
{
  ....
}
```

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

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

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

if (opt)
{
    ....
}
```

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

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

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

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

**Примечание**\. Диагностическое правило имеет дополнительные настройки\. Для включения какой\-либо настройки необходимо [добавить](https://pvs-studio.ru/ru/docs/manual/0040/) соответствующий комментарий в файл с исходным кодом или в файл конфигурации диагностических правил \(\.pvsconfig\)\.

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

```cpp
//+V1007 PRINT_CHECKERS
```

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

```cpp
//+V1007 PEDANTIC_MODE
```