GCC12 warns:
In file included from /usr/include/error.h:59,
from dwz.c:23:
In function ‘error’,
inlined from ‘checksum_die’ at dwz.c:3364:7:
/usr/include/bits/error.h:42:5: warning: ‘svalue’ may be used
uninitialized [-Wmaybe-uninitialized]
42 | __error_alias (__status, __errnum, __format, __va_arg_pack ());
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dwz.c: In function ‘checksum_die’:
dwz.c:3354:25: note: ‘svalue’ was declared here
3354 | int64_t svalue = read_sleb128 (ptr);
| ^~~~~~
It is correct. We jump to the common error reporting label negative
where we expect svalue to be set so we can print it in the error
message. But it isn't in all places. Fix this by explicitly assigning
svalue first in all places we goto negative on failure.
* dwz.c (checksum_die): Always assign svalue when
checking and reporting on unexpected negative values.
---
https://code.wildebeest.org/git/user/mjw/dwz/commit/?h=checksum_die_svalue
dwz.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/dwz.c b/dwz.c
index 7af1a03..ac0a540 100644
--- a/dwz.c
+++ b/dwz.c
@@ -3278,6 +3278,7 @@ checksum_die (DSO *dso, dw_cu_ref cu, dw_die_ref top_die, dw_die_ref die)
size_t len = 0;
unsigned char *old_ptr;
bool handled = false;
+ int64_t svalue;
uint64_t value;
while (form == DW_FORM_indirect)
@@ -3351,7 +3352,7 @@ checksum_die (DSO *dso, dw_cu_ref cu, dw_die_ref top_die, dw_die_ref die)
value = read_uleb128 (ptr); handled = true; break;
case DW_FORM_sdata:
{
- int64_t svalue = read_sleb128 (ptr);
+ svalue = read_sleb128 (ptr);
if (svalue >= 0)
{
value = svalue;
@@ -3369,9 +3370,10 @@ checksum_die (DSO *dso, dw_cu_ref cu, dw_die_ref top_die, dw_die_ref die)
}
case DW_FORM_implicit_const:
{
- if (t->values[i] >= 0)
+ svalue = t->values[i];
+ if (svalue >= 0)
{
- value = t->values[i];
+ value = svalue;
handled = true;
break;
}
@@ -3457,7 +3459,7 @@ checksum_die (DSO *dso, dw_cu_ref cu, dw_die_ref top_die, dw_die_ref die)
value = read_uleb128 (ptr); handled = true; break;
case DW_FORM_sdata:
{
- int64_t svalue = read_sleb128 (ptr);
+ svalue = read_sleb128 (ptr);
if (svalue >= 0)
{
value = svalue;
@@ -3468,9 +3470,10 @@ checksum_die (DSO *dso, dw_cu_ref cu, dw_die_ref top_die, dw_die_ref die)
goto negative;
}
case DW_FORM_implicit_const:
- if (t->values[i] >= 0)
+ svalue = t->values[i];
+ if (svalue >= 0)
{
- value = t->values[i];
+ value = svalue;
handled = true;
break;
}
--
2.18.4