c - 头文件中的函数原型(prototype)与定义不匹配,如何捕获?

标签 c linker static-analysis function-prototypes

(我发现这个问题很相似但不是重复的: How to check validity of header file in C programming language )

我在头文件中有一个函数实现和一个不匹配的原型(prototype)(名称相同,类型不同)。头文件包含在使用函数的 C 文件中,但不包含在定义函数的文件中。

这是一个最小的测试用例:

header.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)没有捕捉到它(这让我很惊讶)。

我怎样才能捕捉到这些类型的错误?

[编辑:我意识到如果我也在 file2.c#include "header.h",编译器会报错。但是我有一个巨大的代码库,并不总是能够或适本地保证所有函数原型(prototype)的头文件都包含在实现文件中。]

最佳答案

file1.cfile2.c 中包含相同的头文件。这几乎可以防止原型(prototype)冲突。

否则,编译器无法检测到这样的错误,因为编译器在编译file1.c 时,函数的源代码对编译器是不可见的。相反,它只能信任已提供的签名。

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

关于c - 头文件中的函数原型(prototype)与定义不匹配,如何捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15137702/

相关文章:

c++ - liboauth 没有被正确链接

ocaml - 在值分析中获取数组索引变量及其值(Frama-C)

c# - Resharper:可疑的类型转换或检查

c++ - 通过 sscan f 写入十六进制模式

c - 将字符串直接发送到宏与从数组发送的结果不同

c - 使用 VS 2013 编译器将 .a 文件与 CMake 链接

c++ - 我可以从一个 .so 中获取符号名称并创建另一个 .so 吗?

iphone - 重复符号问题

c - 检测整数溢出的静态代码分析技术

c - 优化步骤顺序