gcc version 4.7.0 20120201 (experimental) [trunk revision 183790] (GCC)
foo (char *nname, char *oname)
while (nname != oname && (cmp = strcmp (nname, oname)) < 0)
if (nname == oname || cmp == 0)
$ ./xgcc -B. -O2 -Wall ~/init.c -c
/home/ryan/init.c: In function 'foo':
/home/ryan/init.c:12:29: warning: 'cmp' may be used uninitialized in this function [-Wmaybe-uninitialized]
Since both && and || operators guarantee left-to-right evaluation, in the case where nname == oname, strcmp is never called but in the (name == oname || cmp == 0) expression, nname == oname and the second operand is not evaluated so cmp is never used uninitialized.
I haven't followed development for a while, but I don't think GCC uninit analysis is powerful enough to detect this or even simpler cases like PR36550 and PR20968.
Yeah, it's simply too confusing code for GCCs static analysis. Thus the "may be used uninitialized".