プロシージャー間の解析

ソースコードの解析は、次のようなプログラムユニット間のオブジェクト宣言の不一致を検出します。

次に、プロシージャー間の解析例を示します。

例 1: 引数 の数の誤り

f1.c ファイルには、次の関数宣言が含まれています。

1  void Do_hello() {

2      printf("helo everybody!\n");

}

f2.c ファイルには、ルーチンへの呼び出しが含まれています。

1 extern void Do_hello(int);

2

3 void foo() {

4 Do_hello ( 1 ) ;

5 }

ソースチェッカーで次のメッセージが発行されます。

f2.c(4): エラー #12020: "Do_hello" の呼び出しで、実引数の数 (1) と仮引数の数 (0) が一致しません。"Do_hello" はファイル:f1.c、行:1 で定義されています。

プロシージャー間の解析ではまた、プロシージャー呼び出しを通したプログラム全体のプログラム・オブジェクトに関する次の情報を伝播します。

例 2: 境界外

このサンプルでは、ポインター A が Arr、定数値 5 が x に伝播します。

1 void foo( int* Arr, int x) {

2 for(; 0<=x; x--) {

3 Arr[x] = x;

4 }

5 }

6

7 void bar() {

8 int A[5];

9 foo(A,5);

10 }

ソースチェッカーで次のメッセージが発行されます。

f1.c(3): エラー #12255: バッファー・オーバーフロー: インデックスが配列 "A" の境界外の可能性があります。実引数 1 として "foo" に渡されています (ファイル:f2.c 行:9)。サイズ (0:4) の配列 "A" のインデックスは 5 です。