Анализатор обнаружил обращение к значению объекта класса '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. |