(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】6893752
(24)【登録日】2021年6月4日
(45)【発行日】2021年6月23日
(54)【発明の名称】プログラム検査装置及びプログラム検査用プログラム
(51)【国際特許分類】
G06F 11/36 20060101AFI20210614BHJP
【FI】
G06F11/36 104
【請求項の数】16
【全頁数】17
(21)【出願番号】特願2019-174721(P2019-174721)
(22)【出願日】2019年9月25日
(65)【公開番号】特開2021-51610(P2021-51610A)
(43)【公開日】2021年4月1日
【審査請求日】2020年2月21日
【新規性喪失の例外の表示】特許法第30条第2項適用 平成30年11月1日に東芝情報システム株式会社が発行した技術誌「Wave」で公開
【新規性喪失の例外の表示】特許法第30条第2項適用 平成30年11月26日に東芝情報システム株式会社が掲載したウエブサイトで公開
(73)【特許権者】
【識別番号】391016358
【氏名又は名称】東芝情報システム株式会社
(74)【代理人】
【識別番号】100090169
【弁理士】
【氏名又は名称】松浦 孝
(74)【代理人】
【識別番号】100074147
【弁理士】
【氏名又は名称】本田 崇
(74)【代理人】
【識別番号】100124497
【弁理士】
【氏名又は名称】小倉 洋樹
(72)【発明者】
【氏名】山中 明
(72)【発明者】
【氏名】横川 智良
【審査官】
松崎 孝大
(56)【参考文献】
【文献】
特開2012−22688(JP,A)
【文献】
特開2019−86953(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 11/36
(57)【特許請求の範囲】
【請求項1】
ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報と、前記ソースファイルに記載された演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報とが記憶されたデータベースと、
検査すべき関数を解析して演算のステップ毎に、前記定義情報と前記演算数値規則情報とを参照して当該演算が満たすべき条件を満たしているか否か判定する判定手段と、
この判定手段の判定結果を、情報を出力するための出力手段へ出力させる出力制御手段と
を具備し、
前記判定手段は、前記定義情報に基づきソースプログラムの複数の関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、または、第1のソースプログラムにおいて関数呼び出しが生じ第2のソースプログラムの呼び出し先関数を用いた処理を行った後に前記第1のプログラムへ戻って処理が行われる場合の前記第1のソースプログラムの関数と前記第2のソースプログラムの関数について、それぞれの関数に対応して変数の値範囲を算出し、算出した変数の値範囲について前記演算数値規則情報に基づき仕様上の値範囲を逸脱していないか判定を行うことを特徴とするプログラム検査装置。
【請求項2】
前記定義情報は、1つまたは複数のソースファイルにおける最上位の関数からその結果を用いる下位の関数を辿ることが可能なようにツリー状に作成されていることを特徴とする請求項1に記載のプログラム検査装置。
【請求項3】
前記判定手段は、前記定義情報に基づきソースプログラムの3つ以上の関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、それぞれの関数に対応して変数の値範囲を算出し、算出した変数の値範囲について前記演算数値規則情報に基づき仕様上の値範囲を逸脱していないか判定を行うことを特徴とする請求項1または2に記載のプログラム検査装置。
【請求項4】
前記演算数値規則情報は、変数の設計上の範囲値情報、関数呼び出し時の引数・戻り値範囲情報を含むことを特徴とする請求項1乃至3のいずれか1項に記載のプログラム検査装置。
【請求項5】
前記判定手段は、検査すべき関数を解析して演算のステップ毎に、演算を行って離散値を含む変数の値範囲を求めて、算出した変数の値範囲と、設計仕様上の値範囲とを比較し、判定を行うことを特徴とする請求項4に記載のプログラム検査装置。
【請求項6】
ソースファイルを解析し、ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報を作成してデータベースへ記憶する定義情報作成手段を具備することを特徴とする請求項1乃至5のいずれか1項に記載のプログラム検査装置。
【請求項7】
ソースファイルを解析し、このソースファイルに含まれる演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報を作成してデータベースへ記憶する演算数値規則情報作成手段を具備することを特徴とする請求項1乃至6のいずれか1項に記載のプログラム検査装置。
【請求項8】
前記判定手段は、検査すべき関数を解析して演算のステップ毎に、演算を行って変数の値範囲を求め、算出した変数の値範囲に基づいてランタイムエラー発生の有無の判定を行うことを特徴とする請求項1乃至7のいずれか1項に記載のプログラム検査装置。
【請求項9】
ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報と、前記ソースファイルに記載された演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報とが記憶されたデータベースを有し、このデータベースの情報を参照してコンピュータがソースファイルのプログラムの検査を行うプログラム検査装置の前記コンピュータを、
検査すべきソースファイルを解析して演算のステップ毎に、前記定義情報と前記演算数値規則情報とを参照して当該演算が満たすべき条件を満たしているか否か判定する判定手段、
この判定手段の判定結果を、情報を出力するための出力手段へ出力させる出力制御手段、
として機能させ、
更に、前記コンピュータを、前記判定手段として、
前記定義情報に基づきソースプログラムの複数の関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、または、第1のソースプログラムにおいて関数呼び出しが生じ第2のソースプログラムの呼び出し先関数を用いた処理を行った後に前記第1のプログラムへ戻って処理が行われる場合の前記第1のソースプログラムの関数と前記第2のソースプログラムの関数について、それぞれの関数に対応して変数の値範囲を算出し、算出した変数の値範囲について前記演算数値規則情報に基づき仕様上の値範囲を逸脱していないか判定を行うように機能させることを特徴とするプログラム検査用プログラム。
【請求項10】
前記定義情報は、1つまたは複数のソースファイルにおける最上位の関数からその結果を用いる下位の関数を辿ることが可能なようにツリー状に作成されていることを特徴とする請求項9に記載のプログラム検査用プログラム。
【請求項11】
前記コンピュータを前記判定手段として、前記定義情報に基づきソースプログラムの3つ以上の関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、それぞれの関数に対応して変数の値範囲を算出し、算出した変数の値範囲について前記演算数値規則情報に基づき仕様上の値範囲を逸脱していないか判定を行うように機能させることを特徴とする請求項9または10に記載のプログラム検査用プログラム。
【請求項12】
前記演算数値規則情報は、変数の設計上の範囲値情報、関数呼び出し時の引数・戻り値範囲情報を含むことを特徴とする請求項9乃至11のいずれか1項に記載のプログラム検査用プログラム。
【請求項13】
前記コンピュータを前記判定手段として、検査すべき関数を解析して演算のステップ毎に、演算を行って離散値を含む変数の値範囲を求めて、算出した変数の値範囲と設計仕様上の値範囲とを比較し、判定を行うように機能させることを特徴とする請求項12に記載のプログラム検査用プログラム。
【請求項14】
前記コンピュータを、
ソースファイルを解析し、ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報を作成してデータベースへ記憶する定義情報作成手段として機能させることを特徴とする請求項9乃至13のいずれか1項に記載のプログラム検査用プログラム。
【請求項15】
前記コンピュータを、
ソースファイルを解析し、このソースファイルに含まれる演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報を作成してデータベースへ記憶する演算数値規則情報作成手段として機能させることを特徴とする請求項9乃至14のいずれか1項に記載のプログラム検査用プログラム。
【請求項16】
前記コンピュータを前記判定手段として、検査すべき関数を解析して演算のステップ毎に、演算を行って変数の値範囲を求めて、算出した変数の値範囲に基づいてランタイムエラー発生の有無の判定を行うように機能させることを特徴とする請求項9乃至15のいずれか1項に記載のプログラム検査用プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
この発明は、プログラム検査装置及びプログラム検査用プログラムに関するものである。
【背景技術】
【0002】
従来、ソースプログラムに含まれる演算に関する検査を行う場合には、プログラムの設計段階で各変数の採り得る値範囲を設計し、プログラムの実行中に各変数への入力が設計仕様上の値範囲を超えること(設計仕様上の値範囲からの逸脱)がないか、更に、それらの値範囲を使用して演算時にオーバーフロー、アンダーフロー、ゼロ割(除数が0である割算)の発生がないかを、目視(レビュー・若しくは机上)で検査していた。
【0003】
このため、膨大な量のソースプログラムの検査を人が目視で行うことになり、膨大な時間とコストが発生することになっていた。また、プログラマーの技術力に差があるため、検査品質にバラツキが生じるという問題があった。
【0004】
一方、特許文献1には、ソースコードの脆弱性検査において、脆弱性を有する部分を精度良く検出でき、且つ、プログラマーによるソースコード検査の作業負担を減らすことができるようにするための技術が開示されている。
【0005】
また、特許文献2には、大域変数のアドレスを格納する処理を検出し、格納された変数を用いた大域変数の参照、代入を解析対象とすることで、大域変数の名前のみに基づく解析よりも大域変数に対する参照、代入についての詳細な解析結果を提供することが開示されている。更に、上述の解析結果を用いて、大域変数とそのアドレスが格納された変数との関係を視覚的に表示することができる技術が開示されている。
【0006】
更に、特許文献3には、変数の代入文における変数型条件の検査を行い、プログラム誤りを検出するものが開示されている。
【0007】
しかしながら、特許文献1のものは、関数間の引数の遷移を追跡するだけに留まっており、その引数が設計通りの範囲にあるのかなどを検出できるものではない。また、特許文献2のものは、各変数が採り得る値が設計の範囲内であるかを判定するものではない。更に、特許文献3のものは、変数型の検査に留まっており、演算を続けることにより変数値の範囲が設計の範囲に留まっているかなどのように、実行時エラーを的確に検査できるものではない。
【先行技術文献】
【特許文献】
【0008】
【特許文献1】特開2007−52625号公報
【特許文献2】特開2010−191598号公報
【特許文献3】特開平7−152601号公報
【発明の概要】
【発明が解決しようとする課題】
【0009】
実施形態では、演算が連続して行われ、結果が継承されて行くような場合においても的確にプログラムができているかを検査することを可能とする。
【課題を解決するための手段】
【0010】
実施形態に係るプログラム検査装置は、ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報と、前記ソースファイルに記載された演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報とが記憶されたデータベースと、検査すべきソースファイルを解析して演算のステップ毎に、前記定義情報と前記演算数値規則情報とを参照して当該演算が満たすべき条件を満たしているか否か判定する判定手段と、この判定手段の判定結果を、情報を出力するための出力手段へ出力させる出力制御手段とを具備
し、前記判定手段は、前記定義情報に基づきソースプログラムの複数の関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、または、第1のソースプログラムにおいて関数呼び出しが生じ第2のソースプログラムの呼び出し先関数を用いた処理を行った後に前記第1のプログラムへ戻って処理が行われる場合の前記第1のソースプログラムの関数と前記第2のソースプログラムの関数について、それぞれの関数に対応して変数の値範囲を算出し、算出した変数の値範囲について前記演算数値規則情報に基づき仕様上の値範囲を逸脱していないか判定を行うことを特徴とする。
【図面の簡単な説明】
【0011】
【
図1】本発明に係るプログラム検査装置の実施形態を示すブロック図。
【
図2A】本発明に係るプログラム検査装置の実施形態の検査対象に係る1つの処理またはプロジェクトのツリー構成を示す図。
【
図2B】本発明に係るプログラム検査装置の実施形態の検査対象に係る3つの処理またはプロジェクトのツリー構成とソースファイルの関係の一例を示す図。
【
図2C】本発明に係るプログラム検査装置の実施形態に備えられる定義情報ファイルの内容を示す図。
【
図3】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの元の情報が記載されたソースプログラムを示す図。
【
図4】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの内容を示す図。
【
図5】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの内容であるグローバル変数が記載されたソースプログラムを示す図。
【
図6】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの内容であり、グローバル変数に関する部分を示す図。
【
図7】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの内容である内部変数とスタティック変数が記載されたソースプログラムを示す図。
【
図8】本発明に係るプログラム検査装置の実施形態に備えられる演算数値規則情報ファイルの内容であり、内部変数とスタティック変数に関する部分を示す図。
【
図9A】本発明に係るプログラム検査装置の実施形態により行われるプログラム検査動作のフローチャート。
【
図9B】本発明に係るプログラム検査装置の実施形態の検査対象に係る1つの処理またはプロジェクトのツリー構成において、実施形態により行われるプログラム検査動作の一連の追行手順を示す図。
【
図10】本発明に係るプログラム検査装置の実施形態により行われる第1のプログラム検査動作と出力結果の説明図。
【
図11】本発明に係るプログラム検査装置の実施形態により行われる第2のプログラム検査動作と出力結果の説明図。
【
図12】本発明に係るプログラム検査装置の実施形態により行われる第3のプログラム検査動作と出力結果の説明図。
【
図13】本発明に係るプログラム検査装置の実施形態により行われる第4のプログラム検査動作と出力結果の説明図。
【
図14】本発明に係るプログラム検査装置の実施形態により行われる第5のプログラム検査動作と出力結果の説明図。
【
図15】本発明に係るプログラム検査装置の実施形態により行われる第6のプログラム検査動作と出力結果の説明図。
【発明を実施するための形態】
【0012】
以下添付図面を参照して、本発明に係るプログラム検査装置及びプログラム検査用プログラムの実施形態を説明する。各図において、同一の構成要素には同一の符号を付して重複する説明を省略する。
図1に、第1の実施形態に係るプログラム検査装置を示す。この実施形態に係るプログラム検査装置は、データベース200とCPU(中央処理装置)100と、キーボード等の情報入力を行うための入力部150、情報を出力する出力手段としての表示手段300とを備えている。即ち、プログラム検査装置は、ワークステーション、サーバ、パーソナルコンピュータ等のコンピュータ装置によって構成することができる。
【0013】
データベース200には、定義情報ファイル210と演算数値規則情報ファイル220とが設けられている。定義情報ファイル210は、ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報を有するものである。
【0014】
定義情報は、以下のように、1つまたは複数のソースファイルにおける最上位の関数からその結果を用いる下位の関数を辿ることが可能なようにツリー状に作成されている。例えば、
図2Aに示されるような解析対象のプログラムが1つの処理またはプロジェクトであるとき、エントリーポイントA(EntryPointA)へ処理がジャンプするとき、関数A1(FuncA1)〜関数A8(FuncA8)により構成され、また、矢印により示されるようにツリー状に関数が結合されている場合には、関数A1(FuncA1)から最下位の関数A3(FuncA3)、関数A8(FuncA8)、関数A6(FuncA6)、関数A7(FuncA7)を辿ることが可能に定義情報が構成されている。上記において、最上位関数は、関数A1(FuncA1)である。
【0015】
次に、ソースファイルとプロジェクト(処理)とは必ずしも一致しないことを説明する。例えば、
図2Bに示すように、エントリーポイントA(EntryPointA)により始まるプロジェクトAAと、エントリーポイントB(EntryPointB)により始まるプロジェクトBBと、エントリーポイントC(EntryPointC)により始まるプロジェクトCCとが存在するプログラムがあるとする。例えば、3つのセンサにより所定事象が生じることを検出しており、図示しない事象SAが生じるとエントリーポイントA(EntryPointA)からの処理が開始され、図示しない事象SBが生じるとエントリーポイントB(EntryPointB)からの処理が開始され、図示しない事象SCが生じるとエントリーポイントC(EntryPointC)からの処理が開始される如く処理が行われるプログラムである。この
図2Bにおいて、ソースファイルの区切りを破線により示す。即ち、ソースファイルは、1つのプロジェク内に留まらず、2つ以上のプロジェクトに跨って存在する場合もある。例えば、関数B2(FuncB2)、関数B4(FuncB4)、関数C2(FuncC2)、関数C4(FuncC4)は2つのプロジェクトに跨っている。また、例えば、関数A5(FuncA5)、関数B5(FuncB5)、関数C3(FuncC3)、関数C5(FuncC5)は3つのプロジェクトに跨っている。このような場合においても、定義情報は前述の通り、「1つまたは複数のソースファイルにおける最上位の関数からその結果を用いる下位の関数を辿ることが可能なようにツリー状に作成されている」。
【0016】
定義情報ファイル210は、例えば、
図2Cに示されるように、関数が含まれている「ソースファイル名」と、その関数の「位置」(ソースプログラムの何行目)と、引数を含む「関数名」と、「ツリー情報」とが対応付けられて記憶されている。「ツリー情報」は、上位側の関数の結果を用いて当該関数が演算を行う場合における関係を示す情報である。従って、
図2Cの第1欄の関数が最上位の関数であり、第2欄の関数が第1欄の結果を受けて演算を行う関数であり、第3欄の関数が第2欄の結果を受けて演算を行う関数であり、・・・と続く場合には、第1欄の「ツリー情報」には下位の関数名(第2欄の関数名)とその位置情報が記載され、第2欄の「ツリー情報」には上位の関数名(第1欄の関数名)とその位置情報及び下位の関数名(第3欄の関数名)とその位置情報が記載され、第3欄の「ツリー情報」には上位の関数名(第2欄の関数名)とその位置情報及び下位の関数名(第X欄の関数名)とその位置情報が記載され、・・・と続く。上記で第X欄とは、
図2Cの定義情報ファイル210には、例えば位置情報である行番号の順に、欄が作成されるため、必ずしも連続した欄にツリー状に続く関数の情報が配置されるとは限らないためである。また、ツリー状に続かない関数に関しては、「ツリー情報」は記載されない。
【0017】
本実施形態では、定義情報作成手段130が設けられており、検査対象のソースファイルを解析し、ソースファイルを識別するソースファイル名と、そのソースファイルに含まれている関数の関数名とを対応付けた定義情報ファイル210を作成してデータベース200へ記憶する。この定義情報ファイル210については、入力部150からオペレータが入力しても良く、また、
図2Cに示した如くテーブル化したファイルを記憶媒体に用意し、これを図示しない記憶媒体読取装置により読み取りデータベース200へ転送するようにしても良い。定義情報作成手段130は、抽象構文木作成機能を有し、この抽象構文木作成機能を用いて上記関数をツリー状に辿るための「ツリー情報」を作成するように構成することができる。
【0018】
また、演算数値規則情報ファイル220は、演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報のファイルである。この演算数値規則情報は、変数の設計上の範囲値情報、関数呼び出し時の引数・戻り値範囲情報を含むものである。
【0019】
例えば、ソースファイル名が
図3に示される「src/main.c」であるソースプログラムに
図3に示される引数param1、param2、param3の範囲及び戻り値returnの範囲が記載されているとき、この記載に基づき、
図4に示す引数・戻り値範囲情報のファイルを作成して記憶することができる。即ち、
図1に示されるように、このプログラム検査装置には、ソースファイルを解析し、このソースファイルに含まれる演算に係る数値に関するプログラム上の規則情報と関数名とを対応付けた演算数値規則情報ファイル220を作成してデータベース200へ記憶する演算数値規則情報作成手段140が具備されている。勿論、この演算数値規則情報ファイル220については、入力部150からオペレータが入力しても良く、また、
図4に示した如くテーブル化したファイルを記憶媒体に用意し、これを図示しない記憶媒体読取装置により読み取りデータベース200へ転送するようにしても良い。
【0020】
この演算数値規則情報ファイル220の演算数値規則情報としては、変数の設計上の範囲値情報として、グローバル変数がある。例えば、
図5に示されるように、ソースファイル名が「src/sub1.c」であるソースプログラムに、g_value1〜g_value4というグローバル変数があり、図示しない他の記載箇所で変数の値範囲が、g_value1では「0,1」、g_value2では「1〜10」、g_value3では「1〜10,100」、g_value4では「0x01,0x02,0x04,0x08」と記載されているものとする。
【0021】
上記記載に基づき、
図6に示されるように、グローバル変数の設計上の範囲値情報をテーブル化して演算数値規則情報ファイル220を作成してデータベース200へ記憶する。この処理は、演算数値規則情報作成手段140が行っても良く、入力部150からオペレータが入力しても良く、また、テーブル化したファイルを記憶媒体に用意し、データベース200へ転送するようにしても良い。
【0022】
更に、この演算数値規則情報ファイル220の演算数値規則情報としては、変数の設計上の範囲値情報として、内部変数とスタティック変数がある。例えば、
図7に示されるように、ソースファイル名が「src/sub2.c」であるソースプログラムの、2行目に内部変数iを含む「int i」という記述があり、3行目に内部変数jを含む「char j」という記述があり、5行目にスタティック変数kを含む「static int k」という記述があり、6行目にスタティック変数lを含む「static short l」という記述があり、図示しない他の記載箇所で変数の値範囲が、「int i」のiでは「0〜10」、「char j」のjでは「0x00,0x01,0x02,0x04,0x08」、「static int k」のkでは「0,1」、「static short l」のlでは「0x0000〜0x1FFF」と記載されているものとする。
【0023】
上記記載に基づき、
図8に示されるように、内部変数とスタティック変数の設計上の範囲値情報をテーブル化して演算数値規則情報ファイル220を作成してデータベース200へ記憶する。この処理は、演算数値規則情報作成手段140が行っても良く、入力部150からオペレータが入力しても良く、また、テーブル化したファイルを記憶媒体に用意し、データベース200へ転送するようにしても良い。
【0024】
CPU100には、判定手段110が備えられている。判定手段110は、検査すべきソースファイルを解析して演算のステップ毎に、上記定義情報ファイル210の定義情報と上記演算数値規則情報ファイル220の演算数値規則情報を参照して当該演算が満たすべき条件を満たしているか否か判定するものである。また、判定手段110は後に説明するように、検査すべき関数を解析して演算のステップ毎に、演算を行って変数の値範囲を求め、算出した変数の値範囲に基づいてランタイムエラー発生の有無の判定を行う。
【0025】
より具体的には、判定手段110は、上記定義情報に基づきソースプログラムの関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について演算を行って、演算のステップ毎に、離散値を含む変数の値範囲を求めて、算出した変数の値範囲について上記演算数値規則情報に基づき判定(判定処理1という)を行う。更に、それらの値範囲を使用して演算時にオーバーフロー、アンダーフロー、ゼロ割(除数が0である割算)といったランタイムエラーの発生がないかを判定する(判定処理2という)。
【0026】
更に、CPU100には、出力制御手段120が備えられている。出力制御手段120は、上記の判定手段の判定結果を、情報を出力するための出力手段として例示されている表示手段300へ出力させるものである。
【0027】
以上のように構成されたプログラム検査装置は、
図9Aのフローチャートに示すようにプログラム検査を行う。まず、検査対象のプログラムを解析し、定義情報と演算数値規則情報とのファイルを作成しデータベース200へ記憶するか、または検査対象のプログラムから定義情報と演算数値規則情報とに関するテーブル情報を得て、定義情報と演算数値規則情報とのファイルへ変換しデータベース200へ記憶する(S11)。
【0028】
次に、上記定義情報に基づきソースプログラムの関数をツリー状に辿りながら最上位の関数から下位の関数に到るまでの関数について、変数の値範囲を算出し、算出した変数の値範囲について上記演算数値規則情報に基づき判定(判定処理1という)を行って結果を出力する(S12)。
【0029】
例えば、
図10に示すように、プログラムPROG1において引数a1,b1を用いて関数Func1により演算を行った結果、得られたa2,b2がプログラムPROG1の下位のプログラムPROG2において用いられ、プログラムPROG2において引数a2,b2を用いて関数Func2により演算を行った結果、得られたa3,b3がプログラムPROG2の下位のプログラムPROG3において用いられる場合を説明する。
【0030】
上記のようにツリー状に関数を辿るための情報は既に説明した通り、定義情報ファイル210に存在している。最上位の関数に関する引数、戻り値の範囲は、演算数値規則情報ファイル220に存在しており、
図10ではH1に記述されているものであるから、この引数と戻り値の範囲から関数Func1により演算を行い、その結果、得られた値a2,b2がR1に示された通りとなるか検査する。更に、このR1の値から下位の関数Func2の引数と戻り値の範囲がH2に示すような値となるかを検査する。更に、H2の引数と戻り値の範囲から関数Func2により演算を行い、その結果、得られた値a3,b3がR2に示された通りとなるか検査する。更に、このR2の値から下位の関数Func3の引数と戻り値の範囲がH3に示すような値となるかを検査する。結果の出力としては、
図10の表示におけるR1、R2、H1、H2、H3の位置に、適正または不適正を表示する例を挙げることができる。
【0031】
以上のようなツリー状に関数を辿って行うことができる判定処理1を、ツリー状に結合された1つの関数において行ったかを検出し(S13)、当該関数において他にも判定処理1を行うべきであればステップS12へ戻って処理を行う。一方、判定処理1を行うべきものが関数において無くなると、ステップS14へ進む。
【0032】
ステップS14においては、検査対象プログラムを解析し、演算のステップ毎に演算して変数を求め、呼出し先関数の変数値範囲を演算数値規則情報から得て対比し判定(判定処理2)を1つの関数において行って結果を出力する(S14)。このステップS14において、ランタイムエラー発生の有無の判定を行っている。
【0033】
判定処理2の具体例を説明する。
図11には、演算として、「c=a/b」、「d=a/b」、「*p=−1」、について検査を行う例を示す。まず、「c=a/b」については、変数a、bが、この関数より上位の位置に示されており、演算数値規則情報ファイル220に存在している。ここでbは、「−10≦b≦10」であるから、「0」を含む。このため、ゼロ除算の可能性があることを警告表示する。「d=a/b」については、「if(b>0)」における演算であるからゼロ除算の可能性がなく、「問題無し」と判定して出力する。「d=a/b」については、0から10までの値を取り得るので、変数dの範囲「0≦d≦5」に対してオーバーフローとなる可能性を警告出力する。「*p=−1」では、ポインタpは、それが指し示している配列の範囲外を指していることから、警告を出力する。
【0034】
図12の例は、コンピュータが判定手段110として、ランタイムエラーを検査した場合の例を示す。演算として、「c=a/b」、「d=a/b」、「c=a*b」について検査を行う例を示す。まず、「c=a/b」については、変数a、bが、この関数より上位の位置に示されており、演算数値規則情報ファイル220に存在している。ここでbは、「−10≦b≦10」であるから、「0」を含む。このため、ゼロ除算の可能性があり、ランタイムエラー発生の可能性があることを警告出力する。
【0035】
「d=a/b」については、「if(b>0)」における演算であるからゼロ除算の可能性がなく、「ランタイムエラー無し」を出力する。「c=a*b」における「a*b」については、int型の範囲であり、「ランタイムエラー無し」を出力する。「c=a*b」については、演算数値規則情報ファイル220に存在している変数aの範囲(0≦a≦10)と、変数bの範囲(−10≦b≦10)から(−100≦a*b≦100)となり、変数cの範囲(0≦c≦10)に対し、オーバーフローとアンダーフローの可能性があり、ランタイムエラー発生の可能性があることを警告出力する。
【0036】
図13は、プログラム構文や文法上のエラーや、変数値範囲定義の不整合、ランタイムエラーを検査した場合の例を示す。プログラム構文や文法上のエラーに関する規則等の情報についても、その規則情報が演算数値規則情報ファイル220に存在しているものとする。そして判定手段110は、ソースプログラムの構文解析、字句解析など行い、上記演算数値規則情報ファイル220に存在しているプログラム構文や文法上のエラーに関する規則等の情報に基づき規則等に従ったプログラムとなっているかを判定する。
【0037】
この
図13において検査対象となっているのは、変数値範囲の指定文である「extern int GetIndex( )」、変数値範囲の定義文である「/* i,min:0,max:99*/」、「*p=−1」、「i=GetIndex( )」、「*(p−i−1)=1」、について検査を行う例を示す。
【0038】
「extern int GetIndex( )」については、「GetIndex」に続く、括弧内に入るべき変数値範囲の指定が記述されておらず、漏れがあることを示す警告出力を行うものである。次の「/* i,min:0,max:99*/」については、設計書により演算数値規則情報ファイル220に記載の定義「min:50,max:99」と相違しており、変数値範囲の不整合があることを示すエラー出力を行うものである。「*p=−1」については、
図12の例と同じく、配列の範囲外であり、その警告を出力する。
【0039】
「i=GetIndex( )」については、「GetIndex」に続く、括弧内に入るべき関数戻り値範囲の指定が記述されておらず、関数戻り値をint型の最大最小とみなすことから、値範囲が設定された変数iへの代入においてオーバーフローとアンダーフローの可能性があり、ランタイムエラー発生の可能性があることを示す警告出力を行うものである。「*(p−i−1)=1」、については、変数iが設計仕様上の値範囲に収まっている場合は問題ないが、GetIndex( )の戻り値を代入していることから、(p−i−1)の結果が配列の範囲外を指す可能性があるため、その警告を出力する。
【0040】
図14は、常に真または偽になるコードを検出し、また、到達不能コードの検出を行う例を示したものである。
図14における「if(4!=TestIndex(4))」は常に真となるステートメントであり、エラーであることが出力される。また、
図14の「if(5!=TestIndex(5))」は、「if(4!=TestIndex(4))」が常に真であり、次の「goto fail」とならず、到達不能コードであり、エラーであることが出力される。
【0041】
以上の例の如き、「判定処理2」が
図9AのステップS14において行われ、判定処理2を当該1の関数について行ったかを検出し(S15)、当該1の関数において他にも判定処理2を行うべき対象があればステップS14へ戻って処理を行う。一方、判定処理2を行うべき対象が無くなると、エンドとなる。以上のような動作は、
図9Bに示すようにエントリーポイントA(EntryPointA)により始まるプロジェクトAAにおいては、一点鎖線により示される如く一筆書きで各関数毎に行われる。つまり、
図9Aに示されているフローチャートに対応するプログラムによる処理が関数毎に、関数A1(FuncA1)→関数A2(FuncA2)→関数A3(FuncA3)→(関数A2(FuncA2))→関数A8(FuncA8)→(関数A2(FuncA2))→(関数A1(FuncA1))→関数A4(FuncA4)→関数A5(FuncA5)→関数A6(FuncA6)→(関数A5(FuncA5))→関数A7(FuncA7)→(関数A5(FuncA5))→(関数A4(FuncA4))→(関数A1(FuncA1))と、順次に繰り返し解析が実行される。
【0042】
次に、
図15に示すように、プログラムPROG11において関数呼び出しが生じ、プログラムPROG21の呼び出し先関数を用いた処理を行った後にプログラムPROG11へ戻って処理が行われる場合の解析と判定について説明する。プログラムPROG11では、関数に関する引数、戻り値の範囲は、演算数値規則情報ファイル220に存在しており、
図15ではH11に記述されているものである。そこで、プログラムPROG11における矢印PART11の部分においては、(a)変数の値範囲を算出し、(b)仕様上の値範囲を逸脱していないかのチェックを行い、(c)ランタイムエラーの可能性がないかについてもチェックを行う。上記(a)〜(c)については、関数内の1ステートメント毎にチェック及びチェック結果の出力を実行する。
【0043】
プログラムPROG11の「Func2(a2,b2)」において関数呼び出しによりプログラムPROG21へ遷移して、解析・判定が実行される。遷移の際に引数の値範囲情報を引き渡す。プログラムPROG21では、関数に関する引数、戻り値の範囲は、演算数値規則情報ファイル220に存在しており、
図15ではH21に記述されているものである。プログラムPROG21における矢印PART21の部分においても、(a)変数の値範囲を算出し、(b)仕様上の値範囲を逸脱していないかのチェックを行い、(c)ランタイムエラーの可能性がないかについてもチェックを行う。上記(a)〜(c)については、関数内の1ステートメント毎にチェック及びチェック結果の出力を実行する。
【0044】
呼び出し先の関数のチェックが終了すると、呼び出し元の関数へ戻って、呼出し先の関数が戻してきた戻り値の値範囲情報を用いてチェックを継続する。即ち、プログラムPROG11における矢印PART12の部分においても、(a)変数の値範囲を算出し、(b)仕様上の値範囲を逸脱していないかのチェックを行い、(c)ランタイムエラーの可能性がないかについてもチェックを行う。上記(a)〜(c)については、関数内の1ステートメント毎にチェック及びチェック結果の出力を実行する。このように、呼び出しが生じる前の関数のチェック及びチェック結果の出力に続き、呼び出し先の関数のチェックが行われる。呼び出し先の関数のチェックが終了すると、呼び出し元の関数へ戻ってチェックが継続される。このため、
図9Aにおいて説明した「一筆書き」のようにチェックが行われる場合だけでなく、呼び出しが生じ、また元へ戻る複数のプログラム間においても適切なプログラムチェックが行われることが期待できる。
【0045】
なお、前述の表示手段300への出力の場合に、「問題なし」と「警告」と「エラー」に応じて表示色を異ならせて、エラーの程度を一目瞭然に判るように表示しても良い。以上のように本実施形態によれば、従来においては人が行っていたソースプログラムのエラーチェックをプログラムによって実現することができ、ソースプログラムのエラーチェックを低コスト、短時間で行うことができ、人による作業工数を削減することができる。更に、人的ミスを排除できるので、ソースコードチェックにおける品質の安定化を図ることができる。
【0046】
また、上記実施形態では、演算を行って変数の値範囲を求め、算出した変数の値範囲に基づいて(値範囲設定して)判定を行ったが、値範囲設定を行わずに判定を行うようにしても良い。即ち、値範囲設定して判定を行う場合には、高精度な解析を行うことができるが、値範囲設定に極めて多くの時間や手間を要する場合には、型の最大最小を値範囲と見做して解析を行うことで、精度は低下するが時間や手間を大きく削減することができる。
【符号の説明】
【0047】
110 判定手段
120 出力制御手段
130 定義情報作成手段
140 演算数値規則情報作成手段
150 入力部
200 データベース
210 定義情報ファイル
220 演算数値規則情報ファイル
300 表示手段