проверка типов в исходных файлах - PullRequest
4 голосов
/ 02 декабря 2010

Я потратил много часов на отладку проблемы, которая, как оказалось, была вызвана двумя исходными файлами, включая два заголовочных файла в другом порядке.Один из этих заголовков определил _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

Ответы [ 2 ]

4 голосов
/ 03 декабря 2010

Я бы порекомендовал поместить определения, которые изменяют заголовки, как в make-файле, а не в коде.В противном случае вы не можете быть уверены, какие модули компиляции имеют одно или другое определение, как вы уже видели.

Иногда изменение заголовков с помощью макросов - это предполагаемое поведение (например, использование заголовков в качестве шаблонов), а иногда это не так.t (как и в вашем случае), поэтому, я думаю, трудно выдать значимые предупреждения из инструмента.

2 голосов
/ 03 декабря 2010

Если вам нужно определить что-то в заголовочном файле, убедитесь, что все, что его использует, включает этот заголовок.Это включает в себя другие заголовки.

...