(57)【要約】【課題】プログラム開発者が定義する操作について、構造的な誤りを検出できるプログラム検査装置を得る。【解決部】派生クラスが使用する特定の操作が実行すべき他の操作の識別情報と当該特定の操作の識別情報との組が記載された応用規約情報を参照して、検査対象となる応用ソフトウエア１５で定義される派生クラスのうち、応用規約情報に記載された特定の操作を備える派生クラスを検出する検出部１１と、検出部１１が検出した派生クラスが備える特定の操作と当該特定の操作に対応する応用規約情報とに基づいて、検出部１１により検出された派生クラス内で特定の操作が応用規約情報に記載された他の操作を実行するように記述されているか否かを検査する検査実施部１２とを備え、検出部１１が検査実施部１２の検査結果を出力する。【選択図】        図１
2005025319.tif 000002
【特許請求の範囲】
【請求項１】
ミドルウエアが備えているクラスを継承する派生クラスが定義されている応用ソフトウエアを検査するプログラム検査装置において、
派生クラスが使用する第１の操作が実行すべき第２の操作の識別情報と当該第１の操作の識別情報との組が記載された応用規約情報を参照して、
検査対象となる応用ソフトウエアで定義される派生クラスのうち、前記応用規約情報に記載された第１の操作を備える派生クラスを検出する検出手段と、
前記検出手段が検出した派生クラスが備える前記第１の操作と当該第１の操作に対応する応用規約情報とに基づいて、前記検出手段により検出された派生クラス内で第１の操作が応用規約情報に記載された前記第２の操作を実行するように記述されていることを検査する検査実施手段と、
前記検査実施手段の検査結果を出力する出力手段とを備えたプログラム検査装置。
【請求項２】
ミドルウエアが備えているクラスを継承する派生クラスが定義されている応用ソフトウエアを検査するプログラム検査装置において、
派生クラスが使用する第１の操作が実行すべきでない第２の操作の識別情報と当該第１の操作の識別情報との組が記載された応用規約情報を参照して、
検査対象となる応用ソフトウエアで定義される派生クラスのうち、前記応用規約情報に記載された第１の操作を備える派生クラスを検出する検出手段と、
前記検出手段が検出した派生クラスが備える前記第１の操作と当該第１の操作に対応する応用規約情報とに基づいて、前記検出手段により検出された派生クラス内で第１の操作が応用規約情報に記載された前記第２の操作を実行するように記述されていないことを検査する検査実施手段と、
前記検査実施手段の検査結果を出力する出力手段とを備えたプログラム検査装置。
【請求項３】
ミドルウエアが備えている第１の操作が再定義されている応用ソフトウエアを検査するプログラム検査装置において、
応用ソフトウエア中で第１の操作が再定義されるなら前記第１の操作と共に再定義されるべき第２の操作の識別情報が記載された応用規約情報を参照して、
検査対象となる応用ソフトウエアで定義されるクラスのうち、前記応用規約情報に記載された第１の操作を再定義するクラスを検出する検出手段と、
前記検出手段が検出したクラスが、前記応用規約情報に記載された第１の操作と共に第２の操作を定義しているか否かを検査する検査実施手段と、
前記検査実施手段の検査結果を出力する出力手段とを備えたプログラム検査装置。
【請求項４】
ミドルウエアが備えている操作が再定義されている応用ソフトウエアを検査するプログラム検査装置において、
応用ソフトウエア内で再定義された操作が参照すべきでない変数の識別情報が記載された応用規約情報を参照して、
検査対象となる応用ソフトウエアで再定義される操作のうち、前記応用規約情報に記載された操作を検出する検出手段と、
前記検出手段が検出した操作が、前記応用規約情報に記載された変数を参照していないかどうかを検査する検査実施手段と、
前記検査実施手段の検査結果を出力する出力手段とを備えたプログラム検査装置。
【請求項５】
ミドルウエアが備えている操作が再定義されている応用ソフトウエアを検査するプログラム検査装置において、
応用ソフトウエア内で再定義された操作が書き換えるべきでない変数の識別情報が記載された応用規約情報を参照して、
検査対象となる応用ソフトウエアで再定義される操作のうち、前記応用規約情報に記載された操作を検出する検出手段と、
前記検出手段が検出した操作が、前記応用規約情報に記載された変数を書き換えていないかどうかを検査する検査実施手段と、
前記検査実施手段の検査結果を出力する出力手段とを備えたプログラム検査装置。
【発明の詳細な説明】
【０００１】
従来のオブジェクト指向プログラミング支援装置には、プログラム開発者が定義した操作が、スーパークラスで定義されている操作を再定義する操作であるか、サブクラスで再定義される操作であるかを一目で把握することができるようにするために、既存のクラスの情報および作成中のクラスの情報を蓄積するクラス情報ＤＢを利用して、プログラム開発者が定義した操作がスーパークラスで定義されているいずれの操作を再定義するものであるか、また、該操作がいずれのサブクラスで再定義される操作であるかを表示するものがある。これによって、プログラム開発者による再定義誤りを検査している。例えば、特許文献１はこの種のオブジェクト指向プログラミング支援装置を開示している。
【０００２】
【特許文献１】
特開２００２−１０８６１２号公報（第１図）
【０００３】
【発明が解決しようとする課題】
上記のような従来のオブジェクト指向プログラミング支援装置による検査では、プログラム開発者が定義する操作の識別情報を字句上で照合する検査に頼っていた。したがって、検出できる誤りが単純なスペルミスまたは意図しない再定義等の字句的な誤りに限定されており、意味的あるいは構造的な誤りについては検出できないという課題があった。
【０００４】
この発明は上記のような課題を解決するためになされたもので、プログラム開発者が定義する操作について、構造的な誤りを検出できるプログラム検査装置を得ることを目的とする。
【０００５】
【課題を解決するための手段】
この発明に係るプログラム検査装置は、派生クラスが使用する第１の操作が実行すべき第２の操作の識別情報と当該第１の操作の識別情報との組が記載された応用規約情報を参照して、検査対象となる応用ソフトウエアで定義される派生クラスのうち、応用規約情報に記載された第１の操作を備える派生クラスを検出する検出手段と、検出手段が検出した派生クラスが備える第１の操作と当該第１の操作に対応する応用規約情報とに基づいて、検出手段により検出された派生クラス内で第１の操作が応用規約情報に記載された第２の操作を実行するように記述されていることを検査する検査実施手段と、検査実施手段の検査結果を出力する出力手段とを備えたものである。
【０００６】
【発明の実施の形態】
実施の形態１．
図１はこの発明の実施の形態１によるプログラム検査装置のブロック図である。図に示すように、プログラム検査装置１０は検出部（検出手段、出力手段）１１、検査実施部（検査実施手段）１２、応用規約情報ＤＢ１３を備える。ミドルウエア１４は、種々の応用ソフトウエアに応用され得る共通機能を持つクラスの集合体である。ここではＪＡＶＡ（登録商標、以下同じ）言語において標準で用意されているクラスの集合体をミドルウエア１４として説明する。応用ソフトウエア１５はミドルウエア１４の継承に基づく差分定義によってユーザにより作成されたプログラム等の集合である。
【０００７】
図２は応用ソフトウエア１５に含まれるプログラムの例を示す図である。図に示すように、このプログラムではＪＡＶＡ言語において標準で用意されているｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔクラスを継承するＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスが定義されている（行２−１）。このＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスは操作ｐａｉｎｔ（ｊａｖａ（登録商標、以下同じ）．ａｗｔ．Ｇｒａｐｈｉｃｓ）を再定義し（行２−２）、この操作は３つの操作ｐａｉｎｔＣｏｍｐｏｎｅｎｔ（ｇ）、ｐａｉｎｔＢｏｒｄｅｒ（ｇ）  、ｐａｉｎｔＣｈｉｌｄｒｅｎ（ｇ）を実行する（行２−３）。ＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスはまた操作ｐａｉｎｔＣｏｍｐｏｎｅｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）  を再定義し（行２−４）、この操作はｇ．ｄｒａｗＯｖａｌ（０，  ０，  ｇｅｔＷｉｄｔｈ（），  ｇｅｔＨｅｉｇｈｔ（））  を実行する（行２−５）。
【０００８】
ＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスはｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔクラスを継承している。したがって、ＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスは継承元であるｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔクラスが備える操作をすべて備えることになる。例えば、ｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔクラスには標準で操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）が定義されているため、図２には操作ｐａｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃ）、ｐａｉｎｔＣｏｍｐｏｎｅｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）しか定義されていないが、ＯｖａｌＣｏｍｐｏｎｅｎｔクラスは操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）も備えていることになる。また、ｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔクラスには標準で操作ｐａｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）が定義されているためＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスもｐａｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）を備えるが、ここではＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスが再定義していることになる。
【０００９】
ｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔクラスに標準で定義される操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）は、その中で操作ｐａｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）を実行するように定義されている。したがって、ユーザが不用意にＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスで操作ｐａｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）を再定義すると、ＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスが備える操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）が正しく動作しなくなる場合がある。つまり、継承元のクラスが備える操作を継承先のクラスで不用意に再定義すると、意図しない別の操作の動作が変更されてしまう場合がある。
【００１０】
このような現象に起因する不具合は発覚が遅れやすい不具合の１つである。この実施の形態１によるプログラム検査装置１０は、このような不具合を検出する装置である。
【００１１】
図１の応用規約情報ＤＢ１３は、ユーザがミドルウエア１４を利用して応用ソフトウエア１５を作成する上で守るべき規約が記載された応用規約情報ファイルを格納する。具体的には、応用規約情報にはユーザによって応用ソフトウエア１５で定義される、ミドルウエア１４が備えているクラスを継承する派生クラスが使用する特定の操作（第１の操作）が実行すべき他の操作（第２の操作）、当該特定の操作および派生クラスの識別情報が記載されている。
【００１２】
図３は応用規約情報の例を示す図である。図において、ＳＷＩＮＧ−Ｃ０００１−Ｒ０００１（行３−１）は規約名を示す。この規約はＪＡＶＡが持つｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔクラスを継承する派生クラスが備える操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）（行３−２）に関する規約である。すなわち、ユーザによって応用ソフトウエア１５で定義される、ミドルウエア１４が備えているｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔクラスを継承する派生クラスが使用する操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）が、３つの他の操作ｐｒｉｎｔＣｏｍｐｏｎｅｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）  （行３−３）、ｐｒｉｎｔＢｏｒｄｅｒ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）（行３−４）、ｐｒｉｎｔＣｈｉｌｄｒｅｎ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）（行３−５）を実行しなければならないことを表す。応用規約情報はミドルウエア１４に関する知識を有するものによって、特定の操作と共に実行すべき他の操作を判断され、事前に記載される。
【００１３】
図４はこの実施の形態１によるプログラム検査装置の動作手順を示すフローチャートである。この図を参照してプログラム検査装置の動作について説明する。検出部１１は、ユーザから検査開始指示を受けると、応用規約情報ＤＢ１３を読み出し、応用ソフトウエア１５を走査して応用ソフトウエア１５で定義されかつ応用規約情報に記載された操作を備える派生クラスを検出する（ステップＳＴ１００）。続いて、検出した派生クラスが備える前記操作と、その操作に対応する応用規約情報との組を列挙する（ステップＳＴ１０１）。続いて、検出部１１は列挙した各組を検査実施部１２に供給する（ステップＳＴ１０２）。検査実施部１２は、操作の内容と応用規約情報との組を受け取り、当該操作が応用規約情報に記載されている操作を実行するか否かを検査する（ステップＳＴ１０３）。続いて検査実施部１２は検査結果を検出部１１に通知する（ステップＳＴ１０４）。検出部１１は検査結果を出力する（ステップＳＴ１０５）。
【００１４】
次に、図２のプログラムと図３の応用規約情報とに基づいて具体的に説明する。検出部１１は応用ソフトウエア１５で定義されかつ応用規約情報に記載された操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）を備える派生クラスＯｖａｌＣｏｍｐｏｎｅｎｔ  を検出する。上述したように、ＯｖａｌＣｏｍｐｏｎｅｎｔ  には操作ｐａｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃ）、ｐａｉｎｔＣｏｍｐｏｎｅｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）しか再定義されていないが、ｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔを継承しているためＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスは操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）も備えている。
【００１５】
検出部１１は検出したＯｖａｌＣｏｍｐｏｎｅｎｔ  が備える操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）をそれに対応する応用規約情報ｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔ＃ｐｒｉｎｔＣｏｍｐｏｎｅｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）、ｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔ＃ｐｒｉｎｔＢｏｒｄｅｒ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）、ｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔ＃ｐｒｉｎｔＣｈｉｌｄｒｅｎ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）と共に検査実施部１２に供給する。検査実施部１２は受け取った操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）の動作内容をミドルウエア１４および応用ソフトウエア１５から読み出して網構造に展開する。
【００１６】
図５は検査実施部１２が展開した操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）の動作内容に関する木構造を示す図である。この例では木構造を示すが、一般の場合を想定すると操作の動作内容は網構造をとりうることは自明である。図５に示すように、操作ｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔ＃ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）  （行５−１）は、ｓｅｔＦｌａｇ（ｉｎｔ，  ｂｏｏｌｅａｎ）  （行５−２）およびｐａｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）（行５−３）を実行する。ｓｅｔＦｌａｇ（ｉｎｔ，  ｂｏｏｌｅａｎ）  およびｐａｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）は共にミドルウエア１４のｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔ＃ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）  に標準で実行するように記述されている操作である。ただし、ｓｅｔＦｌａｇ（ｉｎｔ，  ｂｏｏｌｅａｎ）  はミドルウエア１４のｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔクラスに定義され、ｐａｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）は応用ソフトウエア１５のＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスに定義されるものである。
【００１７】
さらにＯｖａｌＣｏｍｐｏｎｅｎｔ＃ｐａｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）（行５−３）は、図２より３つの操作ｐａｉｎｔＣｏｍｐｏｎｅｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）（行５−４）、ｐａｉｎｔＢｏｒｄｅｒ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）（行５−６）、ｐａｉｎｔＣｈｉｌｄｒｅｎ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）  （行５−７）を実行する。ｐａｉｎｔＣｏｍｐｏｎｅｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）  は応用ソフトウエア１５のＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスに定義される操作であり、ｐａｉｎｔＢｏｒｄｅｒ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）、ｐａｉｎｔＣｈｉｌｄｒｅｎ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）はミドルウエア１４のｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔクラスに定義される操作である。さらに、ＯｖａｌＣｏｍｐｏｎｅｎｔ＃ｐａｉｎｔＣｏｍｐｏｎｅｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）  （行５−４）は図２よりｄｒａｗＯｖａｌ（ｉｎｔ，  ｉｎｔ，  ｉｎｔ，  ｉｎｔ）を実行する（行５−５）。この操作はミドルウエア１４のｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓクラスに定義される操作である。
【００１８】
以上のように、検査実施部１２は操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）の動作内容を網構造に展開する。続いて、検査実施部１２は取得した応用規約情報に記録された操作ｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔ＃ｐｒｉｎｔＣｏｍｐｏｎｅｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）、ｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔ＃ｐｒｉｎｔＢｏｒｄｅｒ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）、ｊａｖａｘ．ｓｗｉｎｇ．ＪＣｏｍｐｏｎｅｎｔ＃ｐｒｉｎｔＣｈｉｌｄｒｅｎ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）が、作成した網構造中に存在するか否かを検査する。図５より、操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）は応用規約情報に記載された上記３つの操作（図３の行３−３，３−４，３−５）を実行しないことがわかる。したがって、検査実施部１２はＯｖａｌＣｏｍｐｏｎｅｎｔ  クラスが応用規約情報に違反していると判断し、その結果を検出部１１に通知する。検出部１１は受け取った検査結果を出力する。例えば、ディスプレイ表示してもよいし、ログファイルに記録してもよい。図６は検出部１１の出力結果の例を示す図である。図において操作ｐｒｉｎｔ（ｊａｖａ．ａｗｔ．Ｇｒａｐｈｉｃｓ）は実行すべき３つの操作を実行しないことを表示している。
【００１９】
以上のように、この実施の形態１によれば、応用規約情報ＤＢ１３が応用ソフトウエア１５で定義される派生クラスが備える特定の操作が実行すべき他の操作、および当該特定の操作、派生クラスの識別情報が記載された応用規約情報を格納し、検査実施部１２が応用規約情報に基づいて応用ソフトウエア１５が当該規約に従っているか否かを判断するようにしたので、応用ソフトウエア１５に定義される操作内での他の操作の実行漏れを検出できる効果が得られる。
【００２０】
実施の形態２．
この実施の形態２では、実施の形態１に示した応用規約情報ＤＢ１３に、ユーザによって応用ソフトウエア１５で定義される、ミドルウエア１４が備えているクラスを継承する派生クラスが使用する特定の操作が実行すべきでない他の操作、当該特定の操作および派生クラスの識別情報が記載された応用規約情報ファイルを格納する。
【００２１】
次に動作について説明する。
検出部１１は、ユーザから検査開始指示を受けると、応用規約情報ＤＢ１３を読み出し、応用ソフトウエア１５を走査して応用ソフトウエア１５で定義されかつ応用規約情報に記載された操作を備える派生クラスを検出する。続いて、検出した派生クラスが備える前記操作と、その操作に対応する応用規約情報との組を列挙する。続いて、検出部１１は列挙した各組を検査実施部１２に供給する。検査実施部１２は、受け取った操作の動作内容をミドルウエア１４および応用ソフトウエア１５から読み出して網構造に展開する。続いて検査実施部１２は、網構造に基づいて、受け取った操作が応用規約情報に記載された操作を実行していないかどうかを検査し、検査結果を検出部１１に通知する。検出部１１は検査結果を出力する。
【００２２】
以上のように、この実施の形態２によれば、応用規約情報ＤＢ１３が派生クラスが使用する特定の操作が実行すべきでない他の操作の識別情報が記載された応用規約情報ファイルを格納するようにしたので、応用ソフトウエア１５に定義される操作内での誤った操作の実行を検出できる効果が得られる。
【００２３】
実施の形態３．
ユーザが、ミドルウエア１４が備える特定の操作を応用ソフトウエア１５に再定義する際に、当該操作と共に再定義すべき操作が存在する場合がある。この実施の形態３では、このような再定義すべき操作が正しく再定義されているか否かを検査するプログラム検査装置を提供する。
【００２４】
図１の応用規約情報ＤＢ１３には、ミドルウエア１４が備えており、ユーザによって応用ソフトウエア１５で再定義される特定の操作と同時に再定義されるべき他の操作の識別情報が記載された応用規約情報が格納されている。この応用規約情報はミドルウエア１４に関する知識を有するものによって、特定の操作と共に再定義されるべき操作が判断され、検査前に作成される。検出部１１は応用規約情報に記載された特定の操作を再定義するクラスを検出する。また、検査実施部１２は検出部１１が検出したクラスが再定義すべき操作を再定義しているか否かを応用規約情報に基づいて検査する。
【００２５】
図７は応用規約情報ＤＢ１３に格納される応用規約情報の例である。この図では、規約名Ｊａｖａ（登録商標、以下同じ）−Ｃ０００１−Ｒ０００１の規約は、ｊａｖａ．ｉｏ．ＦｉｌｔｅｒＩｎｐｕｔＲｅａｄｅｒ  クラスが備える操作ｒｅａｄ（）および操作ｒｅａｄ（ｃｈａｒ［］，  ｉｎｔ，  ｉｎｔ）は共に再定義されるべきであることを示している。図８は、応用ソフトウエア１５に含まれるプログラムの例を示す図である。このプログラムでは、ｊａｖａ．ｉｏ．ＦｉｌｔｅｒＩｎｐｕｔＲｅａｄｅｒ  クラスを継承するＵｐｐｅｒＣａｓｅＲｅａｄｅｒ  クラスが定義されている（行８−１）。ＵｐｐｅｒＣａｓｅＲｅａｄｅｒ  クラスは、操作ｒｅａｄ（）を再定義している（行８−２）。
【００２６】
次に図７、図８を参照してこの実施の形態３のプログラム検査装置の動作について説明する。
検出部１１は、ユーザから検査開始指示を受けると、応用規約情報ＤＢ１３を読み出し、応用ソフトウエア１５を走査して応用ソフトウエア１５で定義されかつ応用規約情報に記載された操作を再定義する派生クラスを検出する。すなわち、ｊａｖａ．ｉｏ．ＦｉｌｔｅｒＩｎｐｕｔＲｅａｄｅｒ  クラスを継承し、かつ応用規約情報に記載された操作ｒｅａｄ（）を再定義する派生クラスＵｐｐｅｒＣａｓｅＲｅａｄｅｒ  を検出する。続いて、検出部１１は、検出したＵｐｐｅｒＣａｓｅＲｅａｄｅｒ  クラスと、それに対応する応用規約情報ｊａｖａ．ｉｏ．ＦｉｌｔｅｒＩｎｐｕｔＲｅａｄｅｒ＃ｒｅａｄ（）、ｊａｖａ．ｉｏ．ＦｉｌｔｅｒＩｎｐｕｔＲｅａｄｅｒ＃ｒｅａｄ（ｃｈａｒ［］，  ｉｎｔ，  ｉｎｔ）との組を、検査実施部１２に供給する。
【００２７】
検査実施部１２は、応用ソフトウエア１５を読み、受け取ったＵｐｐｅｒＣａｓｅＲｅａｄｅｒ  クラスが再定義する操作を検出する。図８より、ＵｐｐｅｒＣａｓｅＲｅａｄｅｒ  クラスは操作ｒｅａｄ（）を再定義していることがわかる。検査実施部１２は検出した操作ｒｅａｄ（）と受け取った応用規約情報とに基づいて、再定義されるべき操作がすべてＵｐｐｅｒＣａｓｅＲｅａｄｅｒ  クラスで再定義されているか否かを検査する。すると、ｒｅａｄ（ｃｈａｒ［］，  ｉｎｔ，  ｉｎｔ）が再定義されていないことがわかる。したがって、ＵｐｐｅｒＣａｓｅＲｅａｄｅｒ  クラスは応用規約情報に違反しているため、検査実施部１２はその旨を検出部１１に通知する。検出部１１は、受け取った結果を出力する。例えば、応用規約情報に違反しているクラス名と、再定義すべき操作名とをディスプレイ表示してもよいし、ログファイルに出力してもよい。
【００２８】
以上のように、この実施の形態３によれば、応用規約情報ＤＢ１３が、ミドルウエア１４が備えておりユーザによって応用ソフトウエア１５で再定義される特定の操作と同時に再定義されるべき他の操作の識別情報が記載された応用規約情報を格納し、検査実施部１２が応用規約情報に記載される操作をすべて再定義しているか否かを検査するようにしたので、応用ソフトウエア１５が再定義するクラスにおける操作の再定義漏れを検出することができる効果が得られる。
【００２９】
実施の形態４．
ユーザが、ミドルウエア１４が備える特定の操作を応用ソフトウエア１５に再定義する場合に、当該操作が参照すべきでない変数が存在する場合がある。この実施の形態４では、このような再定義した操作が参照すべきでない変数を参照していないかどうかを検査するプログラム検査装置を提供する。
【００３０】
図９は応用ソフトウエア１５に含まれるプログラムの例を示す図である。図に示すように、このプログラムはＪＡＶＡ言語において標準で用意されているｊａｖａ．ａｗｔ．Ｐｏｌｙｇｏｎクラスを継承するＴｒｉａｎｇｌｅクラスを定義している（行９−１）。Ｔｒｉａｎｇｌｅクラスはコンストラクタを再定義する（行９−２）。コンストラクタは、継承元のｊａｖａ．ａｗｔ．Ｐｏｌｙｇｏｎクラスのコンストラクタを実行（行９−３）した後、ｃｘ  ＝  （ｂｏｕｎｄｓ．ｘ  ＋  ｂｏｕｎｄｓ．ｗｉｄｔｈ）  ／    ２（行９−４）、ｃｙ  ＝  （ｂｏｕｎｄｓ．ｙ  ＋  ｂｏｕｎｄｓ．ｈｅｉｇｈｔ）  ／  ２（行９−５）を実行する。
【００３１】
ここで、ＪＡＶＡ言語において標準で用意されているｊａｖａ．ａｗｔ．Ｐｏｌｙｇｏｎクラスの動作について説明する。ｂｏｕｎｄｓはｊａｖａ．ａｗｔ．Ｐｏｌｙｇｏｎクラスに定義される変数である。ｊａｖａ．ａｗｔ．Ｐｏｌｙｇｏｎクラスの動作によれば、変数ｂｏｕｎｄｓには操作ｇｅｔＢｏｕｎｄｉｎｇＢｏｘ（）が実行されるまでは正しい値が設定されないようになっている。この操作ｇｅｔＢｏｕｎｄｉｎｇＢｏｘ（）は自動的に実行されるとは限らない操作である。したがって、ユーザは変数ｂｏｕｎｄｓを参照するプログラムを作成する場合、必ず操作ｇｅｔＢｏｕｎｄｉｎｇＢｏｘ（）が適切な時期に実行されてから変数ｂｏｕｎｄｓの値を参照するように記述しなければならない。なお、変数ｂｏｕｎｄｓはｊａｖａ．ａｗｔ．Ｐｏｌｙｇｏｎクラスを継承しているクラスからしか参照できないように設計されているため、上記の制約はｊａｖａ．ａｗｔ．Ｐｏｌｙｇｏｎクラスを継承しているクラスに対してのみかかる。
【００３２】
そこで、応用規約情報ＤＢ１３には、応用ソフトウエア１５に再定義される操作が参照すべきでない変数に関する規約を記載した応用規約情報を格納する。図１０は応用規約情報の例を示す図である。この図では、規約名Ｊａｖａ−Ｃ０００２−Ｒ０００１の規約は、ｊａｖａ．ａｗｔ．Ｐｏｌｙｇｏｎのコンストラクタ（行１０−１）はｇｅｔＢｏｕｎｄｉｎｇＢｏｘ（）を実行するまでは（行１０−２）、変数ｂｏｕｎｄｓを参照してはならない（行１０−３）ことを示している。この応用規約情報はミドルウエア１４に関する知識を有するものによって、特定の操作の中で参照されるべきでない変数が判断され、検査実行前に作成される。
【００３３】
次に図９、図１０を参照して実施の形態４によるプログラム検査装置の動作について説明する。
検出部１１は、ユーザから検査開始指示を受けると、応用規約情報ＤＢ１３を読み出し、応用ソフトウエア１５を走査して応用ソフトウエア１５で定義されかつ応用規約情報に記載された操作を再定義する派生クラスを検出する。すなわち、ｊａｖａ．ａｗｔ．Ｐｏｌｙｇｏｎクラスを継承し、応用規約情報に記載された操作＜ｉｎｉｔ＞（ｉｎｔ，  ｉｎｔ，  ｉｎｔ，  ｉｎｔ，  ｉｎｔ，  ｉｎｔ）を再定義する派生クラスＴｒｉａｎｇｌｅを検出する。続いて、検出部１１は、検出したＴｒｉａｎｇｌｅクラスと、それに対応する応用規約情報ｕｎｔｉｌ−ｃａｌｌ：ｊａｖａ．ａｗｔ．Ｐｏｌｙｇｏｎ＃ｇｅｔＢｏｕｎｄｉｎｇＢｏｘ（）、ＮＯＴ−ｔｏ−ｒｅｆｅｒ：ｊａｖａ．ａｗｔ．Ｐｏｌｙｇｏｎ＃ｂｏｕｎｄｓとの組を、検査実施部１２に供給する。
【００３４】
検査実施部１２は、応用ソフトウエア１５を読み、応用規約情報に記載されかつ受け取ったＴｒｉａｎｇｌｅクラスが再定義する操作を検出する。図９より、検査実施部１２はコンストラクタを検出する。検査実施部１２は検出したコンストラクタと受け取った応用規約情報とに基づいて、コンストラクタが参照すべきでない変数を参照していないかどうかを検査する。コンストラクタは変数ｂｏｕｎｄｓを参照する前にｇｅｔＢｏｕｎｄｉｎｇＢｏｘ（）を実行しておらず、またＪＡＶＡ言語の特徴によりコンストラクタが実行される時点では操作ｇｅｔＢｏｕｎｄｉｎｇＢｏｘ（）は絶対に実行されない。したがって、検査実施部１２はコンストラクタが応用規約情報に違反していると判断し、その旨を検出部１１に通知する。検出部１１は、受け取った結果を出力する。例えば、応用規約情報に違反している操作名と、参照すべきでない変数名とをディスプレイ表示してもよいし、ログファイルに出力してもよい。
【００３５】
以上のように、この実施の形態４によれば、応用規約情報ＤＢ１３が、応用ソフトウエア１５に再定義される操作が参照すべきでない変数の識別情報が記載された応用規約情報を格納し、検査実施部１２が応用規約情報に記載される変数を参照していないかどうかを検査するようにしたので、応用ソフトウエア１５が再定義する操作における誤った変数の参照を検出できる効果が得られる。
【００３６】
実施の形態５．
ユーザが応用ソフトウエア１５に特定の操作を再定義する場合に、当該操作が書き換えるべきでない変数が存在する場合がある。この実施の形態５では、このような再定義した操作が書き換えるべきでない変数を書き換えていないかどうかを検査するプログラム検査装置を提供する。
【００３７】
図１１は応用ソフトウエア１５に含まれるプログラムの例を示す図である。図に示すように、このプログラムではＦｏｏ  クラスを定義している（行１１−１）。Ｆｏｏ  クラスは操作ｐｒｉｎｔ（）  （行１１−２）、操作ｇｅｔＡｇｅ（）（行１１−４）、変数ｍａｌｅ（行１１−６）を定義している。操作ｐｒｉｎｔ（）  は、変数ｍａｌｅの値と操作ｇｅｔＡｇｅ（）の戻り値との組み合わせにより、英文を切り替えて印字する処理である。ただし、Ｆｏｏ  クラスが定義する操作ｇｅｔＡｇｅ（）は常に０を返すので（行１１−７）、操作ｐｒｉｎｔ（）  における（行１１−４）の判断では常に”ａ  ｙｏｕｎｇ”  が選択される（行１１−５）。
【００３８】
図１２は、図１１に示したＦｏｏ  クラスを継承するＢａｒクラスを定義するプログラムを示す図である。Ｂａｒ  クラスは操作ｇｅｔＡｇｅ（）と、Ｆｏｏ  クラスから継承した操作ｐｒｉｎｔ（）  とを備える。操作ｇｅｔＡｇｅ（）は、変数ｍａｌｅにｎｏｔ  ｍａｌｅを代入し（行１２−１）、定数３０を返す（行１２−２）操作である。ここで、Ｂａｒ  クラスが備える操作ｐｒｉｎｔ（）  が実行される手順を説明する。変数ｍａｌｅ  ＝  ｔｒｕｅの場合、（行１１−３）より”Ｈｅ  ｉｓ”  が印字される。続いて、（行１１−４）より操作ｇｅｔＡｇｅ（）が実行される。操作ｇｅｔＡｇｅ（）は図１２に示すように、変数ｍａｌｅにｆａｌｓｅ  を代入し、定数３０を返す。すると、図１１の（行１１−４）より”ａｎ  ａｄｕｌｔ”が印字される。続いて、ｍａｌｅ＝ｆａｌｓｅであるため（行１１−６）より”ｗｏｍａｎ”  が印字される。すなわち、”Ｈｅ  ｉｓ  ａｎ  ａｄｕｌｔ  ｗｏｍａｎ．”  が印字される。同様に、変数ｍａｌｅ  ＝  ｆａｌｓｅとして操作ｐｒｉｎｔ（）  を実行すると、”Ｓｈｅ  ｉｓ  ａｎ  ａｄｕｌｔ  ｍａｎ．”が印字される。
【００３９】
これらの英文は「Ｓｈｅ」  を「ｍａｎ」  、「Ｈｅ」を「ｗｏｍａｎ」  とそれぞれ呼んでおり文法的に誤った英文を出力しているため、Ｂａｒクラスが備える操作ｐｒｉｎｔ（）  に不具合があることになる。この不具合が発生する原因は、Ｂａｒ  クラスで再定義されている操作ｇｅｔＡｇｅ（）において変数ｍａｌｅが書き換えられているためである。そこで、この実施の形態５ではこのような不具合を検出するための応用規約情報を作成する。図１３は応用規約情報の例を示す図である。この図では、規約名Ｆｏｏ−Ｃ  ０００１−Ｒ０００１の規約は、Ｆｏｏ  クラスの操作ｇｅｔＡｇｅ（）を再定義する際に（行１３−１）、変数ｍａｌｅを書き換えてはならない（行１３−２）ことを示している。この応用規約情報はミドルウエア１４に関する知識を有するものによって、特定の操作とその中で書き換えられるべきでない変数が判断され、事前に記載される。
【００４０】
次に図１１から図１３を参照して実施の形態５によるプログラム検査装置の動作について説明する。
検出部１１は、ユーザから検査開始指示を受けると、応用規約情報ＤＢ１３を読み出し、応用ソフトウエア１５を走査して応用ソフトウエア１５で定義されかつ応用規約情報に記載された操作を再定義する派生クラスを検出する。すなわち、Ｆｏｏ  クラスを継承しｇｅｔＡｇｅ（）を再定義するＢａｒ  クラスを検出する。続いて、検出部１１は検出したＢａｒ  クラスが再定義する操作ｇｅｔＡｇｅ（）と、それに対応する規約ＮＯＴ−ｔｏ−ｍｏｄｉｆｙ：Ｆｏｏ＃ｍａｌｅとの組を、検査実施部１２に供給する。
【００４１】
検査実施部１２は、応用ソフトウエア１５を読み、受け取った操作ｇｅｔＡｇｅ（）の内容を検出する。続いて、検査実施部１２は検出した操作ｇｅｔＡｇｅ（）の内容と受け取った応用規約情報とに基づいて、操作ｇｅｔＡｇｅ（）が応用規約情報に記載される変数ｍａｌｅを書き換えていないかどうかを検査する。図１２より操作ｇｅｔＡｇｅ（）は変数ｍａｌｅを書き換えている。したがって、検査実施部１２は操作ｇｅｔＡｇｅ（）が応用規約情報に違反していると判断し、その旨を検出部１１に通知する。検出部１１は、受け取った結果を出力する。例えば、応用規約情報に違反している操作名と、書き換えるべきでない変数名とをディスプレイ表示してもよいし、ログファイルに出力してもよい。
【００４２】
以上のように、この実施の形態５によれば、応用規約情報ＤＢ１３が応用ソフトウエア１５に再定義される操作が書き換えるべきでない変数の識別情報が記載された応用規約情報を格納し、検査実施部１２が応用規約情報に記載される変数を書き換えていないかどうかを検査するようにしたので、応用ソフトウエア１５が再定義する操作における誤った変数の書き換えを検出できる効果が得られる。
【００４３】
【発明の効果】
以上のように、この発明によれば、ミドルウエアが備えているクラスを継承する派生クラスが定義されている応用ソフトウエアを検査するプログラム検査装置において、派生クラスが使用する第１の操作が実行すべき第２の操作の識別情報と当該第１の操作の識別情報との組が記載された応用規約情報を参照して、検査対象となる応用ソフトウエアで定義される派生クラスのうち、応用規約情報に記載された第１の操作を備える派生クラスを検出する検出手段と、検出手段が検出した派生クラスが備える第１の操作と当該第１の操作に対応する応用規約情報とに基づいて、検出手段により検出された派生クラス内で第１の操作が応用規約情報に記載された第２の操作を実行するように記述されているか否かを検査する検査実施手段と、検査実施手段の検査結果を出力する出力手段とを備えるように構成したので、応用ソフトウエアに定義される操作内での他の操作の実行漏れを検出できる効果がある。
【図面の簡単な説明】
【図１】この発明の実施の形態１によるプログラム検査装置のブロック図である。
【図２】同実施の形態１に係る応用ソフトウエアに含まれるプログラムの例を示す図である。
【図３】同実施の形態１に係る応用規約情報の例を示す図である。
【図４】同実施の形態１によるプログラム検査装置の動作を示すフローチャートである。
【図５】同実施の形態１に係る検査実施部が作成する木構造の例を示す図である。
【図６】同実施の形態１に係る検出部の出力結果の例を示す図である。
【図７】同実施の形態３に係る応用規約情報の例を示す図である。
【図８】同実施の形態３に係る応用ソフトウエアに含まれるプログラムの例を示す図である。
【図９】同実施の形態４に係る応用ソフトウエアに含まれるプログラムの例を示す図である。
【図１０】同実施の形態４に係る応用規約情報の例を示す図である。
【図１１】同実施の形態５に係る応用ソフトウエアに含まれるプログラムの例を示す図である。
【図１２】同実施の形態５に係る応用ソフトウエアに含まれるプログラムの例を示す図である。
【図１３】同実施の形態５に係る応用規約情報の例を示す図である。
【符号の説明】
１０  プログラム検査装置、１１  検出部（検出手段、出力手段）、１２  検査実施部（検査実施手段）、１３  応用規約情報ＤＢ、１４  ミドルウエア、１５  応用ソフトウエア、１６  検査結果。
【図１】
2005025319.tif 000003
【図２】
2005025319.tif 000004
【図３】
2005025319.tif 000005
【図４】
2005025319.tif 000006
【図５】
2005025319.tif 000007
【図６】
2005025319.tif 000008
【図７】
2005025319.tif 000009
【図８】
2005025319.tif 000010
【図９】
2005025319.tif 000011
【図１０】
2005025319.tif 000012
【図１１】
2005025319.tif 000013
【図１２】
2005025319.tif 000014
【図１３】
2005025319.tif 000015