跨源文件进行类型检查

我花了很多时间调试了一个问题,这个问题原来是由两个源文件引起的,包括两个不同顺序的头文件。 其中一个头文件将_FILE_OFFSET_BITS定义为64,另一个头文件包含<sys / types.h>,它定义了off_t为32位或64位长,具体取决于_FILE_OFFSET_BITS的设置。 我在下面列举了这种情况的一个简短例子。 这是在x86_32 Linux上(包括Debian unstable和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 %dn", 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 %sn", p->s);
        }
        printf("sizeof(off_t) in other.c is %dn", 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

我建议把定义修改头文件,比如在makefile中而不是在代码中。 否则,您无法确定哪些编译单元具有一个定义或另一个定义,正如您所经历的。

有时候用宏修改头文件是预期的行为(例如,使用头文件作为模板),有时它不是(比如你的情况),所以我认为很难从工具产生有意义的警告。


如果您需要在头文件中定义某些内容,请确保使用它的任何内容都包含该头文件。 这包括其他标题。

链接地址: http://www.djcxy.com/p/85947.html

上一篇: type checking across source files

下一篇: how to find cell index no. in 2