头文件中的函数原型与定义不匹配,如何捕获这个?

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编译它,没有任何错误或警告,但不出所料,当我运行它时会出现段错误.

  • 编译器很好用(我明白了)
  • 链接器没有捕获它(我有点惊讶)
  • 静态分析工具(Coverity)没有抓住它(我非常惊讶).

我怎样才能发现这些错误?

[编辑:我意识到如果我在file2.c中#include"header.h",编译器会抱怨.但是我有一个巨大的代码库,并不总是可能或适当的保证函数原型的所有头都包含在实现文件中.

Bla*_*iev 5

已包括在两个相同的头文件file1.cfile2.c.这几乎可以防止原型冲突.

否则,编译器无法检测到这样的错误,因为编译时编译器看不到函数的源代码file1.c.相反,它只能信任已经给出的签名.

至少在理论上,如果在目标文件中存储了额外的元数据,链接器就能够检测到这种不匹配,但我不知道这是否实际可行.


jus*_*tin 5

-Werror-implicit-function-declaration,-Wmissing-prototypes或等同于您支持的编译器之一.如果声明不在全局定义之前,它将会出错或抱怨.

以某种形式的严格C99模式编译程序也应该生成这些消息.GCC,ICC和Clang都支持这个功能(不确定MS的C编译器及其当前状态,因为VS 2005或2008是我用于C的最新版本).