【发布时间】:2013-02-14 18:31:28
【问题描述】:
(我发现这个问题相似但不重复: How to check validity of header file in C programming language)
我有一个函数实现和一个头文件中的不匹配原型(同名,不同类型)。头文件包含在使用函数的 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",编译器会抱怨。但是我有一个庞大的代码库,并不总是可能或不适合保证函数原型的所有头文件都包含在实现文件中。]
【问题讨论】:
-
#include "header.h"也在实现文件中。 -
@DanielFischer:对不起,我意识到这可以在微不足道的情况下解决它,但这个最小的例子只是为了演示目的。实际代码库很大,很可能在多个地方都有原型化的函数,这些函数不能全部#include 到实现中。
-
嗯。通常的方法是将每个函数原型放在 one 头文件中[当然每个头文件通常没有一个原型],并将该头文件包含在使用该函数的每个文件和它所在的文件中定义。你能举一个不合适的例子吗?
-
也许有一个脚本会遍历所有源代码并确保 file.c 包含 file.h。
-
或者你是说你的前任把代码库彻底搞砸了,对你来说太大而无法修复?
标签: c linker static-analysis function-prototypes