I spent many hours debugging a problem that turned out to be caused by two source files, including two header files in a different order. One of these headers set _FILE_OFFSET_BITS to 64, and the other file header is included <sys / types.h>, which defines off_t as 32 or 64 bits depending on the setting of _FILE_OFFSET_BITS. I have given a brief example of this situation below. This was on x86_32 Linux (both Debian and CentOS 4.8).
Neither gcc -Wall main.c other.c, nor the Solaris 9 lint, nor splint detect this situation.
Does anyone know of a software tool that can detect this situation?
main.c
#define _FILE_OFFSET_BITS 64
#include <sys / types.h>
#include <stdio.h>
#include "header.h"
int
main (int argc, char ** argv) {
struct foo bar = {(off_t) 0, "foo"};
showproc (& bar);
printf ("sizeof (off_t) in main.c is% d \ n", sizeof (off_t));
return 0;
}
other.c
#include <sys / types.h>
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include "header.h"
void
showproc (const struct foo * p)
{
if (p-> offset == 0) {
if (p-> s == NULL)
puts ("NULL pointer reference");
else
printf ("Structure value is% s \ n", p-> s);
}
printf ("sizeof (off_t) in other.c is% d \ n", sizeof (off_t));
}
header.h
struct foo {
off_t offset;
const char * s;
};
extern void showproc (const struct foo *);
Program output
Null pointer reference
sizeof (off_t) in other.c is 4
sizeof (off_t) in main.c is 8
source share