main 関数に関する Code Prover の仮定
完全な実行可能ファイルにコンパイルされる C/C++ プログラムには main 関数が含まれます。Code Prover 解析では、main 関数が他の関数とは異なる方法で扱われます。
呼び出し階層の最上位としての main 関数
Code Prover は、main 関数を検証の開始点と見なします。自分で main 関数を提供しない場合、たとえばライブラリを検証する際には、検証によってこの関数が一つ生成されます。既定では、生成された main は、他の場所では呼び出されない関数を呼び出します。
その上で、検証は main 関数から開始して、呼び出し階層の下位に向かって処理されていき、main から呼び出される関数などが検証されます。
検証の時間または精度を調整するには、次のようにします。
生成される
mainの内容は、解析オプションを使用して変更できます。ライブラリの検証の構成を参照してください。
検証対象として指定する関数のみを呼び出す、独自の
mainを記述できます。
main 関数の引数
main 関数は、次の 3 つの形式のいずれかにすることができます。
引数を取らない形式:
int main() {}2 つの引数を取る形式:
int main(int argc, char* argv[]) {}その他の処理系定義の形式
C/C++ 標準の仕様に従い、検証では main 関数の引数について特定の仮定が行われます。main 関数で取る引数のデータ型が 2 番目の形式と一致する場合、Code Prover はこの形式を前提として、対応する制約を引数に適用します。特に以下に注意してください。
main関数の 1 番目の引数が整数 (または整数に対するtypdef) の場合、検証ではこの引数が非負の整数であると仮定されます。この引数は、外部環境からプログラムに渡される追加の引数の数を示します。この仮定は、
main関数がこの 1 つの引数のみを取る場合にも適用されます。1 番目の引数が整数で、2 番目の引数がポインターへのポインター (またはポインターへのポインターに対する
typedef) である場合、検証では最初の引数argcとサイズが等しいバッファーが 2 番目の引数に割り当てられていると仮定されます。バッファーの各要素 (argv[0]、argv[1]、…、argv[argc-1]) も初期化済みポインターであると仮定されます。この引数には、外部環境からプログラムに渡される追加の引数が格納されます。