Я потратил много часов на отладку проблемы, которая, как оказалось, была вызвана двумя исходными файлами, включая два заголовочных файла в другом порядке.Один из этих заголовков определил _FILE_OFFSET_BITS для 64, а другой заголовочный файл включен, который определил off_t длиной 32 или 64 бита, в зависимости от настройки _FILE_OFFSET_BITS.Я включил ниже короткий пример этой ситуации.Это было в Linux x86_32 (нестабильная версия Debian и CentOS 4.8).
Ни gcc -Wall main.c other.c, ни Solaris 9 lint, ни splint не обнаруживают эту ситуацию.
Кто-нибудьзнаете о программном инструменте, который может обнаружить эту ситуацию?
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 *);
Вывод программы
NULL pointer reference
sizeof(off_t) in other.c is 4
sizeof(off_t) in main.c is 8