Message ID | b3ff0d78-ceea-768e-339c-22466b84b81d@ramsayjones.plus.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | evaluate.c: fix a gcc 'may be used uninitialized' warning | expand |
On Sun, Jun 21, 2020 at 08:34:31PM +0100, Ramsay Jones wrote: > > Signed-off-by: Ramsay Jones <ramsay@ramsayjones.plus.com> > --- > > Hi Luc, > > Thanks for v0.6.2! :-D > > However, I am seeing a gcc compiler warning: > > CC evaluate.o > evaluate.c: In function ‘evaluate_generic_selection’: > evaluate.c:3310:38: warning: ‘base’ may be used uninitialized in this function [-Wmaybe-uninitialized] > if (base->type == SYM_ARRAY && base->array_size) { > ~~~~^~~~~~~~~~~~ > > This patch is just an FYI/quick-fix for this warning. The patch > I wanted to send, moved the declaration of the base symbol into > a new block at the 'if (stype->type == SYM_NODE)' conditional, > which would now include the (indented) SYM_ARRAY conditional > block. This, of course, meant that the SYM_ARRAY conditional was > indented too far to the right ... ;-) > > [perhaps this argues for that code to be refactored into a function] I just saw this warning too. Of course, *after* the release is made. What I had in made while writing the code was: base = stype; if (stype->type == SYM_NODE) base = stype->ctype.base_type; Your patch here below will work correctly but is not semantically correct if stype->type != SYM_NODE. Fortunately, it's guaranteed to always be a SYM_NODE (typename() is so). So, I'll probably commit the following: - if (stype->type == SYM_NODE) - base = stype->ctype.base_type; - + base = stype->ctype.base_type; Thanks for the bug report and for giving a try to the release. -- Luc
diff --git a/evaluate.c b/evaluate.c index aa0f2080..19a15ca3 100644 --- a/evaluate.c +++ b/evaluate.c @@ -3299,7 +3299,7 @@ static struct symbol *evaluate_generic_selection(struct expression *expr) source.ctype.modifiers &= ~(MOD_QUALIFIER|MOD_ATOMIC); for (map = expr->map; map; map = map->next) { struct symbol *stype = map->type; - struct symbol *base; + struct symbol *base = NULL; if (!evaluate_symbol(stype)) continue; @@ -3307,7 +3307,7 @@ static struct symbol *evaluate_generic_selection(struct expression *expr) if (stype->type == SYM_NODE) base = stype->ctype.base_type; - if (base->type == SYM_ARRAY && base->array_size) { + if (base && base->type == SYM_ARRAY && base->array_size) { get_expression_value_silent(base->array_size); if (base->array_size->type == EXPR_VALUE) continue;
Signed-off-by: Ramsay Jones <ramsay@ramsayjones.plus.com> --- Hi Luc, Thanks for v0.6.2! :-D However, I am seeing a gcc compiler warning: CC evaluate.o evaluate.c: In function ‘evaluate_generic_selection’: evaluate.c:3310:38: warning: ‘base’ may be used uninitialized in this function [-Wmaybe-uninitialized] if (base->type == SYM_ARRAY && base->array_size) { ~~~~^~~~~~~~~~~~ This patch is just an FYI/quick-fix for this warning. The patch I wanted to send, moved the declaration of the base symbol into a new block at the 'if (stype->type == SYM_NODE)' conditional, which would now include the (indented) SYM_ARRAY conditional block. This, of course, meant that the SYM_ARRAY conditional was indented too far to the right ... ;-) [perhaps this argues for that code to be refactored into a function] Thanks! ATB, Ramsay Jones evaluate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)