(我发现这个问题相似但不重复: 如何检查 C 编程语言中的头文件的有效性)
我有一个函数实现,以及一个头文件中的不匹配原型(同名,不同类型)。头文件包含在使用函数的 C 文件中,但不包含在定义函数的文件中。
这是一个最小的测试用例:
标头.h:
void foo(int bar);
文件1.c:
#include "header.h"
int main (int argc, char * argv[])
{
int x = 1;
foo(x);
return 0;
}
文件 2.c:
#include <stdio.h>
typedef struct {
int x;
int y;
} t_struct;
void foo (t_struct *p_bar)
{
printf("%x %x\n", p_bar->x, p_bar->y);
}
我可以用 VS 2010 编译它,没有错误或警告,但不出所料,当我运行它时它会出现段错误。
- 编译器很好(我理解)
- 链接器没有捕捉到它(这让我有点惊讶)
- 静态分析工具(Coverity)没有捕捉到它(这让我很惊讶)。
我怎样才能捕捉到这些类型的错误?
[编辑:我意识到如果我也#include "header.h"
加入file2.c
,编译器会抱怨。但是我有一个庞大的代码库,并不总是可能或不适合保证函数原型的所有头文件都包含在实现文件中。]