[cfe-dev] Getting better diagnostics from clang in portable code

Marshall Clow mclow.lists at gmail.com
Tue Oct 25 09:39:46 PDT 2011

This is not a proposal, but rather a starting point for a discussion.

I've been running a fair amount of ostensibly portable code through clang, and I'm getting a bunch of warnings that, while correct, are (I believe) unhelpful.

Here are two examples:

1) libjpeg tests for integer size mismatch/overflows with:
> 		if ((long) jd_samplesperrow != samplesperrow)
and clang helpfully responds with (when compiling on x86_64):
	jdmaster.c:285:31: warning: Both operands to '!=' always have the same value

2) crypto++ has a template that looks like this:

> template <class T>
> std::string IntToString(T a, unsigned int base = 10)
> {
> 	if (a == 0)
> 		return "0";
> 	bool negate = false;
> 	if (a < 0)
> 	{
> 		negate = true;
… and so on.

and when instantiated like this
		IntToString<unsigned long>

clang pipes up with:
./misc.h:414:8: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare]
        if (a < 0)

I can find other examples if people want to see them.
Both of these warnings are correct (in the current environment), and yet, I don't think they're that helpful (in these cases).
(For the crypto++ case, I edited the makefile to add -Wno-tautological-compare)

Anyone have any ideas about what can be done to recognize these kinds of cases and not warn on them (as opposed to other 
places where the warnings are more useful)?

Thanks in advance!

-- Marshall

More information about the cfe-dev mailing list