(類似しているが重複していないこの質問を見つけました: Cプログラミング言語でヘッダーファイルの有効性を確認する方法)
関数の実装と、一致しないプロトタイプ (同じ名前で型が異なる) がヘッダー ファイルにあります。ヘッダー ファイルは、関数を使用する C ファイルによってインクルードされますが、関数を定義するファイルには含まれません。
最小限のテスト ケースを次に示します。
header.h:
void foo(int bar);
File1.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
しかし、私は膨大なコード ベースを持っており、関数がプロトタイプ化されているすべてのヘッダーが実装ファイルに含まれていることを保証することが常に可能または適切であるとは限りません。]