PATCH: Initialize the X_md field
H.J. Lu
hjl.tools@gmail.com
Thu Apr 22 02:37:00 GMT 2010
On Wed, Apr 21, 2010 at 6:28 PM, Alan Modra <amodra@gmail.com> wrote:
> On Wed, Apr 21, 2010 at 10:10:01AM -0700, H.J. Lu wrote:
>> Index: expr.c
>> ===================================================================
>> RCS file: /cvs/src/src/gas/expr.c,v
>> retrieving revision 1.81
>> diff -u -p -r1.81 expr.c
>> --- expr.c 11 Dec 2009 13:42:09 -0000 1.81
>> +++ expr.c 21 Apr 2010 16:56:34 -0000
>> @@ -1740,6 +1740,7 @@ expr (int rankarg, /* Larger # is highe
>>
>> input_line_pointer += op_chars; /* -> after operator. */
>>
>> + right.X_md = 0;
>> rightseg = expr (op_rank[(int) op_left], &right, mode);
>> if (right.X_op == O_absent)
>> {
>
> There are many other calls to expr(). Why is it that just this one
> needs to init X_md?
>
"right" is allocated on the stack in expr, which is uninitialized in
recursive call. Later it does:
resultP->X_op_symbol = make_expr_symbol (&right);
which calls
symbol_set_value_expression (symbolP, expressionP);
which does
s->sy_value = *exp;
That is how the uninitialized value leaked out from expr. Other
calls to expr are different.
--
H.J.
More information about the Binutils
mailing list