Fixing compiler warnings

Tomas Carnecky tom at
Mon Feb 2 14:02:57 PST 2009

I've been trying to fix the compiler warnings that gcc generates when 
compiling the xserver source. I've been able to fix quite a few, but 
there are still some left, which I don't know how to resolve. I have 14 
patches for the xserver and two for libxtrans. I can post them either 
individually or give you a link to my public repo from which you can 
fetch, or give you a link to cgit so you can look at the commits with a 
web browser. All patches except one of the libxtrans patches are just a 
couple lines. But one is huge (94KB) because it touches much of the 
libxtrans code.

However, there are a few warnings I was not able to fix, and some I 
probably won't be fixing (the ones that come from fb/ -- a scary place 
which is using lots of macros and other obfuscation techniques). That 
leaves me with a handful of different types of warnings which should be 
easy to fix, once I know what the preferred approach is. So let's start:

bigreq.c:46: warning: no previous prototype for ‘BigReqExtensionInit’
sync.c:2124: warning: no previous prototype for ‘SyncExtensionInit’
xcmisc.c:59: warning: no previous prototype for ‘XCMiscExtensionInit’

These three extensions are the only ones that have no previous 
prototype. It seems as the other extensions have their prototype from 
hw/xfree86/dixmods/extmod/modinit.h. It seems a bit strange that Xext/ 
modules include a file from hw/. But I'm not that familiar with the 
dependencies so I'll leave it up to you to decide what's to be done here.

glapitemp.h:1884: warning: ‘NoOp_dispatch_stub_339’ defined but not used
(repeated many times for different stubs)

The file seems to have a mechanism to silence the compiler:
  * This is just used to silence compiler warnings.
  * We list the functions which are not otherwise used.

Maybe the scripts needs to be updated and the file 

warning: cast to pointer from integer of different size
warning: cast from function call of type ‘pointer’ to non-matching type 
‘long unsigned int’

This is because the code casts integers to pointers and back. Most of 
the time the code just wants to save an int in the private data, and 
uses something along these lines:

   int i;
   dixSetPrivate(&devPrivates, myKey, (pointer) i);
   i = dixGetPrivate(&devPrivates, myKey);

Should the code use (u)intptr_t in these cases?

In three cases the warning is about code in hw/xfree86/dri/dri.c casting 
a void pointer to drm_handle_t which is 'unsigned int'.

sdksyms.c:1056: warning: initialization discards qualifiers from pointer 
target type

It seems because isItTimeToYield is declared volatile? Is it OK to 
explicitly cast that symbol to 'void *'?

Finally some warnings about deprecated functions. I don't think there's 
anything that can be done with it except eventually removing the 
functions, right?

One warning in xf86Bus.c:x_isSubsetOf() which I reported in an earlier 
mail. Maybe nobody cares about the code anymore. It hasn't been touched 
since the initial import.


More information about the xorg mailing list