diff mbox

[13/22] add visitor for parsing hz[KMG] input string

Message ID 504A7130.4050906@CloudSwitch.Com
State New
Headers show

Commit Message

Don Slutz Sept. 7, 2012, 10:12 p.m. UTC
On 09/07/12 16:55, Igor Mammedov wrote:
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> Acked-by: Andreas Färber <afaerber@suse.de>
> --
> v2:
>    * replaced _hz suffix for frequency visitor by _freq suffix
>      suggested-by: Andreas Färber
>    * fixed typo & extra space spotted-by: Andreas Färber
> ---
>   qapi/qapi-visit-core.c      | 11 +++++++++++
>   qapi/qapi-visit-core.h      |  2 ++
>   qapi/string-input-visitor.c | 22 ++++++++++++++++++++++
>   3 files changed, 35 insertions(+)
>
> diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
> index 7a82b63..5c8705e 100644
> --- a/qapi/qapi-visit-core.c
> +++ b/qapi/qapi-visit-core.c
> @@ -311,3 +311,14 @@ void input_type_enum(Visitor *v, int *obj, const char *strings[],
>       g_free(enum_str);
>       *obj = value;
>   }
> +
> +void visit_type_freq(Visitor *v, int64_t *obj, const char *name, Error **errp)
> +{
> +    if (!error_is_set(errp)) {
> +        if (v->type_freq) {
> +            v->type_freq(v, obj, name, errp);
> +        } else {
> +            v->type_int(v, obj, name, errp);
> +        }
> +    }
> +}
> diff --git a/qapi/qapi-visit-core.h b/qapi/qapi-visit-core.h
> index 60aceda..e5e7dd7 100644
> --- a/qapi/qapi-visit-core.h
> +++ b/qapi/qapi-visit-core.h
> @@ -62,6 +62,7 @@ struct Visitor
>       void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error **errp);
>       /* visit_type_size() falls back to (*type_uint64)() if type_size is unset */
>       void (*type_size)(Visitor *v, uint64_t *obj, const char *name, Error **errp);
> +    void (*type_freq)(Visitor *v, int64_t *obj, const char *name, Error **errp);
>   };
>   
>   void visit_start_handle(Visitor *v, void **obj, const char *kind,
> @@ -91,5 +92,6 @@ void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp);
>   void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **errp);
>   void visit_type_str(Visitor *v, char **obj, const char *name, Error **errp);
>   void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp);
> +void visit_type_freq(Visitor *v, int64_t *obj, const char *name, Error **errp);
>   
>   #endif
> diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
> index 497eb9a..47d2a84 100644
> --- a/qapi/string-input-visitor.c
> +++ b/qapi/string-input-visitor.c
> @@ -110,6 +110,27 @@ static void parse_start_optional(Visitor *v, bool *present,
>       *present = true;
>   }
>   
> +static void parse_type_freq(Visitor *v, int64_t *obj, const char *name,
> +                            Error **errp)
> +{
> +    StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v);
> +    char *endp = (char *) siv->string;
> +    long long val;
I get:

cc1: warnings being treated as errors
qapi/string-input-visitor.c: In function 'parse_type_freq':
qapi/string-input-visitor.c:118: error: 'val' may be used uninitialized 
in this function
make: *** [qapi/string-input-visitor.o] Error 1
make: *** Waiting for unfinished jobs....

