[libvirt] [PATCH 1/2] util: add virStringParseYesNo()
Erik Skultety
eskultet at redhat.com
Tue Mar 12 07:54:12 UTC 2019
On Tue, Mar 12, 2019 at 08:38:18AM +0100, Peter Krempa wrote:
> On Tue, Mar 12, 2019 at 00:38:05 +0900, Shotaro Gotanda wrote:
> > This function parse and convert string "yes|no" into bool true|false.
> >
> > Signed-off-by: Shotaro Gotanda <g.sho1500 at gmail.com>
> > ---
> > src/util/virstring.c | 32 ++++++++++++++++++++++++++++++++
> > src/util/virstring.h | 3 +++
> > 2 files changed, 35 insertions(+)
> >
> > diff --git a/src/util/virstring.c b/src/util/virstring.c
> > index 33f8191f45..70018459de 100644
> > --- a/src/util/virstring.c
> > +++ b/src/util/virstring.c
> > @@ -1548,3 +1548,35 @@ virStringParsePort(const char *str,
> >
> > return 0;
> > }
> > +
> > +
> > +/**
> > + * virStringParseYesNo:
> > + * @str: "yes|no" to parse
> > + * @port: pointer to parse and convert "yes|no" into
> > + *
> > + * Parses a string "yes|no" and convert it into true|false. Returns
> > + * 0 on success and -1 on error.
> > + */
> > +int virStringParseYesNo(const char *str,
> > + bool *result)
> > +{
> > + bool r = false;
>
> > +
> > + if (!str)
>
> Here you don't report an error ...
>
> > + return -1;
> > +
> > + if (STREQ(str, "yes")) {
> > + r = true;
> > + } else if (STREQ(str, "no")) {
> > + r = false;
>
> This variable is not very useful. If the string matches you can
> unconditionally overwrite *result.
>
>
> > + } else {
> > + virReportError(VIR_ERR_INTERNAL_ERROR,
> > + _("Invalid value, '%s' must be either 'yes' or 'no'"), str);
>
> ... but here you do. We try to do consistent error reporting since then it's
> hard to figure out whether to report an error or not.
>
> > + return -1;
> > + }
> > +
> > + *result = r;
> > +
> > + return 0;
> > +}
> > diff --git a/src/util/virstring.h b/src/util/virstring.h
> > index 1e36ac459c..b921d5407b 100644
> > --- a/src/util/virstring.h
> > +++ b/src/util/virstring.h
> > @@ -316,6 +316,9 @@ int virStringParsePort(const char *str,
> > unsigned int *port)
> > ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
> >
> > +int virStringParseYesNo(const char *str,
> > + bool *result);
>
> This should have a ATTRIBUTE_NONNULL(2) since 'result' is dereferenced
ATTRIBUTE_NONNULL expands only if we're running under static analysis, IIRC
there was an issue that if we enabled it unconditionally, GCC then optimized
if (!var)
statements;
away...Instead, I believe we want to enforce 'if (!var)' checks.
Erik
More information about the libvir-list
mailing list