libcamera: yaml_parser: Return nullopt on error from YamlObject::get()

The YamlParser::get<>() function returns an std::optional<> to indicate
when YAML parsing failed.

The current implementation returns a default constructed std::optional
in case of errors with

        return {};

This has been reported as generating compiler warnings with a gcc 9.3.0
arm64 cross-compiler:

../src/libcamera/yaml_parser.cpp:184:11: error: ‘<anonymous>’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
  184 |   return {};
      |           ^

Replace this with an explicit

	return std::nullopt;

which fixes the warnings and conveys the purpose more explicitly.

Reported-by: Christian Rauch <Rauch.Christian@gmx.de>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Laurent Pinchart 2022-08-05 19:02:55 +03:00
parent 1590e9b2b8
commit 1a6c7477fd

View file

@ -121,24 +121,24 @@ template<>
std::optional<bool> YamlObject::get() const std::optional<bool> YamlObject::get() const
{ {
if (type_ != Type::Value) if (type_ != Type::Value)
return {}; return std::nullopt;
if (value_ == "true") if (value_ == "true")
return true; return true;
else if (value_ == "false") else if (value_ == "false")
return false; return false;
return {}; return std::nullopt;
} }
template<> template<>
std::optional<int16_t> YamlObject::get() const std::optional<int16_t> YamlObject::get() const
{ {
if (type_ != Type::Value) if (type_ != Type::Value)
return {}; return std::nullopt;
if (value_ == "") if (value_ == "")
return {}; return std::nullopt;
char *end; char *end;
@ -148,7 +148,7 @@ std::optional<int16_t> YamlObject::get() const
if ('\0' != *end || errno == ERANGE || if ('\0' != *end || errno == ERANGE ||
value < std::numeric_limits<int16_t>::min() || value < std::numeric_limits<int16_t>::min() ||
value > std::numeric_limits<int16_t>::max()) value > std::numeric_limits<int16_t>::max())
return {}; return std::nullopt;
return value; return value;
} }
@ -157,10 +157,10 @@ template<>
std::optional<uint16_t> YamlObject::get() const std::optional<uint16_t> YamlObject::get() const
{ {
if (type_ != Type::Value) if (type_ != Type::Value)
return {}; return std::nullopt;
if (value_ == "") if (value_ == "")
return {}; return std::nullopt;
/* /*
* libyaml parses all scalar values as strings. When a string has * libyaml parses all scalar values as strings. When a string has
@ -171,7 +171,7 @@ std::optional<uint16_t> YamlObject::get() const
*/ */
std::size_t found = value_.find_first_not_of(" \t"); std::size_t found = value_.find_first_not_of(" \t");
if (found != std::string::npos && value_[found] == '-') if (found != std::string::npos && value_[found] == '-')
return {}; return std::nullopt;
char *end; char *end;
@ -181,7 +181,7 @@ std::optional<uint16_t> YamlObject::get() const
if ('\0' != *end || errno == ERANGE || if ('\0' != *end || errno == ERANGE ||
value < std::numeric_limits<uint16_t>::min() || value < std::numeric_limits<uint16_t>::min() ||
value > std::numeric_limits<uint16_t>::max()) value > std::numeric_limits<uint16_t>::max())
return {}; return std::nullopt;
return value; return value;
} }
@ -190,10 +190,10 @@ template<>
std::optional<int32_t> YamlObject::get() const std::optional<int32_t> YamlObject::get() const
{ {
if (type_ != Type::Value) if (type_ != Type::Value)
return {}; return std::nullopt;
if (value_ == "") if (value_ == "")
return {}; return std::nullopt;
char *end; char *end;
@ -203,7 +203,7 @@ std::optional<int32_t> YamlObject::get() const
if ('\0' != *end || errno == ERANGE || if ('\0' != *end || errno == ERANGE ||
value < std::numeric_limits<int32_t>::min() || value < std::numeric_limits<int32_t>::min() ||
value > std::numeric_limits<int32_t>::max()) value > std::numeric_limits<int32_t>::max())
return {}; return std::nullopt;
return value; return value;
} }
@ -212,10 +212,10 @@ template<>
std::optional<uint32_t> YamlObject::get() const std::optional<uint32_t> YamlObject::get() const
{ {
if (type_ != Type::Value) if (type_ != Type::Value)
return {}; return std::nullopt;
if (value_ == "") if (value_ == "")
return {}; return std::nullopt;
/* /*
* libyaml parses all scalar values as strings. When a string has * libyaml parses all scalar values as strings. When a string has
@ -226,7 +226,7 @@ std::optional<uint32_t> YamlObject::get() const
*/ */
std::size_t found = value_.find_first_not_of(" \t"); std::size_t found = value_.find_first_not_of(" \t");
if (found != std::string::npos && value_[found] == '-') if (found != std::string::npos && value_[found] == '-')
return {}; return std::nullopt;
char *end; char *end;
@ -236,7 +236,7 @@ std::optional<uint32_t> YamlObject::get() const
if ('\0' != *end || errno == ERANGE || if ('\0' != *end || errno == ERANGE ||
value < std::numeric_limits<uint32_t>::min() || value < std::numeric_limits<uint32_t>::min() ||
value > std::numeric_limits<uint32_t>::max()) value > std::numeric_limits<uint32_t>::max())
return {}; return std::nullopt;
return value; return value;
} }
@ -245,10 +245,10 @@ template<>
std::optional<double> YamlObject::get() const std::optional<double> YamlObject::get() const
{ {
if (type_ != Type::Value) if (type_ != Type::Value)
return {}; return std::nullopt;
if (value_ == "") if (value_ == "")
return {}; return std::nullopt;
char *end; char *end;
@ -256,7 +256,7 @@ std::optional<double> YamlObject::get() const
double value = std::strtod(value_.c_str(), &end); double value = std::strtod(value_.c_str(), &end);
if ('\0' != *end || errno == ERANGE) if ('\0' != *end || errno == ERANGE)
return {}; return std::nullopt;
return value; return value;
} }
@ -265,7 +265,7 @@ template<>
std::optional<std::string> YamlObject::get() const std::optional<std::string> YamlObject::get() const
{ {
if (type_ != Type::Value) if (type_ != Type::Value)
return {}; return std::nullopt;
return value_; return value_;
} }
@ -274,18 +274,18 @@ template<>
std::optional<Size> YamlObject::get() const std::optional<Size> YamlObject::get() const
{ {
if (type_ != Type::List) if (type_ != Type::List)
return {}; return std::nullopt;
if (list_.size() != 2) if (list_.size() != 2)
return {}; return std::nullopt;
auto width = list_[0].value->get<uint32_t>(); auto width = list_[0].value->get<uint32_t>();
if (!width) if (!width)
return {}; return std::nullopt;
auto height = list_[1].value->get<uint32_t>(); auto height = list_[1].value->get<uint32_t>();
if (!height) if (!height)
return {}; return std::nullopt;
return Size(*width, *height); return Size(*width, *height);
} }