Which the change:


      if (siv->string) {

Fixes it for me.

> +
> +    errno = 0;
> +    if (siv->string) {
> +        val = strtosz_suffix_unit(siv->string, &endp,
> +                             STRTOSZ_DEFSUFFIX_B, 1000);
> +    }
> +    if (!siv->string || val == -1 || *endp) {
> +        error_set(errp, QERR_INVALID_PARAMETER_VALUE, name,
> +              "a value representable as a non-negative int64");
> +        return;
> +    }
> +
> +    *obj = val;
> +}
> +
>   Visitor *string_input_get_visitor(StringInputVisitor *v)
>   {
>       return &v->visitor;
> @@ -132,6 +153,7 @@ StringInputVisitor *string_input_visitor_new(const char *str)
>       v->visitor.type_str = parse_type_str;
>       v->visitor.type_number = parse_type_number;
>       v->visitor.start_optional = parse_start_optional;
> +    v->visitor.type_freq = parse_type_freq;
>   
>       v->string = str;
>       return v;
   -Don Slutz

Comments

Igor Mammedov Sept. 7, 2012, 10:47 p.m. UTC | #1
On Fri, 7 Sep 2012 18:12:00 -0400
Don Slutz <Don@cloudswitch.com> wrote:

> On 09/07/12 16:55, Igor Mammedov wrote:
> > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > Acked-by: Andreas Färber <afaerber@suse.de>
> > --
> > v2:
> >    * replaced _hz suffix for frequency visitor by _freq suffix
> >      suggested-by: Andreas Färber
> >    * fixed typo & extra space spotted-by: Andreas Färber
> > ---
> >   qapi/qapi-visit-core.c      | 11 +++++++++++
> >   qapi/qapi-visit-core.h      |  2 ++
> >   qapi/string-input-visitor.c | 22 ++++++++++++++++++++++
> >   3 files changed, 35 insertions(+)
> >
> > diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
> > index 7a82b63..5c8705e 100644
> > --- a/qapi/qapi-visit-core.c
> > +++ b/qapi/qapi-visit-core.c
> > @@ -311,3 +311,14 @@ void input_type_enum(Visitor *v, int *obj, const char *strings[],
> >       g_free(enum_str);
> >       *obj = value;
> >   }
> > +
> > +void visit_type_freq(Visitor *v, int64_t *obj, const char *name, Error **errp)
> > +{
> > +    if (!error_is_set(errp)) {
> > +        if (v->type_freq) {
> > +            v->type_freq(v, obj, name, errp);
> > +        } else {
> > +            v->type_int(v, obj, name, errp);
> > +        }
> > +    }
> > +}
> > diff --git a/qapi/qapi-visit-core.h b/qapi/qapi-visit-core.h
> > index 60aceda..e5e7dd7 100644
> > --- a/qapi/qapi-visit-core.h
> > +++ b/qapi/qapi-visit-core.h
> > @@ -62,6 +62,7 @@ struct Visitor
> >       void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error **errp);
> >       /* visit_type_size() falls back to (*type_uint64)() if type_size is unset */
> >       void (*type_size)(Visitor *v, uint64_t *obj, const char *name, Error **errp);
> > +    void (*type_freq)(Visitor *v, int64_t *obj, const char *name, Error **errp);
> >   };
> >   
> >   void visit_start_handle(Visitor *v, void **obj, const char *kind,
> > @@ -91,5 +92,6 @@ void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp);
> >   void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **errp);
> >   void visit_type_str(Visitor *v, char **obj, const char *name, Error **errp);
> >   void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp);
> > +void visit_type_freq(Visitor *v, int64_t *obj, const char *name, Error **errp);
> >   
> >   #endif
> > diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
> > index 497eb9a..47d2a84 100644
> > --- a/qapi/string-input-visitor.c
> > +++ b/qapi/string-input-visitor.c
> > @@ -110,6 +110,27 @@ static void parse_start_optional(Visitor *v, bool *present,
> >       *present = true;
> >   }
> >   
> > +static void parse_type_freq(Visitor *v, int64_t *obj, const char *name,
> > +                            Error **errp)
> > +{
> > +    StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v);
> > +    char *endp = (char *) siv->string;
> > +    long long val;
> I get:
> 
> cc1: warnings being treated as errors
> qapi/string-input-visitor.c: In function 'parse_type_freq':
> qapi/string-input-visitor.c:118: error: 'val' may be used uninitialized 
> in this function
> make: *** [qapi/string-input-visitor.o] Error 1
> make: *** Waiting for unfinished jobs....

FC17 with default configure settings doesn't complain.
And I really do not see how it could be.

