Vic*_*cky 9 c linker static-analysis function-prototypes
(我发现这个问题类似但不重复: 如何检查C编程语言中头文件的有效性)
我有一个函数实现,以及一个头文件中的不匹配原型(相同名称,不同类型).头文件包含在使用该函数的C文件中,但不包含在定义该函数的文件中.
这是一个最小的测试用例:
header.h:
void foo(int bar);
Run Code Online (Sandbox Code Playgroud)
FILE1.C:
#include "header.h"
int main (int argc, char * argv[])
{
int x = 1;
foo(x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
档案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);
}
Run Code Online (Sandbox Code Playgroud)
我可以使用VS 2010编译它,没有任何错误或警告,但不出所料,当我运行它时会出现段错误.
我怎样才能发现这些错误?
[编辑:我意识到如果我在file2.c中#include"header.h",编译器会抱怨.但是我有一个巨大的代码库,并不总是可能或适当的保证函数原型的所有头都包含在实现文件中.
已包括在两个相同的头文件file1.c和file2.c.这几乎可以防止原型冲突.
否则,编译器无法检测到这样的错误,因为编译时编译器看不到函数的源代码file1.c.相反,它只能信任已经给出的签名.
至少在理论上,如果在目标文件中存储了额外的元数据,链接器就能够检测到这种不匹配,但我不知道这是否实际可行.
-Werror-implicit-function-declaration,-Wmissing-prototypes或等同于您支持的编译器之一.如果声明不在全局定义之前,它将会出错或抱怨.
以某种形式的严格C99模式编译程序也应该生成这些消息.GCC,ICC和Clang都支持这个功能(不确定MS的C编译器及其当前状态,因为VS 2005或2008是我用于C的最新版本).