Re: Suspicion of regression in uninitialized value detection

2011-12-02 Thread Patrice B
Sorry for the noise, the problem is already tracked here:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18501

Le 2 décembre 2011 10:42, Patrice Bouchand  a écrit :
> Hello,
>
> I suspect a regression in uninitialized value detection, but before opening
> a bug I request your advices on the following problem:
>
> I compile the following code :
> 
> #include 
> #include 
>
> int main( int argc, char **argv )
>    {
>    int j;
>    int rtn;
>    int k,t;
>
>    j = atoi( argv[1] );
>
>    if ( j > 5 )
>   {
>   rtn = 10;
>   }
>
>    k=t;
>
>    printf("rtn = %d\n", rtn);
>
>    exit(0);
>    }
> 
>
> With gcc 4.0:
>
> bash-4.2$ gcc-4.0  -O2 -Wall ./test_gcc2.c -o test_gcc
> ./test_gcc2.c: In function 'main':
> ./test_gcc2.c:17: warning: 't' is used uninitialized in this function
> ./test_gcc2.c:7: warning: 'rtn' may be used uninitialized in this function
>
> With gcc 4.6.1, the warning on rtn disappears :
>
> bash-4.2$  gcc  -O2 -Wall ./test_gcc2.c -o test_gcc
> ./test_gcc2.c: In function ‘main’:
> ./test_gcc2.c:8:8: attention : variable ‘k’ set but not used
> [-Wunused-but-set-variable]
> ./test_gcc2.c:17:5: attention : ‘t’ is used uninitialized in this function
> [-Wuninitialized]
>
>
>  Do I need to pass special options to gcc 4.6.1 to enable this detection or
> is it a gcc problem ?
>
>    Regards
>
>  Patrice
>


Re: Suspicion of regression in uninitialized value detection

2011-12-06 Thread Patrice B
I agree with David, it would make our life easier if a warning is
triggered in such a case

  Patrice

Le 6 décembre 2011 09:04, David Brown  a écrit :
> On 05/12/2011 22:43, Jeff Law wrote:
>>
>> -BEGIN PGP SIGNED MESSAGE-
>> Hash: SHA1
>>
>> On 12/02/11 06:03, Patrice B wrote:
>>>
>>> Sorry for the noise, the problem is already tracked here:
>>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18501
>>>
>>> Le 2 décembre 2011 10:42, Patrice Bouchand  a
>>> écrit :
>>>>
>>>> Hello,
>>>>
>>>> I suspect a regression in uninitialized value detection, but
>>>> before opening a bug I request your advices on the following
>>>> problem:
>>>>
>>>> I compile the following code :
>>>>  #include
>>>>   #include
>>>>
>>>> int main( int argc, char **argv ) { int j; int rtn; int k,t;
>>>>
>>>> j = atoi( argv[1] );
>>>>
>>>> if ( j>  5 ) { rtn = 10; }
>>>>
>>>> k=t;
>>>>
>>>> printf("rtn = %d\n", rtn);
>>>>
>>>> exit(0); } 
>>>>
>>>> With gcc 4.0:
>>>>
>>>> bash-4.2$ gcc-4.0  -O2 -Wall ./test_gcc2.c -o test_gcc
>>>> ./test_gcc2.c: In function 'main': ./test_gcc2.c:17: warning: 't'
>>>> is used uninitialized in this function ./test_gcc2.c:7: warning:
>>>> 'rtn' may be used uninitialized in this function
>>>>
>>>> With gcc 4.6.1, the warning on rtn disappears :
>>>>
>>>> bash-4.2$  gcc  -O2 -Wall ./test_gcc2.c -o test_gcc
>>>> ./test_gcc2.c: In function ‘main’: ./test_gcc2.c:8:8: attention :
>>>> variable ‘k’ set but not used [-Wunused-but-set-variable]
>>>> ./test_gcc2.c:17:5: attention : ‘t’ is used uninitialized in this
>>>> function [-Wuninitialized]
>>>>
>>>>
>>>> Do I need to pass special options to gcc 4.6.1 to enable this
>>>> detection or is it a gcc problem ?
>>
>> The uninitialized warning for rtn is not emitted because gcc-4.6.1
>> optimizes the code better than gcc-4.0.  It effectively realizes the
>> value is uninitialized on one path through the CFG while on the other
>> path RTN has the value 10.
>>
>> When the uninitialized&  initialized to 10 paths meet, the compiler
>>
>> (correctly) pretends the value for the uninitialized path is 10 as
>> well.  It then propagates the value 10 into the use of RTN in the
>> printf statement.
>>
>> Thus by the time the uninitialized warning code runs all uses of the
>> RTN variable have been eliminated leaving just a use of the constant
>> 10.  Thus you do not get a warning.
>>
>> jeff
>
>
> That sounds to me like a bug.
>
> The point of a warning like "unintialised variable" is static error checking
> - it is to help spot mistakes in your code.  And if there is a path through
> the function that uses an uninitialised variable, that's almost certainly a
> bug in your code - one you would like the warning to tell you about.
>
> This is a case of the compiler seeing that there is undefined behaviour, and
> picking it's own way to define that behaviour.  It is of course free to do
> that (you can implement undefined behaviour any way you want) - and picking
> the shortest, fastest way is a good idea.  But it should trigger the
> warning.
>
> mvh.,
>
> David
>