diff mbox series

evaluate.c: fix a gcc 'may be used uninitialized' warning

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

Commit Message

Ramsay Jones June 21, 2020, 7:34 p.m. UTC
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(-)

Comments

Luc Van Oostenryck June 21, 2020, 8:18 p.m. UTC | #1
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 mbox series

Patch

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;