It's always instructive to crank the warning level up on compilers. It also helps to use different compilers since they tend to warn about different things. With GCC (GNU Compiler Collection) [1], I use -Wall (which sadly, isn't all possible warnings [2]) but today I learned that clang [3] (the default compiler on Mac OS-X these days) has a -Weverything option, so hey, why not try it?
Wow!
It's not kidding—it warns about everything! Missing prototypes, gratuitous use of packed structures [4], added padding to structures, signed conversions [5] (not only unsigned to signed, which I can see possibly losing information, but signed to unsigned, which doesn't), loss of interger precision, relying on auto-conversion of function calls (in my case, assigning the result of a function that returns a double [6] to an unsigned long long [7] variable), alignment changes in unions, even “default label in switch which covers all enumeration values.”
It's a lot of output to pour through. And this is for code that passes cleanly through GCC.
But in the ton of “legal, even if a bit questionable C” it still managed to find a real bug in my code:
>
```
In file included from common/XXXXlib.c:11:
third_party/uuid/src/uuid.h:34:17: warning: 'SHORT_MAX' is not defined, evaluates to 0 [-Wundef]
#if RAND_MAX == SHORT_MAX
^
```
It's a typo—it should be SHRT_MAX (apparently, there was a severe shortage of vowels in 70s computing, which is why C got stuck with a bunch of vowel-impaired identifiers—sheesh!) but at the same time, it's perfectly legal C, which is why I never noticed this until now.
[2] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=31573
[4] http://www.catb.org/esr/structure-packing/
[5] http://en.wikipedia.org/wiki/Signedness
[6] http://en.wikipedia.org/wiki/Double-precision_floating-point_format