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<pbfwdl...@gmail.com> 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
<stdio.h> #include<stdlib.h>
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