http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56574



Thiago Macieira <thiago at kde dot org> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

                 CC|                            |thiago at kde dot org



--- Comment #3 from Thiago Macieira <thiago at kde dot org> 2013-03-08 21:11:19 
UTC ---

Looking at the code that GCC generated (4.7.2 from Fedora and similarly with

pristine 4.8 trunk@196249):



%edi = flag; %eax = value

    11          testl   %edi, %edi

    12          je      .L12

.L12 is the call to get_value() is placed

    13  .L2:

    14          testl   %edi, %edi

    15          sete    %dl

    16          testl   %eax, %eax

Here, EAX might be uninitialised

    17          setne   %al

    18          testb   %dl, %al

    19          jne     .L3

.L3 is an infinite loop

    20          testb   %dl, %dl

    21          jne     .L8

.L8 is the function exit (the loop break)

fall-through is an infinite loop



In other words, the warning is true: the generated code *is* using an

uninitialised variable.



The question is whether that is acceptable.



In order for EAX to be uninitialised, we must not have jumped to .L12. Since

the JE jump on line 12 was not taken, SETE must have set DL to 0 on line 15.

Then we compare AL to DL on line 18: as DL is zero, the result of the

comparison is ZF, whichever the value of AL might be. That means the JNZ jump

on line 19 is not taken.



The code will then proceed to the infinite loop.



Conclusion: it's just a bogus warning. It is correct from the point of view of

the assembly code that was generated, but the uninitialised value is never used

in any decisions.

Reply via email to