> Which the change:
> 
> 
> diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
> index 47d2a84..74fe395 100644
> --- a/qapi/string-input-visitor.c
> +++ b/qapi/string-input-visitor.c
> @@ -115,7 +115,7 @@ static void parse_type_freq(Visitor *v, int64_t 
> *obj, const char *name,
>   {
>       StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v);
>       char *endp = (char *) siv->string;
> -    long long val;
> +    long long val = 0;
>       errno = 0;
>       if (siv->string) {
> 
> Fixes it for me.
> 
> > +
> > +    errno = 0;
> > +    if (siv->string) {
> > +        val = strtosz_suffix_unit(siv->string, &endp,
> > +                             STRTOSZ_DEFSUFFIX_B, 1000);
> > +    }
> > +    if (!siv->string || val == -1 || *endp) {
> > +        error_set(errp, QERR_INVALID_PARAMETER_VALUE, name,
> > +              "a value representable as a non-negative int64");
> > +        return;
> > +    }
> > +
> > +    *obj = val;
> > +}
> > +
> >   Visitor *string_input_get_visitor(StringInputVisitor *v)
> >   {
> >       return &v->visitor;
> > @@ -132,6 +153,7 @@ StringInputVisitor *string_input_visitor_new(const char *str)
> >       v->visitor.type_str = parse_type_str;
> >       v->visitor.type_number = parse_type_number;
> >       v->visitor.start_optional = parse_start_optional;
> > +    v->visitor.type_freq = parse_type_freq;
> >   
> >       v->string = str;
> >       return v;
>    -Don Slutz
Don Slutz Sept. 7, 2012, 11:05 p.m. UTC | #2
On 09/07/12 18:47, Igor Mammedov wrote:
> On Fri, 7 Sep 2012 18:12:00 -0400
> Don Slutz <Don@cloudswitch.com> wrote:
>
>> On 09/07/12 16:55, Igor Mammedov wrote:
>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>> Acked-by: Andreas Färber <afaerber@suse.de>
>>> --
>>> v2:
>>>     * replaced _hz suffix for frequency visitor by _freq suffix
>>>       suggested-by: Andreas Färber
>>>     * fixed typo & extra space spotted-by: Andreas Färber
>>> ---
>>>    qapi/qapi-visit-core.c      | 11 +++++++++++
>>>    qapi/qapi-visit-core.h      |  2 ++
>>>    qapi/string-input-visitor.c | 22 ++++++++++++++++++++++
>>>    3 files changed, 35 insertions(+)
>>>
>>> diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
>>> index 7a82b63..5c8705e 100644
>>> --- a/qapi/qapi-visit-core.c
>>> +++ b/qapi/qapi-visit-core.c
>>> @@ -311,3 +311,14 @@ void input_type_enum(Visitor *v, int *obj, const char *strings[],
>>>        g_free(enum_str);
>>>        *obj = value;
>>>    }
>>> +
>>> +void visit_type_freq(Visitor *v, int64_t *obj, const char *name, Error **errp)
>>> +{
>>> +    if (!error_is_set(errp)) {
>>> +        if (v->type_freq) {
>>> +            v->type_freq(v, obj, name, errp);
>>> +        } else {
>>> +            v->type_int(v, obj, name, errp);
>>> +        }
>>> +    }
>>> +}
>>> diff --git a/qapi/qapi-visit-core.h b/qapi/qapi-visit-core.h
>>> index 60aceda..e5e7dd7 100644
>>> --- a/qapi/qapi-visit-core.h
>>> +++ b/qapi/qapi-visit-core.h
>>> @@ -62,6 +62,7 @@ struct Visitor
>>>        void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error **errp);
>>>        /* visit_type_size() falls back to (*type_uint64)() if type_size is unset */
>>>        void (*type_size)(Visitor *v, uint64_t *obj, const char *name, Error **errp);
>>> +    void (*type_freq)(Visitor *v, int64_t *obj, const char *name, Error **errp);
>>>    };
>>>    
>>>    void visit_start_handle(Visitor *v, void **obj, const char *kind,
>>> @@ -91,5 +92,6 @@ void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp);
>>>    void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **errp);
>>>    void visit_type_str(Visitor *v, char **obj, const char *name, Error **errp);
>>>    void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp);
>>> +void visit_type_freq(Visitor *v, int64_t *obj, const char *name, Error **errp);
>>>    
>>>    #endif
>>> diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
>>> index 497eb9a..47d2a84 100644
>>> --- a/qapi/string-input-visitor.c
>>> +++ b/qapi/string-input-visitor.c
>>> @@ -110,6 +110,27 @@ static void parse_start_optional(Visitor *v, bool *present,
>>>        *present = true;
>>>    }
>>>    
>>> +static void parse_type_freq(Visitor *v, int64_t *obj, const char *name,
>>> +                            Error **errp)
>>> +{
>>> +    StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v);
>>> +    char *endp = (char *) siv->string;
>>> +    long long val;
>> I get:
>>
>> cc1: warnings being treated as errors
>> qapi/string-input-visitor.c: In function 'parse_type_freq':
>> qapi/string-input-visitor.c:118: error: 'val' may be used uninitialized
>> in this function
>> make: *** [qapi/string-input-visitor.o] Error 1
>> make: *** Waiting for unfinished jobs....
> FC17 with default configure settings doesn't complain.
> And I really do not see how it could be.
>
>> Which the change:
>>
>>
>> diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
>> index 47d2a84..74fe395 100644
>> --- a/qapi/string-input-visitor.c
>> +++ b/qapi/string-input-visitor.c
>> @@ -115,7 +115,7 @@ static void parse_type_freq(Visitor *v, int64_t
>> *obj, const char *name,
>>    {
>>        StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v);
>>        char *endp = (char *) siv->string;
>> -    long long val;
>> +    long long val = 0;
>>        errno = 0;
>>        if (siv->string) {
>>
>> Fixes it for me.
>>
>>> +
>>> +    errno = 0;
>>> +    if (siv->string) {
>>> +        val = strtosz_suffix_unit(siv->string, &endp,
>>> +                             STRTOSZ_DEFSUFFIX_B, 1000);
>>> +    }
>>> +    if (!siv->string || val == -1 || *endp) {
I am using CentOS 6.3 so a different compiler.  This is the line that 
has the issue.

If !siv->string is true the 1st if does not set val. val is then checked 
for -1.

>>> +        error_set(errp, QERR_INVALID_PARAMETER_VALUE, name,
>>> +              "a value representable as a non-negative int64");
>>> +        return;
>>> +    }
>>> +
>>> +    *obj = val;
>>> +}
>>> +
>>>    Visitor *string_input_get_visitor(StringInputVisitor *v)
>>>    {
>>>        return &v->visitor;
>>> @@ -132,6 +153,7 @@ StringInputVisitor *string_input_visitor_new(const char *str)
>>>        v->visitor.type_str = parse_type_str;
>>>        v->visitor.type_number = parse_type_number;
>>>        v->visitor.start_optional = parse_start_optional;
>>> +    v->visitor.type_freq = parse_type_freq;
>>>    
>>>        v->string = str;
>>>        return v;
>>     -Don Slutz
>
   -Don Slutz
Don Slutz Sept. 8, 2012, midnight UTC | #3
Don Slutz wrote:
> On 09/07/12 18:47, Igor Mammedov wrote:
>> On Fri, 7 Sep 2012 18:12:00 -0400
>> Don Slutz <Don@cloudswitch.com> wrote:
>>
>>> On 09/07/12 16:55, Igor Mammedov wrote:
>>>> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
>>>> Acked-by: Andreas Färber <afaerber@suse.de>
>>>> -- 
>>>> v2:
>>>>     * replaced _hz suffix for frequency visitor by _freq suffix
>>>>       suggested-by: Andreas Färber
>>>>     * fixed typo & extra space spotted-by: Andreas Färber
>>>> ---
>>>>    qapi/qapi-visit-core.c      | 11 +++++++++++
>>>>    qapi/qapi-visit-core.h      |  2 ++
>>>>    qapi/string-input-visitor.c | 22 ++++++++++++++++++++++
>>>>    3 files changed, 35 insertions(+)
>>>>
>>>> diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
>>>> index 7a82b63..5c8705e 100644
>>>> --- a/qapi/qapi-visit-core.c
>>>> +++ b/qapi/qapi-visit-core.c
>>>> @@ -311,3 +311,14 @@ void input_type_enum(Visitor *v, int *obj, 
>>>> const char *strings[],
>>>>        g_free(enum_str);
>>>>        *obj = value;
>>>>    }
>>>> +
>>>> +void visit_type_freq(Visitor *v, int64_t *obj, const char *name, 
>>>> Error **errp)
>>>> +{
>>>> +    if (!error_is_set(errp)) {
>>>> +        if (v->type_freq) {
>>>> +            v->type_freq(v, obj, name, errp);
>>>> +        } else {
>>>> +            v->type_int(v, obj, name, errp);
>>>> +        }
>>>> +    }
>>>> +}
>>>> diff --git a/qapi/qapi-visit-core.h b/qapi/qapi-visit-core.h
>>>> index 60aceda..e5e7dd7 100644
>>>> --- a/qapi/qapi-visit-core.h
>>>> +++ b/qapi/qapi-visit-core.h
>>>> @@ -62,6 +62,7 @@ struct Visitor
>>>>        void (*type_int64)(Visitor *v, int64_t *obj, const char 
>>>> *name, Error **errp);
>>>>        /* visit_type_size() falls back to (*type_uint64)() if 
>>>> type_size is unset */
>>>>        void (*type_size)(Visitor *v, uint64_t *obj, const char 
>>>> *name, Error **errp);
>>>> +    void (*type_freq)(Visitor *v, int64_t *obj, const char *name, 
>>>> Error **errp);
>>>>    };
>>>>       void visit_start_handle(Visitor *v, void **obj, const char 
>>>> *kind,
>>>> @@ -91,5 +92,6 @@ void visit_type_size(Visitor *v, uint64_t *obj, 
>>>> const char *name, Error **errp);
>>>>    void visit_type_bool(Visitor *v, bool *obj, const char *name, 
>>>> Error **errp);
>>>>    void visit_type_str(Visitor *v, char **obj, const char *name, 
>>>> Error **errp);
>>>>    void visit_type_number(Visitor *v, double *obj, const char 
>>>> *name, Error **errp);
>>>> +void visit_type_freq(Visitor *v, int64_t *obj, const char *name, 
>>>> Error **errp);
>>>>       #endif
>>>> diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
>>>> index 497eb9a..47d2a84 100644
>>>> --- a/qapi/string-input-visitor.c
>>>> +++ b/qapi/string-input-visitor.c
>>>> @@ -110,6 +110,27 @@ static void parse_start_optional(Visitor *v, 
>>>> bool *present,
>>>>        *present = true;
>>>>    }
>>>>    +static void parse_type_freq(Visitor *v, int64_t *obj, const 
>>>> char *name,
>>>> +                            Error **errp)
>>>> +{
>>>> +    StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, 
>>>> visitor, v);
>>>> +    char *endp = (char *) siv->string;
>>>> +    long long val;
>>> I get:
>>>
>>> cc1: warnings being treated as errors
>>> qapi/string-input-visitor.c: In function 'parse_type_freq':
>>> qapi/string-input-visitor.c:118: error: 'val' may be used uninitialized
>>> in this function
>>> make: *** [qapi/string-input-visitor.o] Error 1
>>> make: *** Waiting for unfinished jobs....
>> FC17 with default configure settings doesn't complain.
>> And I really do not see how it could be.
>>
>>> Which the change:
>>>
>>>
>>> diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
>>> index 47d2a84..74fe395 100644
>>> --- a/qapi/string-input-visitor.c
>>> +++ b/qapi/string-input-visitor.c
>>> @@ -115,7 +115,7 @@ static void parse_type_freq(Visitor *v, int64_t
>>> *obj, const char *name,
>>>    {
>>>        StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, 
>>> visitor, v);
>>>        char *endp = (char *) siv->string;
>>> -    long long val;
>>> +    long long val = 0;
>>>        errno = 0;
>>>        if (siv->string) {
>>>
>>> Fixes it for me.
>>>
>>>> +
>>>> +    errno = 0;
>>>> +    if (siv->string) {
>>>> +        val = strtosz_suffix_unit(siv->string, &endp,
>>>> +                             STRTOSZ_DEFSUFFIX_B, 1000);
>>>> +    }
>>>> +    if (!siv->string || val == -1 || *endp) {
> I am using CentOS 6.3 so a different compiler.  This is the line that 
> has the issue.
>
> If !siv->string is true the 1st if does not set val. val is then 
> checked for -1.
Opps, This is not correct.   I was going too fast.  After more thought, 
I will agree that C says that val will not be used un-initialized.  So 
it looks to me like a compiler bug.  Since the warning says "val' may be 
used uninitialized.." gcc is "not" reporting a real coding error.

This all said, I think the extra init of val (to 0 or -1) is better then 
requiring a compiler upgrade.
>
>>>> +        error_set(errp, QERR_INVALID_PARAMETER_VALUE, name,
>>>> +              "a value representable as a non-negative int64");
>>>> +        return;
>>>> +    }
>>>> +
>>>> +    *obj = val;
>>>> +}
>>>> +
>>>>    Visitor *string_input_get_visitor(StringInputVisitor *v)
>>>>    {
>>>>        return &v->visitor;
>>>> @@ -132,6 +153,7 @@ StringInputVisitor 
>>>> *string_input_visitor_new(const char *str)
>>>>        v->visitor.type_str = parse_type_str;
>>>>        v->visitor.type_number = parse_type_number;
>>>>        v->visitor.start_optional = parse_start_optional;
>>>> +    v->visitor.type_freq = parse_type_freq;
>>>>           v->string = str;
>>>>        return v;
>>>     -Don Slutz
>>
>   -Don Slutz
>
  -Don Slutz
diff mbox

Patch

diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c
index 47d2a84..74fe395 100644
--- a/qapi/string-input-visitor.c
+++ b/qapi/string-input-visitor.c
@@ -115,7 +115,7 @@  static void parse_type_freq(Visitor *v, int64_t 
*obj, const char *name,
  {
      StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v);
      char *endp = (char *) siv->string;
-    long long val;
+    long long val = 0;

      errno = 0;