(57)【特許請求の範囲】
【請求項１】
ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報と、前記ソースファイルに記載された演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報とが記憶されたデータベースと、
検査すべき関数を解析して演算のステップ毎に、前記定義情報と前記演算数値規則情報とを参照して当該演算が満たすべき条件を満たしているか否か判定する判定手段と、
この判定手段の判定結果を、情報を出力するための出力手段へ出力させる出力制御手段と
を具備し、
前記判定手段は、前記定義情報に基づきソースプログラムの複数の関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、または、第１のソースプログラムにおいて関数呼び出しが生じ第２のソースプログラムの呼び出し先関数を用いた処理を行った後に前記第１のプログラムへ戻って処理が行われる場合の前記第１のソースプログラムの関数と前記第２のソースプログラムの関数について、それぞれの関数に対応して変数の値範囲を算出し、算出した変数の値範囲について前記演算数値規則情報に基づき仕様上の値範囲を逸脱していないか判定を行うことを特徴とするプログラム検査装置。
【請求項２】
前記定義情報は、１つまたは複数のソースファイルにおける最上位の関数からその結果を用いる下位の関数を辿ることが可能なようにツリー状に作成されていることを特徴とする請求項１に記載のプログラム検査装置。
【請求項３】
前記判定手段は、前記定義情報に基づきソースプログラムの３つ以上の関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、それぞれの関数に対応して変数の値範囲を算出し、算出した変数の値範囲について前記演算数値規則情報に基づき仕様上の値範囲を逸脱していないか判定を行うことを特徴とする請求項１または２に記載のプログラム検査装置。
【請求項４】
前記演算数値規則情報は、変数の設計上の範囲値情報、関数呼び出し時の引数・戻り値範囲情報を含むことを特徴とする請求項１乃至３のいずれか１項に記載のプログラム検査装置。
【請求項５】
前記判定手段は、検査すべき関数を解析して演算のステップ毎に、演算を行って離散値を含む変数の値範囲を求めて、算出した変数の値範囲と、設計仕様上の値範囲とを比較し、判定を行うことを特徴とする請求項４に記載のプログラム検査装置。
【請求項６】
ソースファイルを解析し、ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報を作成してデータベースへ記憶する定義情報作成手段を具備することを特徴とする請求項１乃至５のいずれか１項に記載のプログラム検査装置。
【請求項７】
ソースファイルを解析し、このソースファイルに含まれる演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報を作成してデータベースへ記憶する演算数値規則情報作成手段を具備することを特徴とする請求項１乃至６のいずれか１項に記載のプログラム検査装置。
【請求項８】
前記判定手段は、検査すべき関数を解析して演算のステップ毎に、演算を行って変数の値範囲を求め、算出した変数の値範囲に基づいてランタイムエラー発生の有無の判定を行うことを特徴とする請求項１乃至７のいずれか１項に記載のプログラム検査装置。
【請求項９】
ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報と、前記ソースファイルに記載された演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報とが記憶されたデータベースを有し、このデータベースの情報を参照してコンピュータがソースファイルのプログラムの検査を行うプログラム検査装置の前記コンピュータを、
検査すべきソースファイルを解析して演算のステップ毎に、前記定義情報と前記演算数値規則情報とを参照して当該演算が満たすべき条件を満たしているか否か判定する判定手段、
この判定手段の判定結果を、情報を出力するための出力手段へ出力させる出力制御手段、
として機能させ、
更に、前記コンピュータを、前記判定手段として、
前記定義情報に基づきソースプログラムの複数の関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、または、第１のソースプログラムにおいて関数呼び出しが生じ第２のソースプログラムの呼び出し先関数を用いた処理を行った後に前記第１のプログラムへ戻って処理が行われる場合の前記第１のソースプログラムの関数と前記第２のソースプログラムの関数について、それぞれの関数に対応して変数の値範囲を算出し、算出した変数の値範囲について前記演算数値規則情報に基づき仕様上の値範囲を逸脱していないか判定を行うように機能させることを特徴とするプログラム検査用プログラム。
【請求項１０】
前記定義情報は、１つまたは複数のソースファイルにおける最上位の関数からその結果を用いる下位の関数を辿ることが可能なようにツリー状に作成されていることを特徴とする請求項９に記載のプログラム検査用プログラム。
【請求項１１】
前記コンピュータを前記判定手段として、前記定義情報に基づきソースプログラムの３つ以上の関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、それぞれの関数に対応して変数の値範囲を算出し、算出した変数の値範囲について前記演算数値規則情報に基づき仕様上の値範囲を逸脱していないか判定を行うように機能させることを特徴とする請求項９または１０に記載のプログラム検査用プログラム。
【請求項１２】
前記演算数値規則情報は、変数の設計上の範囲値情報、関数呼び出し時の引数・戻り値範囲情報を含むことを特徴とする請求項９乃至１１のいずれか１項に記載のプログラム検査用プログラム。
【請求項１３】
前記コンピュータを前記判定手段として、検査すべき関数を解析して演算のステップ毎に、演算を行って離散値を含む変数の値範囲を求めて、算出した変数の値範囲と設計仕様上の値範囲とを比較し、判定を行うように機能させることを特徴とする請求項１２に記載のプログラム検査用プログラム。
【請求項１４】
前記コンピュータを、
ソースファイルを解析し、ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報を作成してデータベースへ記憶する定義情報作成手段として機能させることを特徴とする請求項９乃至１３のいずれか１項に記載のプログラム検査用プログラム。
【請求項１５】
前記コンピュータを、
ソースファイルを解析し、このソースファイルに含まれる演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報を作成してデータベースへ記憶する演算数値規則情報作成手段として機能させることを特徴とする請求項９乃至１４のいずれか１項に記載のプログラム検査用プログラム。
【請求項１６】
前記コンピュータを前記判定手段として、検査すべき関数を解析して演算のステップ毎に、演算を行って変数の値範囲を求めて、算出した変数の値範囲に基づいてランタイムエラー発生の有無の判定を行うように機能させることを特徴とする請求項９乃至１５のいずれか１項に記載のプログラム検査用プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、プログラム検査装置及びプログラム検査用プログラムに関するものである。
【背景技術】
【０００２】
従来、ソースプログラムに含まれる演算に関する検査を行う場合には、プログラムの設計段階で各変数の採り得る値範囲を設計し、プログラムの実行中に各変数への入力が設計仕様上の値範囲を超えること（設計仕様上の値範囲からの逸脱）がないか、更に、それらの値範囲を使用して演算時にオーバーフロー、アンダーフロー、ゼロ割（除数が０である割算）の発生がないかを、目視（レビュー・若しくは机上）で検査していた。
【０００３】
このため、膨大な量のソースプログラムの検査を人が目視で行うことになり、膨大な時間とコストが発生することになっていた。また、プログラマーの技術力に差があるため、検査品質にバラツキが生じるという問題があった。
【０００４】
一方、特許文献１には、ソースコードの脆弱性検査において、脆弱性を有する部分を精度良く検出でき、且つ、プログラマーによるソースコード検査の作業負担を減らすことができるようにするための技術が開示されている。
【０００５】
また、特許文献２には、大域変数のアドレスを格納する処理を検出し、格納された変数を用いた大域変数の参照、代入を解析対象とすることで、大域変数の名前のみに基づく解析よりも大域変数に対する参照、代入についての詳細な解析結果を提供することが開示されている。更に、上述の解析結果を用いて、大域変数とそのアドレスが格納された変数との関係を視覚的に表示することができる技術が開示されている。
【０００６】
更に、特許文献３には、変数の代入文における変数型条件の検査を行い、プログラム誤りを検出するものが開示されている。
【０００７】
しかしながら、特許文献１のものは、関数間の引数の遷移を追跡するだけに留まっており、その引数が設計通りの範囲にあるのかなどを検出できるものではない。また、特許文献２のものは、各変数が採り得る値が設計の範囲内であるかを判定するものではない。更に、特許文献３のものは、変数型の検査に留まっており、演算を続けることにより変数値の範囲が設計の範囲に留まっているかなどのように、実行時エラーを的確に検査できるものではない。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００７−５２６２５号公報
【特許文献２】特開２０１０−１９１５９８号公報
【特許文献３】特開平７−１５２６０１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
実施形態では、演算が連続して行われ、結果が継承されて行くような場合においても的確にプログラムができているかを検査することを可能とする。
【課題を解決するための手段】
【００１０】
実施形態に係るプログラム検査装置は、ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報と、前記ソースファイルに記載された演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報とが記憶されたデータベースと、検査すべきソースファイルを解析して演算のステップ毎に、前記定義情報と前記演算数値規則情報とを参照して当該演算が満たすべき条件を満たしているか否か判定する判定手段と、この判定手段の判定結果を、情報を出力するための出力手段へ出力させる出力制御手段とを具備し、前記判定手段は、前記定義情報に基づきソースプログラムの複数の関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、または、第１のソースプログラムにおいて関数呼び出しが生じ第２のソースプログラムの呼び出し先関数を用いた処理を行った後に前記第１のプログラムへ戻って処理が行われる場合の前記第１のソースプログラムの関数と前記第２のソースプログラムの関数について、それぞれの関数に対応して変数の値範囲を算出し、算出した変数の値範囲について前記演算数値規則情報に基づき仕様上の値範囲を逸脱していないか判定を行うことを特徴とする。
【図面の簡単な説明】
【００１１】
【図１】本発明に係るプログラム検査装置の実施形態を示すブロック図。
【図２Ａ】本発明に係るプログラム検査装置の実施形態の検査対象に係る１つの処理またはプロジェクトのツリー構成を示す図。
【図２Ｂ】本発明に係るプログラム検査装置の実施形態の検査対象に係る３つの処理またはプロジェクトのツリー構成とソースファイルの関係の一例を示す図。
【図２Ｃ】本発明に係るプログラム検査装置の実施形態に備えられる定義情報ファイルの内容を示す図。
【図３】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの元の情報が記載されたソースプログラムを示す図。
【図４】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの内容を示す図。
【図５】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの内容であるグローバル変数が記載されたソースプログラムを示す図。
【図６】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの内容であり、グローバル変数に関する部分を示す図。
【図７】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの内容である内部変数とスタティック変数が記載されたソースプログラムを示す図。
【図８】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの内容であり、内部変数とスタティック変数に関する部分を示す図。
【図９Ａ】本発明に係るプログラム検査装置の実施形態により行われるプログラム検査動作のフローチャート。
【図９Ｂ】本発明に係るプログラム検査装置の実施形態の検査対象に係る１つの処理またはプロジェクトのツリー構成において、実施形態により行われるプログラム検査動作の一連の追行手順を示す図。
【図１０】本発明に係るプログラム検査装置の実施形態により行われる第１のプログラム検査動作と出力結果の説明図。
【図１１】本発明に係るプログラム検査装置の実施形態により行われる第２のプログラム検査動作と出力結果の説明図。
【図１２】本発明に係るプログラム検査装置の実施形態により行われる第３のプログラム検査動作と出力結果の説明図。
【図１３】本発明に係るプログラム検査装置の実施形態により行われる第４のプログラム検査動作と出力結果の説明図。
【図１４】本発明に係るプログラム検査装置の実施形態により行われる第５のプログラム検査動作と出力結果の説明図。
【図１５】本発明に係るプログラム検査装置の実施形態により行われる第６のプログラム検査動作と出力結果の説明図。
【発明を実施するための形態】
【００１２】
以下添付図面を参照して、本発明に係るプログラム検査装置及びプログラム検査用プログラムの実施形態を説明する。各図において、同一の構成要素には同一の符号を付して重複する説明を省略する。図１に、第１の実施形態に係るプログラム検査装置を示す。この実施形態に係るプログラム検査装置は、データベース２００とＣＰＵ（中央処理装置）１００と、キーボード等の情報入力を行うための入力部１５０、情報を出力する出力手段としての表示手段３００とを備えている。即ち、プログラム検査装置は、ワークステーション、サーバ、パーソナルコンピュータ等のコンピュータ装置によって構成することができる。
【００１３】
データベース２００には、定義情報ファイル２１０と演算数値規則情報ファイル２２０とが設けられている。定義情報ファイル２１０は、ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報を有するものである。
【００１４】
定義情報は、以下のように、１つまたは複数のソースファイルにおける最上位の関数からその結果を用いる下位の関数を辿ることが可能なようにツリー状に作成されている。例えば、図２Ａに示されるような解析対象のプログラムが１つの処理またはプロジェクトであるとき、エントリーポイントＡ（ＥｎｔｒｙＰｏｉｎｔＡ）へ処理がジャンプするとき、関数Ａ１（ＦｕｎｃＡ１）〜関数Ａ８（ＦｕｎｃＡ８）により構成され、また、矢印により示されるようにツリー状に関数が結合されている場合には、関数Ａ１（ＦｕｎｃＡ１）から最下位の関数Ａ３（ＦｕｎｃＡ３）、関数Ａ８（ＦｕｎｃＡ８）、関数Ａ６（ＦｕｎｃＡ６）、関数Ａ７（ＦｕｎｃＡ７）を辿ることが可能に定義情報が構成されている。上記において、最上位関数は、関数Ａ１（ＦｕｎｃＡ１）である。
【００１５】
次に、ソースファイルとプロジェクト（処理）とは必ずしも一致しないことを説明する。例えば、図２Ｂに示すように、エントリーポイントＡ（ＥｎｔｒｙＰｏｉｎｔＡ）により始まるプロジェクトＡＡと、エントリーポイントＢ（ＥｎｔｒｙＰｏｉｎｔＢ）により始まるプロジェクトＢＢと、エントリーポイントＣ（ＥｎｔｒｙＰｏｉｎｔＣ）により始まるプロジェクトＣＣとが存在するプログラムがあるとする。例えば、３つのセンサにより所定事象が生じることを検出しており、図示しない事象ＳＡが生じるとエントリーポイントＡ（ＥｎｔｒｙＰｏｉｎｔＡ）からの処理が開始され、図示しない事象ＳＢが生じるとエントリーポイントＢ（ＥｎｔｒｙＰｏｉｎｔＢ）からの処理が開始され、図示しない事象ＳＣが生じるとエントリーポイントＣ（ＥｎｔｒｙＰｏｉｎｔＣ）からの処理が開始される如く処理が行われるプログラムである。この図２Ｂにおいて、ソースファイルの区切りを破線により示す。即ち、ソースファイルは、１つのプロジェク内に留まらず、２つ以上のプロジェクトに跨って存在する場合もある。例えば、関数Ｂ２（ＦｕｎｃＢ２）、関数Ｂ４（ＦｕｎｃＢ４）、関数Ｃ２（ＦｕｎｃＣ２）、関数Ｃ４（ＦｕｎｃＣ４）は２つのプロジェクトに跨っている。また、例えば、関数Ａ５（ＦｕｎｃＡ５）、関数Ｂ５（ＦｕｎｃＢ５）、関数Ｃ３（ＦｕｎｃＣ３）、関数Ｃ５（ＦｕｎｃＣ５）は３つのプロジェクトに跨っている。このような場合においても、定義情報は前述の通り、「１つまたは複数のソースファイルにおける最上位の関数からその結果を用いる下位の関数を辿ることが可能なようにツリー状に作成されている」。
【００１６】
定義情報ファイル２１０は、例えば、図２Ｃに示されるように、関数が含まれている「ソースファイル名」と、その関数の「位置」（ソースプログラムの何行目）と、引数を含む「関数名」と、「ツリー情報」とが対応付けられて記憶されている。「ツリー情報」は、上位側の関数の結果を用いて当該関数が演算を行う場合における関係を示す情報である。従って、図２Ｃの第１欄の関数が最上位の関数であり、第２欄の関数が第１欄の結果を受けて演算を行う関数であり、第３欄の関数が第２欄の結果を受けて演算を行う関数であり、・・・と続く場合には、第１欄の「ツリー情報」には下位の関数名（第２欄の関数名）とその位置情報が記載され、第２欄の「ツリー情報」には上位の関数名（第１欄の関数名）とその位置情報及び下位の関数名（第３欄の関数名）とその位置情報が記載され、第３欄の「ツリー情報」には上位の関数名（第２欄の関数名）とその位置情報及び下位の関数名（第Ｘ欄の関数名）とその位置情報が記載され、・・・と続く。上記で第Ｘ欄とは、図２Ｃの定義情報ファイル２１０には、例えば位置情報である行番号の順に、欄が作成されるため、必ずしも連続した欄にツリー状に続く関数の情報が配置されるとは限らないためである。また、ツリー状に続かない関数に関しては、「ツリー情報」は記載されない。
【００１７】
本実施形態では、定義情報作成手段１３０が設けられており、検査対象のソースファイルを解析し、ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報ファイル２１０を作成してデータベース２００へ記憶する。この定義情報ファイル２１０については、入力部１５０からオペレータが入力しても良く、また、図２Ｃに示した如くテーブル化したファイルを記憶媒体に用意し、これを図示しない記憶媒体読取装置により読み取りデータベース２００へ転送するようにしても良い。定義情報作成手段１３０は、抽象構文木作成機能を有し、この抽象構文木作成機能を用いて上記関数をツリー状に辿るための「ツリー情報」を作成するように構成することができる。
【００１８】
また、演算数値規則情報ファイル２２０は、演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報のファイルである。この演算数値規則情報は、変数の設計上の範囲値情報、関数呼び出し時の引数・戻り値範囲情報を含むものである。
【００１９】
例えば、ソースファイル名が図３に示される「ｓｒｃ／ｍａｉｎ．ｃ」であるソースプログラムに図３に示される引数ｐａｒａｍ１、ｐａｒａｍ２、ｐａｒａｍ３の範囲及び戻り値ｒｅｔｕｒｎの範囲が記載されているとき、この記載に基づき、図４に示す引数・戻り値範囲情報のファイルを作成して記憶することができる。即ち、図１に示されるように、このプログラム検査装置には、ソースファイルを解析し、このソースファイルに含まれる演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報ファイル２２０を作成してデータベース２００へ記憶する演算数値規則情報作成手段１４０が具備されている。勿論、この演算数値規則情報ファイル２２０については、入力部１５０からオペレータが入力しても良く、また、図４に示した如くテーブル化したファイルを記憶媒体に用意し、これを図示しない記憶媒体読取装置により読み取りデータベース２００へ転送するようにしても良い。
【００２０】
この演算数値規則情報ファイル２２０の演算数値規則情報としては、変数の設計上の範囲値情報として、グローバル変数がある。例えば、図５に示されるように、ソースファイル名が「ｓｒｃ／ｓｕｂ１．ｃ」であるソースプログラムに、ｇ＿ｖａｌｕｅ１〜ｇ＿ｖａｌｕｅ４というグローバル変数があり、図示しない他の記載箇所で変数の値範囲が、ｇ＿ｖａｌｕｅ１では「０，１」、ｇ＿ｖａｌｕｅ２では「１〜１０」、ｇ＿ｖａｌｕｅ３では「１〜１０，１００」、ｇ＿ｖａｌｕｅ４では「０ｘ０１，０ｘ０２，０ｘ０４，０ｘ０８」と記載されているものとする。
【００２１】
上記記載に基づき、図６に示されるように、グローバル変数の設計上の範囲値情報をテーブル化して演算数値規則情報ファイル２２０を作成してデータベース２００へ記憶する。この処理は、演算数値規則情報作成手段１４０が行っても良く、入力部１５０からオペレータが入力しても良く、また、テーブル化したファイルを記憶媒体に用意し、データベース２００へ転送するようにしても良い。
【００２２】
更に、この演算数値規則情報ファイル２２０の演算数値規則情報としては、変数の設計上の範囲値情報として、内部変数とスタティック変数がある。例えば、図７に示されるように、ソースファイル名が「ｓｒｃ／ｓｕｂ２．ｃ」であるソースプログラムの、２行目に内部変数ｉを含む「ｉｎｔ  ｉ」という記述があり、３行目に内部変数ｊを含む「ｃｈａｒ  ｊ」という記述があり、５行目にスタティック変数ｋを含む「ｓｔａｔｉｃ  ｉｎｔ  ｋ」という記述があり、６行目にスタティック変数ｌを含む「ｓｔａｔｉｃ  ｓｈｏｒｔ  ｌ」という記述があり、図示しない他の記載箇所で変数の値範囲が、「ｉｎｔ  ｉ」のｉでは「０〜１０」、「ｃｈａｒ  ｊ」のｊでは「０ｘ００，０ｘ０１，０ｘ０２，０ｘ０４，０ｘ０８」、「ｓｔａｔｉｃ  ｉｎｔ  ｋ」のｋでは「０，１」、「ｓｔａｔｉｃ  ｓｈｏｒｔ  ｌ」のｌでは「０ｘ００００〜０ｘ１ＦＦＦ」と記載されているものとする。
【００２３】
上記記載に基づき、図８に示されるように、内部変数とスタティック変数の設計上の範囲値情報をテーブル化して演算数値規則情報ファイル２２０を作成してデータベース２００へ記憶する。この処理は、演算数値規則情報作成手段１４０が行っても良く、入力部１５０からオペレータが入力しても良く、また、テーブル化したファイルを記憶媒体に用意し、データベース２００へ転送するようにしても良い。
【００２４】
ＣＰＵ１００には、判定手段１１０が備えられている。判定手段１１０は、検査すべきソースファイルを解析して演算のステップ毎に、上記定義情報ファイル２１０の定義情報と上記演算数値規則情報ファイル２２０の演算数値規則情報を参照して当該演算が満たすべき条件を満たしているか否か判定するものである。また、判定手段１１０は後に説明するように、検査すべき関数を解析して演算のステップ毎に、演算を行って変数の値範囲を求め、算出した変数の値範囲に基づいてランタイムエラー発生の有無の判定を行う。
【００２５】
より具体的には、判定手段１１０は、上記定義情報に基づきソースプログラムの関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について演算を行って、演算のステップ毎に、離散値を含む変数の値範囲を求めて、算出した変数の値範囲について上記演算数値規則情報に基づき判定（判定処理１という）を行う。更に、それらの値範囲を使用して演算時にオーバーフロー、アンダーフロー、ゼロ割（除数が０である割算）といったランタイムエラーの発生がないかを判定する（判定処理２という）。
【００２６】
更に、ＣＰＵ１００には、出力制御手段１２０が備えられている。出力制御手段１２０は、上記の判定手段の判定結果を、情報を出力するための出力手段として例示されている表示手段３００へ出力させるものである。
【００２７】
以上のように構成されたプログラム検査装置は、図９Ａのフローチャートに示すようにプログラム検査を行う。まず、検査対象のプログラムを解析し、定義情報と演算数値規則情報とのファイルを作成しデータベース２００へ記憶するか、または検査対象のプログラムから定義情報と演算数値規則情報とに関するテーブル情報を得て、定義情報と演算数値規則情報とのファイルへ変換しデータベース２００へ記憶する（Ｓ１１）。
【００２８】
次に、上記定義情報に基づきソースプログラムの関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、変数の値範囲を算出し、算出した変数の値範囲について上記演算数値規則情報に基づき判定（判定処理１という）を行って結果を出力する（Ｓ１２）。
【００２９】
例えば、図１０に示すように、プログラムＰＲＯＧ１において引数ａ１，ｂ１を用いて関数Ｆｕｎｃ１により演算を行った結果、得られたａ２，ｂ２がプログラムＰＲＯＧ１の下位のプログラムＰＲＯＧ２において用いられ、プログラムＰＲＯＧ２において引数ａ２，ｂ２を用いて関数Ｆｕｎｃ２により演算を行った結果、得られたａ３，ｂ３がプログラムＰＲＯＧ２の下位のプログラムＰＲＯＧ３において用いられる場合を説明する。
【００３０】
上記のようにツリー状に関数を辿るための情報は既に説明した通り、定義情報ファイル２１０に存在している。最上位の関数に関する引数、戻り値の範囲は、演算数値規則情報ファイル２２０に存在しており、図１０ではＨ１に記述されているものであるから、この引数と戻り値の範囲から関数Ｆｕｎｃ１により演算を行い、その結果、得られた値ａ２，ｂ２がＲ１に示された通りとなるか検査する。更に、このＲ１の値から下位の関数Ｆｕｎｃ２の引数と戻り値の範囲がＨ２に示すような値となるかを検査する。更に、Ｈ２の引数と戻り値の範囲から関数Ｆｕｎｃ２により演算を行い、その結果、得られた値ａ３，ｂ３がＲ２に示された通りとなるか検査する。更に、このＲ２の値から下位の関数Ｆｕｎｃ３の引数と戻り値の範囲がＨ３に示すような値となるかを検査する。結果の出力としては、図１０の表示におけるＲ１、Ｒ２、Ｈ１、Ｈ２、Ｈ３の位置に、適正または不適正を表示する例を挙げることができる。
【００３１】
以上のようなツリー状に関数を辿って行うことができる判定処理１を、ツリー状に結合された１つの関数において行ったかを検出し（Ｓ１３）、当該関数において他にも判定処理１を行うべきであればステップＳ１２へ戻って処理を行う。一方、判定処理１を行うべきものが関数において無くなると、ステップＳ１４へ進む。
【００３２】
ステップＳ１４においては、検査対象プログラムを解析し、演算のステップ毎に演算して変数を求め、呼出し先関数の変数値範囲を演算数値規則情報から得て対比し判定（判定処理２）を１つの関数において行って結果を出力する（Ｓ１４）。このステップＳ１４において、ランタイムエラー発生の有無の判定を行っている。
【００３３】
判定処理２の具体例を説明する。図１１には、演算として、「ｃ＝ａ／ｂ」、「ｄ＝ａ／ｂ」、「＊ｐ＝−１」、について検査を行う例を示す。まず、「ｃ＝ａ／ｂ」については、変数ａ、ｂが、この関数より上位の位置に示されており、演算数値規則情報ファイル２２０に存在している。ここでｂは、「−１０≦ｂ≦１０」であるから、「０」を含む。このため、ゼロ除算の可能性があることを警告表示する。「ｄ＝ａ／ｂ」については、「ｉｆ（ｂ＞０）」における演算であるからゼロ除算の可能性がなく、「問題無し」と判定して出力する。「ｄ＝ａ／ｂ」については、０から１０までの値を取り得るので、変数ｄの範囲「０≦ｄ≦５」に対してオーバーフローとなる可能性を警告出力する。「＊ｐ＝−１」では、ポインタｐは、それが指し示している配列の範囲外を指していることから、警告を出力する。
【００３４】
図１２の例は、コンピュータが判定手段１１０として、ランタイムエラーを検査した場合の例を示す。演算として、「ｃ＝ａ／ｂ」、「ｄ＝ａ／ｂ」、「ｃ＝ａ＊ｂ」について検査を行う例を示す。まず、「ｃ＝ａ／ｂ」については、変数ａ、ｂが、この関数より上位の位置に示されており、演算数値規則情報ファイル２２０に存在している。ここでｂは、「−１０≦ｂ≦１０」であるから、「０」を含む。このため、ゼロ除算の可能性があり、ランタイムエラー発生の可能性があることを警告出力する。
【００３５】
「ｄ＝ａ／ｂ」については、「ｉｆ（ｂ＞０）」における演算であるからゼロ除算の可能性がなく、「ランタイムエラー無し」を出力する。「ｃ＝ａ＊ｂ」における「ａ＊ｂ」については、ｉｎｔ型の範囲であり、「ランタイムエラー無し」を出力する。「ｃ＝ａ＊ｂ」については、演算数値規則情報ファイル２２０に存在している変数ａの範囲（０≦ａ≦１０）と、変数ｂの範囲（−１０≦ｂ≦１０）から（−１００≦ａ＊ｂ≦１００）となり、変数ｃの範囲（０≦ｃ≦１０）に対し、オーバーフローとアンダーフローの可能性があり、ランタイムエラー発生の可能性があることを警告出力する。
【００３６】
図１３は、プログラム構文や文法上のエラーや、変数値範囲定義の不整合、ランタイムエラーを検査した場合の例を示す。プログラム構文や文法上のエラーに関する規則等の情報についても、その規則情報が演算数値規則情報ファイル２２０に存在しているものとする。そして判定手段１１０は、ソースプログラムの構文解析、字句解析など行い、上記演算数値規則情報ファイル２２０に存在しているプログラム構文や文法上のエラーに関する規則等の情報に基づき規則等に従ったプログラムとなっているかを判定する。
【００３７】
この図１３において検査対象となっているのは、変数値範囲の指定文である「ｅｘｔｅｒｎ  ｉｎｔ  ＧｅｔＩｎｄｅｘ（  ）」、変数値範囲の定義文である「／＊  ｉ，ｍｉｎ：０，ｍａｘ：９９＊／」、「＊ｐ＝−１」、「ｉ＝ＧｅｔＩｎｄｅｘ（  ）」、「＊（ｐ−ｉ−１）＝１」、について検査を行う例を示す。
【００３８】
「ｅｘｔｅｒｎ  ｉｎｔ  ＧｅｔＩｎｄｅｘ（  ）」については、「ＧｅｔＩｎｄｅｘ」に続く、括弧内に入るべき変数値範囲の指定が記述されておらず、漏れがあることを示す警告出力を行うものである。次の「／＊  ｉ，ｍｉｎ：０，ｍａｘ：９９＊／」については、設計書により演算数値規則情報ファイル２２０に記載の定義「ｍｉｎ：５０，ｍａｘ：９９」と相違しており、変数値範囲の不整合があることを示すエラー出力を行うものである。「＊ｐ＝−１」については、図１２の例と同じく、配列の範囲外であり、その警告を出力する。
【００３９】
「ｉ＝ＧｅｔＩｎｄｅｘ（  ）」については、「ＧｅｔＩｎｄｅｘ」に続く、括弧内に入るべき関数戻り値範囲の指定が記述されておらず、関数戻り値をｉｎｔ型の最大最小とみなすことから、値範囲が設定された変数ｉへの代入においてオーバーフローとアンダーフローの可能性があり、ランタイムエラー発生の可能性があることを示す警告出力を行うものである。「＊（ｐ−ｉ−１）＝１」、については、変数ｉが設計仕様上の値範囲に収まっている場合は問題ないが、ＧｅｔＩｎｄｅｘ（  ）の戻り値を代入していることから、（ｐ−ｉ−１）の結果が配列の範囲外を指す可能性があるため、その警告を出力する。
【００４０】
図１４は、常に真または偽になるコードを検出し、また、到達不能コードの検出を行う例を示したものである。図１４における「ｉｆ（４！＝ＴｅｓｔＩｎｄｅｘ（４））」は常に真となるステートメントであり、エラーであることが出力される。また、図１４の「ｉｆ（５！＝ＴｅｓｔＩｎｄｅｘ（５））」は、「ｉｆ（４！＝ＴｅｓｔＩｎｄｅｘ（４））」が常に真であり、次の「ｇｏｔｏ  ｆａｉｌ」とならず、到達不能コードであり、エラーであることが出力される。
【００４１】
以上の例の如き、「判定処理２」が図９ＡのステップＳ１４において行われ、判定処理２を当該１の関数について行ったかを検出し（Ｓ１５）、当該１の関数において他にも判定処理２を行うべき対象があればステップＳ１４へ戻って処理を行う。一方、判定処理２を行うべき対象が無くなると、エンドとなる。以上のような動作は、図９Ｂに示すようにエントリーポイントＡ（ＥｎｔｒｙＰｏｉｎｔＡ）により始まるプロジェクトＡＡにおいては、一点鎖線により示される如く一筆書きで各関数毎に行われる。つまり、図９Ａに示されているフローチャートに対応するプログラムによる処理が関数毎に、関数Ａ１（ＦｕｎｃＡ１）→関数Ａ２（ＦｕｎｃＡ２）→関数Ａ３（ＦｕｎｃＡ３）→（関数Ａ２（ＦｕｎｃＡ２））→関数Ａ８（ＦｕｎｃＡ８）→（関数Ａ２（ＦｕｎｃＡ２））→（関数Ａ１（ＦｕｎｃＡ１））→関数Ａ４（ＦｕｎｃＡ４）→関数Ａ５（ＦｕｎｃＡ５）→関数Ａ６（ＦｕｎｃＡ６）→（関数Ａ５（ＦｕｎｃＡ５））→関数Ａ７（ＦｕｎｃＡ７）→（関数Ａ５（ＦｕｎｃＡ５））→（関数Ａ４（ＦｕｎｃＡ４））→（関数Ａ１（ＦｕｎｃＡ１））と、順次に繰り返し解析が実行される。
【００４２】
次に、図１５に示すように、プログラムＰＲＯＧ１１において関数呼び出しが生じ、プログラムＰＲＯＧ２１の呼び出し先関数を用いた処理を行った後にプログラムＰＲＯＧ１１へ戻って処理が行われる場合の解析と判定について説明する。プログラムＰＲＯＧ１１では、関数に関する引数、戻り値の範囲は、演算数値規則情報ファイル２２０に存在しており、図１５ではＨ１１に記述されているものである。そこで、プログラムＰＲＯＧ１１における矢印ＰＡＲＴ１１の部分においては、（ａ）変数の値範囲を算出し、（ｂ）仕様上の値範囲を逸脱していないかのチェックを行い、（ｃ）ランタイムエラーの可能性がないかについてもチェックを行う。上記（ａ）〜（ｃ）については、関数内の１ステートメント毎にチェック及びチェック結果の出力を実行する。
【００４３】
プログラムＰＲＯＧ１１の「Ｆｕｎｃ２（ａ２，ｂ２）」において関数呼び出しによりプログラムＰＲＯＧ２１へ遷移して、解析・判定が実行される。遷移の際に引数の値範囲情報を引き渡す。プログラムＰＲＯＧ２１では、関数に関する引数、戻り値の範囲は、演算数値規則情報ファイル２２０に存在しており、図１５ではＨ２１に記述されているものである。プログラムＰＲＯＧ２１における矢印ＰＡＲＴ２１の部分においても、（ａ）変数の値範囲を算出し、（ｂ）仕様上の値範囲を逸脱していないかのチェックを行い、（ｃ）ランタイムエラーの可能性がないかについてもチェックを行う。上記（ａ）〜（ｃ）については、関数内の１ステートメント毎にチェック及びチェック結果の出力を実行する。
【００４４】
呼び出し先の関数のチェックが終了すると、呼び出し元の関数へ戻って、呼出し先の関数が戻してきた戻り値の値範囲情報を用いてチェックを継続する。即ち、プログラムＰＲＯＧ１１における矢印ＰＡＲＴ１２の部分においても、（ａ）変数の値範囲を算出し、（ｂ）仕様上の値範囲を逸脱していないかのチェックを行い、（ｃ）ランタイムエラーの可能性がないかについてもチェックを行う。上記（ａ）〜（ｃ）については、関数内の１ステートメント毎にチェック及びチェック結果の出力を実行する。このように、呼び出しが生じる前の関数のチェック及びチェック結果の出力に続き、呼び出し先の関数のチェックが行われる。呼び出し先の関数のチェックが終了すると、呼び出し元の関数へ戻ってチェックが継続される。このため、図９Ａにおいて説明した「一筆書き」のようにチェックが行われる場合だけでなく、呼び出しが生じ、また元へ戻る複数のプログラム間においても適切なプログラムチェックが行われることが期待できる。
【００４５】
なお、前述の表示手段３００への出力の場合に、「問題なし」と「警告」と「エラー」に応じて表示色を異ならせて、エラーの程度を一目瞭然に判るように表示しても良い。以上のように本実施形態によれば、従来においては人が行っていたソースプログラムのエラーチェックをプログラムによって実現することができ、ソースプログラムのエラーチェックを低コスト、短時間で行うことができ、人による作業工数を削減することができる。更に、人的ミスを排除できるので、ソースコードチェックにおける品質の安定化を図ることができる。
【００４６】
また、上記実施形態では、演算を行って変数の値範囲を求め、算出した変数の値範囲に基づいて（値範囲設定して）判定を行ったが、値範囲設定を行わずに判定を行うようにしても良い。即ち、値範囲設定して判定を行う場合には、高精度な解析を行うことができるが、値範囲設定に極めて多くの時間や手間を要する場合には、型の最大最小を値範囲と見做して解析を行うことで、精度は低下するが時間や手間を大きく削減することができる。
【符号の説明】
【００４７】
１１０  判定手段
１２０  出力制御手段
１３０  定義情報作成手段
１４０  演算数値規則情報作成手段
１５０  入力部
２００  データベース
２１０  定義情報ファイル
２２０  演算数値規則情報ファイル
３００  表示手段
【図１】
0006893752.tif 000002
【図２Ａ】
0006893752.tif 000003
【図２Ｂ】
0006893752.tif 000004
【図２Ｃ】
0006893752.tif 000005
【図３】
0006893752.tif 000006
【図４】
0006893752.tif 000007
【図５】
0006893752.tif 000008
【図６】
0006893752.tif 000009
【図７】
0006893752.tif 000010
【図８】
0006893752.tif 000011
【図９Ａ】
0006893752.tif 000012
【図９Ｂ】
0006893752.tif 000013
【図１０】
0006893752.tif 000014
【図１１】
0006893752.tif 000015
【図１２】
0006893752.tif 000016
【図１３】
0006893752.tif 000017
【図１４】
0006893752.tif 000018
【図１５】
0006893752.tif 000019