Hi all, I am somewhat confused about the status of the "may be used uninitialized" warning...
Consider: --- testit.c --- #include <stdio.h> static void testit(int *a, int cnt) { struct {int score; int d;} best; int i; best.score = 0; for (i = 0; i < cnt; i++) if (a[i] > best.score) { best.score = a[i]; best.d = i; } if (best.score <= 0 || best.d > 8) return; printf("Found best %d at %d\n", best.score, best.d); } int main() { int a[10]; testit(a, 10); return 0; } --- This used to compile without warning using: gcc -Wall -O -o testit testit.c (tested with gcc version 3.4.2) On my FC4 box with gcc version 4.0.2 20051125 (Red Hat 4.0.2-8) it says: testit.c: In function 'testit': testit.c:6: warning: 'best.d' may be used uninitialized in this function I poked a bit in bugzilla, but it spewed 200 bugs related to the warning and I'm not too sure I can grok a definitive answer from there. I used to go by the assumption that a way to avoid an uninitialized warning was to group related variables in a struct, and as long as some of the struct was initialized, things would be fine. It seems to no longer be the case. Also, I can't find a way to execute the code and use best.d uninitialized. I've seen in a BZ comment that one way to kill the warning is to write: struct {int score; int d;} best = best; That indeed does work, but looks a bit strange. And making this a rule will quickly kill the usefullness of such a warning... Is there any word of wisdom I'm missing here ? Thanks for your time. Cheers, Christian