Fix gcc4 warning, idx may be used uninitialized
So, the compiler should be able to tell that either one of the two cases apply?
a: an assignment statement will be done on idx before its ever read
or
b: no assignment statement, control flow will never allow idx to be read
Quoted 15 lines · Alexey Dobriyan
Quoted 9 lines · Jesse Millan
This patch eliminates the warning that is generated when passing an uninitialized variable to a function, and in that function it 'looks' like you may read the contents.
In this case, the address of a local variable 'idx' is passed to the function
bvec_alloc_bs(). Insidebvec_alloc_bs(), it is possible that no value will be assigned to idx, in which case the function immediately returns null and does not go on to read it. Human eyes can see that its safe.I think this should go straight to http://gcc.gnu.org/bugzilla/enter_bug.cgi
Signature · 12 lines
Jesse Millan CNS Unix Team Portland State University Phone: (503) 725-9151 Mobile: (503) 453-0748 GPG key: www.system-calls.com/gpg.php grep --recursive --ignore-case 'SHOULD WORK' /usr/src/linux/* | wc _______________________________________________ Kernel-janitors mailing list [email protected] http://lists.osdl.org/mailman/listinfo/kernel-janitors
Its not easy to reproduce this warning in a simple program. And, I am not sure that it is a bug on gcc4's part. It looks like gcc4 emits the warning when it cannot prove beyond a shadow of doubt that the variable is initialized before use.
In an effort to cut down on warnings, should these be fixed? It can go either way, the compiler should be smart enough and maybe it will be someday, or, do the initialization to get rid of a bunch of warnings.
Any feed back would be appreciated.
Quoted 35 lines · Arnd Bergmann
Quoted 8 lines · Jesse Millan
So, the compiler should be able to tell that either one of the two cases apply?
a: an assignment statement will be done on idx before its ever read
or
b: no assignment statement, control flow will never allow idx to be read
gcc is normally pretty good at detecting this. Since gcc-4.0, it appears to do more checking inside inline functions, where older versions just assumed that a variable is initialized after a reference to it is passed to an inline function.
I'd suggest fixing the inline function to always do this instead of fixing the caller. After all, this needs to be fixed in the kernel, even if future gcc versions become smarter about it gcc-4.0 will continue to be used.
Arnd <><fs/bio.c +1
-0@@ -90,6 +90,7 @@ case 65 ... 128: *idx = 4; break; case 129 ... BIO_MAX_PAGES: *idx = 5; break;default : + *idx =0 ;return NULL ; }/*
Signature · 12 lines
Jesse Millan CNS Unix Team Portland State University Phone: (503) 725-9151 Mobile: (503) 453-0748 GPG key: www.system-calls.com/gpg.php grep --recursive --ignore-case 'SHOULD WORK' /usr/src/linux/* | wc _______________________________________________ Kernel-janitors mailing list [email protected] http://lists.osdl.org/mailman/listinfo/kernel-janitors