(57)【要約】【課題】プログラムが規約に違反しているか否かを、これまでよりも効率的に判断する。【解決手段】プログラムの規約違反を判断する装置であって、規約違反を判断する対象となる対象プログラムの入力を受け付ける入力部と、規約違反となるプログラムの構造を示す抽象構文木あるいはパターンを予め記憶している違反記憶部と、対象プログラムの抽象構文木を、予め定められた変換規則によって変換木に変換する変換部と、変換木の少なくとも一部が、規約違反となる抽象構文木に一致することを条件に、対象プログラムが規約に違反していると判断する判断部とを備える装置。【選択図】図１
2007122631.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの規約違反を判断する装置であって、
規約違反を判断する対象となる対象プログラムの入力を受け付ける入力部と、
規約違反となるプログラムの構造を示す違反情報を予め記憶している違反記憶部と、
前記対象プログラムの抽象構文木を、予め定められた変換規則によって変換木に変換する変換部と、
前記変換木の少なくとも一部の構造が、前記違反情報に一致することを条件に、前記対象プログラムが規約に違反していると判断する判断部と
を備える装置。
【請求項２】
前記違反記憶部は、複数の規約のそれぞれについて、当該規約に違反しているプログラムの構造を示す違反情報を記憶しており、
前記変換部は、複数の前記変換規則の中から１または複数の変換規則の組み合わせを複数選択し、それぞれの前記組み合わせに含まれる変換規則のそれぞれを前記対象プログラムの抽象構文木に順次適用することにより複数の変換木のそれぞれを生成し、
前記判断部は、前記複数の変換木のうち少なくとも何れか１つの少なくとも一部の構造が、何れかの前記違反情報に一致することを条件に、前記対象プログラムが規約に違反していると判断する
請求項１に記載の装置。
【請求項３】
前記複数の変換規則のそれぞれは、変換された変換木における当該変換規則によって変換された部分木の一部に対しては当該変換規則を更に適用することはできない変換規則である
請求項２に記載の装置。
【請求項４】
少なくとも１つの前記変換規則は、第１項と第２項との間での演算結果と第３項とを演算することを示す抽象構文木を、第２項と第３項との間での演算結果と第１項とを演算することを示す変換木に変換する変換規則である
請求項２に記載の装置。
【請求項５】
少なくとも１つの前記変換規則は、データベースのテーブルから行または列を選択し、選択された行または列を他のテーブルと結合するプログラムの抽象構文木を、データベースのテーブルを他のテーブルと結合し、結合されたテーブルから行または列を選択するプログラムの変換木に変換する変換規則である
請求項２に記載の装置。
【請求項６】
少なくとも１つの前記変換規則は、データベースのテーブルから、第１の条件および第２の条件を満たす行または列を選択するプログラムの抽象構文木を、前記テーブルから、前記第１の条件を満たす行または列を選択し、選択された結果得られる中間テーブルから、更に前記第２の条件を満たす行または列を選択するプログラムの変換木に変換する変換規則である
請求項２に記載の装置。
【請求項７】
前記違反記憶部は、複数の規約のそれぞれに対応付けて、当該規約に違反しているプログラムの構造を示す違反情報と、更に、当該プログラムを当該規約に違反しない形式に変更する方法である変更方法を記憶しており、
前記対象プログラムが規約に違反していると判断されたことを条件に、当該規約に対応する前記変更方法を利用者に通知する通知部
を更に備える請求項２に記載の装置。
【請求項８】
前記対象プログラムが規約に違反していることを条件に、前記変換部によって変換された変換木によって表されるプログラムのうち、前記違反記憶部に記憶されている違反情報とは構造が一致しない変換木によって表されるプログラムを利用者に通知する通知部
を更に備える請求項２に記載の装置。
【請求項９】
前記通知部は、複数の前記変換木によって表されるプログラムのうち、当該変換木に含まれるノードの数が最も少ないプログラムを利用者に通知する
請求項８に記載の装置。
【請求項１０】
前記対象プログラムが規約に違反しており、かつ、前記対象プログラムを示す抽象構文木から、通知された前記プログラムの変換木への変換が等価変換であることを条件に、前記対象プログラムの少なくとも一部を前記変換木の構造によって修正する修正部
を更に備える請求項８に記載の装置。
【請求項１１】
前記違反記憶部は、変換後の変換木を規約違反として誤検出するような変換規則および規約の組を、誤検出パターンとして更に記憶しており、
前記判断部は、変換された変換木の構造が前記違反情報に一致する場合であっても、当該変換の変換規則および当該違反情報に対応する規約の組が前記誤検出パターンであることを条件に、前記対象プログラムが規約に違反していないと判断する
請求項２に記載の装置。
【請求項１２】
抽象構文木が前記変換部によって変換される毎に、変換元の部分木と変換先の部分木とを対応付けて記憶する履歴記憶部を更に備え、
前記判断部は、規約違反として誤検出された変換木が、他の変換規則によって更に変換された場合において、当該変換による変換の対象となる部分木が誤検出された部分木とは異なることを更に条件として、前記対象プログラムが規約に違反していると判断する
請求項１１に記載の装置。
【請求項１３】
プログラムの規約違反を判断する装置として、情報処理装置を機能させる判断プログラムであって、
前記情報処理装置を、
規約違反を判断する対象となる対象プログラムの入力を受け付ける入力部と、
規約違反となるプログラムの構造を示す違反情報を予め記憶している違反記憶部と、
前記対象プログラムの抽象構文木を、予め定められた変換規則によって変換木に変換する変換部と、
前記変換木の少なくとも一部の構造が前記違反情報に一致することを条件に、前記対象プログラムが規約に違反していると判断する判断部と
して機能させる判断プログラム。
【請求項１４】
プログラムの規約違反を判断する方法であって、
規約違反を判断する対象となる対象プログラムの入力を受け付ける段階と、
規約違反となるプログラムの構造を示す違反情報を予め記憶している段階と、
前記対象プログラムの抽象構文木を、予め定められた変換規則によって変換木に変換する段階と、
前記変換木の少なくとも一部の構造が前記違反情報に一致することを条件に、前記対象プログラムが規約に違反していると判断する段階と
を備える方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの規約違反を判断する装置、およびその方法に関する。特に、本発明は、プログラムの構造を示す抽象構文木を用いて、プログラムの規約違反を判断する装置、およびその方法に関する。
【背景技術】
【０００２】
プログラムの開発現場においては、業務効率化や保守性向上を目的として、ＡＰＩの使用方法などの規約が設けられている場合がある。プログラムがこの規約に違反しているかを判断するために、従来、規約違反となるプログラムの構造を示す抽象構文木のパターンを予め準備しておき、判断対象となるプログラムの抽象構文木と比較する技術が用いられている（例えば、非特許文献１を参照。）。
【０００３】
非特許文献２については後述する。
【非特許文献１】Rational Code Review http://codereview.lexma.ibm.com/
【非特許文献２】FindBugs http://findbugs.sourceforge.net
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかしながら、開発されるプログラムは様々であり、規約違反となる構造も様々となる。このため、規約違反となるプログラムの構造を示す抽象構文木を予め全て準備しておくことは極めて困難であり、また、誤検出や検出漏れなどが発生し易い。また、抽象構文木を用いることなくプログラムの欠陥を検出する技術も提案されている（例えば、非特許文献２を参照。）。この技術は、Ｊａｖａ（登録商標）言語などのバイトコードを走査することによって制御フローやデータフローの解析を行う。そして、プログラムの中で実行され得ない部分などを探し出して利用者に通知する。しかしながら、この技術において、制御フローなどの解析処理を実装するためには専門的な知識が必要である。従って、この技術によっては、プログラム言語の専門家によって予め想定された欠陥しか検出できず、プロジェクトの担当者が、必要に応じて規約を追加・変更することはできない。
【０００５】
そこで本発明は、上記の課題を解決することのできる装置、方法、および、プログラムを提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
【課題を解決するための手段】
【０００６】
上記課題を解決するために、本発明においては、プログラムの規約違反を判断する装置であって、規約違反を判断する対象となる対象プログラムの入力を受け付ける入力部と、規約違反となるプログラムの構造を示す抽象構文木あるいはパターンからなる違反情報を予め記憶している違反記憶部と、前記対象プログラムの抽象構文木を、予め定められた変換規則によって変換木に変換する変換部と、前記変換木の少なくとも一部が、規約違反となる前記抽象構文木あるいはパターンに一致することを条件に、前記対象プログラムが規約に違反していると判断する判断部とを備える装置、当該装置によって規約違反を判断する方法、および、当該装置として情報処理装置を機能させるプログラムを提供する。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
【発明の効果】
【０００７】
本発明によれば、プログラムが規約に違反しているか否かを、これまでよりも効率的に判断することができる。
【発明を実施するための最良の形態】
【０００８】
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
【０００９】
図１は、判断装置１０の機能構成を示す。判断装置１０は、プログラムの規約違反を効率的に判断することを目的とする。本実施例において判断する規約違反とは、プログラムの構文上の誤りのみならず、そのプログラムを開発しているプロジェクトや、そのプログラムが組み込まれるライブラリにおいて局所的に設けられた規約に対する違反を含む。このような規約によってプログラムを検査し、規約違反のプログラムを予め修正しておけば、プログラムの実行を効率化して、ソフトウェアの開発や運用の効率を高めることができる。
【００１０】
判断装置１０は、入力部１００と、変換規則記憶部１０５と、変換部１１０と、履歴記憶部１２０と、違反記憶部１３０と、判断部１４０と、通知部１５０と、修正部１６０とを備える。入力部１００は、規約違反を判断する対象となる対象プログラムの入力を受け付ける。変換規則記憶部１０５は、予め定められた複数の変換規則を記憶している。変換部１１０は、複数の変換規則の中から１または複数の変換規則の組み合わせを複数選択し、それぞれの組み合わせに含まれる変換規則のそれぞれを対象プログラムの抽象構文木（ＡＳＴ：Ａｂｓｔｒａｃｔ  Ｓｙｎｔａｘ  Ｔｒｅｅ）に順次適用することにより複数の変換木のそれぞれを生成する。
【００１１】
履歴記憶部１２０は、抽象構文木が変換部１１０によって変換される毎に、変換元の部分木と変換先の部分木とを対応付けて記憶する。違反記憶部１３０は、複数の規約のそれぞれに対応付けて、その規約に違反しているプログラムの構造を示す違反情報を予め記憶している。また、違反記憶部１３０は、複数の規約のそれぞれに対応付けて、その規約に違反しているプログラムをその規約に違反しない形式に変更する変更方法を記憶している。更に、違反記憶部１３０は、変換後の変換木を規約違反として誤検出するような変換規則および規約の組を、誤検出パターンとして記憶している。
【００１２】
判断部１４０は、生成された複数の変換木のうち少なくとも何れか一つの少なくとも一部の構造が、何れかの違反情報に一致することを条件に、対象プログラムが規約に反していると判断する。なお、判断部１４０は、対象プログラムの抽象構文木自体の構造が何れかの違反情報に一致した場合にも、対象プログラムが規約に違反していると判断する。また、判断部１４０は、変換された変換木の構造が違反情報に一致する場合であっても、その変換の変換規則およびその違反情報に対応する規約の組が誤検出パターンであることを条件に、対象プログラムが規約に違反していないと判断する。
【００１３】
通知部１５０は、対象プログラムが規約に反していると判断されたことを条件に、その規約に対応する変更方法を利用者に通知する。更に、通知部１５０は、対象プログラムが規約に違反していることを条件に、変換部１１０によって変換された変換木のうち、違反記憶部１３０に記憶されている違反情報とは構造が一致しない変換木によって表されるプログラムを利用者に通知してもよい。更にこの場合、修正部１６０は、対象プログラムが規約に違反しており、かつ、対象プログラムを示す抽象構文木から、通知されたその変換木への変換が等価変換であることを条件に、対象プログラムの少なくとも一部を変換木が示す構造に修正してもよい。修正された対象プログラムは、利用者に対して出力される。
【００１４】
図２は、変換規則記憶部１０５のデータ構造の一例を示す。変換規則記憶部１０５は、抽象構文木を変換木に変換する複数の変換規則のそれぞれを、その変換規則を識別する記号に対応付けて記憶している。以降、対象プログラムには、データベースに対するアクセス手順が記述されているものとする。より詳細には、対象プログラムは、ＳＱＬ（Ｓｔｒｕｃｔｕｒｅｄ  Ｑｕｅｒｙ  Ｌａｎｇｕａｇｅ）のデータ操作言語（ＤＭＬ：Ｄａｔａ  Ｍａｎｉｐｕｌａｔｉｏｎ  Ｌａｎｇｕａｇｅ）によって記述されているものとする。また、各変換規則は、ＳＱＬで記述された対象プログラムの抽象構文木を、変換木に変換する規則であるものとする。
【００１５】
具体的には、変換規則ｔａｊは、データベースに含まれる３つのテーブルを結合する結合命令を、結合法則によって再構成する変換を示す。この変換規則は、例えば、第１項と第２項との間での演算結果と第３項とを演算することを示す抽象構文木を、第２項と第３項との間での演算結果と第１項とを演算することを示す変換木に変換する規則である。
【００１６】
また、変換規則ｔｍｊは、データベースのテーブルから行または列を選択し、選択された行または列を他のテーブルと結合するプログラムの抽象構文木を、データベースのテーブルを他のテーブルと結合し、結合されたテーブルの行または列を選択するプログラムの変換木に変換する規則である。
【００１７】
また、変換規則ｔｘｊは、行を選択する条件を２つの選択命令に割り当てる変換を示す。例えば、変換規則ｔｘｊは、データベースのテーブルから、第１の条件および第２の条件を満たす行を選択するプログラムの抽象構文木を、そのテーブルから第１の条件を満たす行を選択し、選択された結果得られる中間テーブルから、更に第２の条件を満たす行を選択するプログラムの変換木に変換する規則である。
【００１８】
ここで、好ましくは、変換規則記憶部１０５に記憶される複数の変換規則のそれぞれは、変換された変換木における当該変換規則によって変換された部分木の一部に対しては当該変換規則を更に適用することはできない変換規則である。即ち、変換規則の集合は、同一の変換規則を無限に適用して、変換木を無限に拡張することはできないように定められることが望ましい。これにより、変換部１１０による処理を有限時間で終了させ、判断装置１０を現実的な用途に適用し易くすることができる。
【００１９】
一方で、変換規則が上記の性質を満たさない場合であっても、変換部１１０は、抽象構文木に対し複数の変換規則を順次適用し始めてから、予め定められた時間が経過し、または、予め定められた回数の適用が完了したことを条件に、変換規則の適用を終了してもよい。この方法によっても、変換部１１０による処理を有限時間で終了させることができる。更に好ましくは、変換部１１０は、既に生成された変換木と同一の変換木が生成された場合においては、その変換木に対しては変換規則の適用を完了する。これにより、規約違反判断に不要な重複した変換を防止し、処理の効率を高めることができる。
【００２０】
図３ａは、違反記憶部１３０に記憶されている違反情報およびそれに対応する変更方法を示す。違反記憶部１３０は、違反情報を、その識別情報（ＩＤ）と、それに対応する変更方法とに対応付けて記憶している。違反情報（ｒ１）は、ＳＱＬのＳＥＬＥＣＴ命令の列名リストにアスタリスク（＊）を使用した場合に規約違反となることを示す。違反情報（ｒ２）は、ＳＱＬの副照会および結合のどちらでも記述できる場合に副照会で記述した場合に規約違反となることを示す。
【００２１】
違反情報（ｒ３）は、結合命令により結合されるテーブルの数が所定の数（例えば、４個）以上である場合に規約違反となることを示す。この規約違反を設けることによって、結合後のテーブルのデータサイズが膨大になることを防ぐことができる。なお、複数のテーブルを結合された場合であっても、これら複数のテーブルから特定の行を選択した後に、選択後のテーブルを更に他のテーブルと結合する場合には、結合後のテーブルのデータサイズが小さくなる場合が考えられる。このため、好ましくは、違反情報（ｒ３）は、ＳＥＬＥＣＴ命令を実行させることなく連続して結合する複数のテーブルの合計数が所定の数以上である場合に規約違反とするような情報であってもよい。
【００２２】
違反情報（ｒ４）は、あるテーブルに他のテーブルを外部結合してから、結合されたテーブルの中からレコードを選択するプログラムは規約違反になることを示す。また、違反情報（ｒ５）は、互いに等しい複数のテーブルを同一のキーで結合するプログラムは規約違反になることを示す。また、違反情報（ｒ６）は、最終結果に影響しないテーブルを生成するプログラムは規約違反になることを示す。
【００２３】
図３ａの例において、違反情報は、その内容を示す文章として表される。実際には、違反情報は、規約を順守しない典型的なプログラムの抽象構文木そのものだけではなく，それを表すパターンであってもよい。そして、判断部１４０は、抽象構文木がそのパターンに一致するか否かを判断してもよい。より詳細には、このパターンは、所定のスクリプト言語やプログラム言語により記述されていてもよい。具体例として、このパターンは、ＸＰａｔｈ（ＸＭＬ  Ｐａｔｈ  Ｌａｎｇｕａｇｅ）により記述されていてもよいし、Ｊａｖａ（登録商標）言語により記述されていてもよい。
【００２４】
更に、違反記憶部１３０は、それぞれの違反情報に対応付けて、その違反情報によって示される規約違反を解消するためにプログラムを変更する変更方法を記憶している。例えば、違反記憶部１３０は、違反情報（ｒ２）に対応付けて、副照会および結合のどちらでも記述できるプログラムを、結合で記述するように変更する変更方法を記憶している。また、違反記憶部１３０は、違反情報（ｒ４）に対応付けて、外部結合してから選択するプログラムを、選択してから外部結合するプログラムに変更する変更方法を記憶している。さらに、違反記憶部１３０は、違反情報（ｒ５）に対応付けて、同一テーブルを同一キーで結合するプログラムを、単なるテーブルに変更する変更方法を記憶している。
【００２５】
この変更方法も、違反情報と同様、図３ａにおいては、その内容を示す文章として表される。実際には、この変更方法は、対象プログラムを変換するための変換プログラムであってもよい。この変換プログラムは、各種のスクリプト言語やプログラム言語によって記述されていてもよい。
【００２６】
以上、変換規則および違反情報を例示したが、規約違反を漏れなく検出するためには、管理者は、規約違反を効率的に検出させるための多様な変換規則および違反情報を選択する必要がある。このような多様な変換規則の中には、違反情報に一致する構造を極めて生成し易いような変換規則が含まれる場合もある。このような場合に、違反情報に一致する構造を有している場合には全て規約違反と判断してしまうとすれば、違反情報や変換規則は極めて慎重に検討して定めなければならず、却って管理者に不便を与える場合がある。これに対し、本実施例において、違反記憶部１３０は、変換後の変換木を規約違反として誤検出するような変換規則および規約の組を、誤検出パターンとして更に記憶している。そして、このような誤検出パターンに一致する変換木が検出された場合には、規約違反の例外として規約違反でないものとして取り扱う。以下、このような誤検出パターンの具体例を述べる。
【００２７】
図３ｂは、違反記憶部１３０に記憶されている誤検出パターンを示す。違反記憶部１３０は、変換後の変換木を規約違反として誤検出するような変換規則および規約の組を、誤検出パターンとして更に記憶している。本図の例において、違反記憶部１３０は、誤検出パターンに該当する変換規則および規約の組を、誤検出パターンであることを示すフラグｔｒｕｅに対応付けて記憶している。違反情報（ｒ３）および変換規則（ｔｍｊ）の組は、誤検出パターンであることを示すフラグｔｒｕｅに対応付けて記憶されている。このため、変換規則（ｔｍｊ）によって変換された変換木が違反情報（ｒ３）に該当する場合であっても、判断部１４０は、対象プログラムを規約違反とは判断しない。その他の場合については、変換木が何れかの違反情報によって示される構造に一致するならば、規約違反として判断される。
【００２８】
図４は、誤検出を引き起こす変換の例を示す。図４において、集合４１０は、ある違反情報ｒ０に一致する構造を有する抽象構文木の集合を示す。また、集合４００は、ある変換規則ｔｑの値域、つまりこの変換規則によって変換される変換木の集合を示す。また、集合４２０は、ある変換規則ｔｐの値域、つまりこの変換規則によって変換される変換木の集合を示す。抽象構文木ｑｉは、変換規則ｔｑによって、変換木ｑｉ＋１に変換される。この変換木ｑｉ＋１は、集合４１０に含まれ、即ち、違反情報に一致する構造を有する。また、抽象構文木ｐｊは、変換規則ｔｐによって、変換木ｐｊ＋１に変換される。この変換木ｑｉ＋１は、集合４１０に含まれる。
【００２９】
ここで、変換木ｑｉ＋１および変換木ｐｊ＋１は、何れも、集合４１０に含まれている。従って、規約違反を違反情報のみによって判断する場合においては、ｑ０ｐ０の何れもが、規約違反のプログラムとして判断される。これに対して、管理者は、この変換木ｑｉ＋１を、規約に違反している構造の例外として取り扱いたい場合においては、規約違反の例外を定めた誤検出パターンを定めることができる。即ち例えば、変換規則ｔｑおよび違反情報ｒ０の組を誤検出パターンとして定めておけば、判断部１４０は、変換木ｑｉ＋１のみを規約違反でないと判断し、変換木ｐｊ＋１については規約違反として判断することができる。
【００３０】
以上、図３ｂおよび図４に例示したように、規約違反に例外を定める誤検出パターンを設けることによって、規約違反となるプログラムを精度良く判断することができ、また、変換規則や違反情報に要求される厳密性が緩和され、変換規則や違反情報の作成を容易にすることができる。
【００３１】
図５は、対象プログラムが規約に違反しているか否かを判断する処理の流れを示す。入力部１００は、規約違反を判断する対象となる対象プログラムの入力を受け付ける（Ｓ５００）。変換部１１０は、複数の変換規則の中から１または複数の変換規則の組み合わせを複数選択し、それぞれの組み合わせに含まれる変換規則のそれぞれを対象プログラムの抽象構文木に順次適用することにより複数の変換木のそれぞれを生成する（Ｓ５１０）。履歴記憶部１２０は、抽象構文木が変換部１１０によって変換される毎に、変換元の部分木と変換先の部分木とを対応付けて記憶する（Ｓ５２０）。
【００３２】
判断部１４０は、生成された複数の変換木のうち少なくとも何れか一つの少なくとも一部の構造が、何れかの違反情報に一致するか否かを判断する（Ｓ５３０）。一致することを条件に（Ｓ５３０：ＹＥＳ）、通知部１５０は、対象プログラムが規約に違反している旨を利用者に通知する（Ｓ５４０）。更に、通知部１５０は、その規約に対応する変更方法を利用者に通知してもよい。更に、通知部１５０は、変換部１１０によって変換された変換木のうち、違反記憶部１３０に記憶されている違反情報とは構造が一致しない変換木によって表されるプログラムを利用者に通知してもよい。更に好ましくは、通知部１５０は、変換されたこれらの変換木によって表されるプログラムのうち、その変換木に含まれるノードの数が最も少ないプログラムを通知してもよい。これにより、利用者は、規約に違反しているプログラムの修正方法を知ることができ、更に、最もシンプルな修正方法を知ることができる。
【００３３】
更にこの場合、修正部１６０は、その対象プログラムの自動変更が可能か否かを判断してもよい（Ｓ５５０）。例えば、修正部１６０は、対象プログラムが規約に違反しており、かつ、対象プログラムを示す抽象構文木から、通知されたその変換木への変換が等価変換であることを条件に、対象プログラムの自動変更が可能と判断してもよい。更に、対象プログラムの自動変更は、利用者の同意を条件とすることが望ましい。対象プログラムの自動変更が可能なことを条件に（Ｓ５５０：ＹＥＳ）、修正部１６０は、対象プログラムの少なくとも一部を、通知された変換木が示す構造に修正する（Ｓ５６０）。修正された対象プログラムは、利用者に対して出力される。
【００３４】
続いて、図６および図７を用いて、対象プログラムの規約違反が検出される具体例を説明する。
図６は、対象プログラムの一例を示す。この対象プログラムは、ＳＱＬで記述されており、データベースに対するアクセス手順を示している。本実施例においては、この対象プログラムの第３行目から第１２行目までの部分を例に、規約違反の判断方法を説明する。対象プログラムのこの部分は、対象プログラムの抽象構文木においてはある部分木ｓ１として表される。第６行目から第７行目のプログラムは、ＣＯＭＰＡＳＨＲＰＲＯＦＩＬＥというテーブルと、ＴＭ＿ＣＲ＿ＥＭＰＬＯＹＥＥ＿ＩＮＦＯというテーブルとを、所定の条件で左結合する処理を示す。このテーブルは、更に、ＴＭ＿ＣＲ＿ＢＯ＿ＰＲＥＳＥＮＴ＿ＩＮＦＯというテーブルと内部結合される。
【００３５】
第３行目および第４行目のプログラムは、この内部結合によって生成されたテーブルから所定の行または列を選択する処理を示す。また、第１２行目から第１３行目までのプログラムは、この選択によって生成されたテーブルを、更に、ＣＯＭＰＡＳＨＲＰＲＯＦＩＬＥというテーブルと内部結合する処理を示す。
【００３６】
実際に、図６の対象プログラムに対して、変換規則ｔａｊｔｍｊを順次適用することにより、変換部１１０は、１９種類の変換木を生成した。これらのうちの幾つかは、以下の様なＳＱＬ文を含む。
ＣＯＭＰＡＳＨＲＰＲＯＦＩＬＥ  ＡＳ  ＪＴ  ＩＮＮＥＲ  ＪＯＩＮ  ＣＯＭＰＡＳＨＲＰＲＯＦＩＬＥ  ＡＳ  ＨＲ２
ＯＮ  ＪＴ．ＵＳＥＲＩＤ  ＝  ＨＲ２．ＵＳＥＲＩＤ
【００３７】
このＳＱＬ文は、共に、ＣＯＭＰＡＳＨＲＰＲＯＦＩＬＥというテーブルを、同一のＵＳＥＲＩＤというキーでアクセスしている。このため、この対象プログラムの抽象構文木は、違反情報ｒ５によって示される構造に一致する。従って、図６の対象プログラムは、規約違反と判断される。
【００３８】
図７は、対象プログラムの抽象構文木を変換した変換木によって表されるプログラムの一例を示す。図７のプログラムは、図６の第３〜４行目のＳＥＬＥＣＴ命令、および、図６の第１２行目の内部結合命令の組に対し、上述の変換規則ｔｍｊを適用したプログラムを示す。即ち、図６ではＳＥＬＥＣＴ命令の実行後に内部結合命令を実行していたのに対し、図７においては内部結合命令の実行後にＳＥＬＥＣＴ命令が実行される。
【００３９】
図７のプログラムにおいては、第６行目において、テーブルＨＲ１およびテーブルＥＭが結合の対象となる。また、第９行目においてテーブルＢＯが結合の対象となる。また、第１２行目において、テーブルＨＲ２が結合の対象となる。そして、これら複数の結合処理は、ＳＥＬＥＣＴ命令を実行することなく連続して行われる。従って、このプログラムの抽象構文木は、図３ａに示す違反情報（ｒ３）に違反しているとも考えられる。しかしながら、違反情報（ｒ３）および変換規則ｔｍｊの組は、図３ｂに示す誤検出パターンに該当する。このため、判断部１４０は、図７のプログラムが示す変換木によっては、対象プログラムを規約違反とは判断しない。
【００４０】
また、図７の第６行目から第１２行目のプログラムが示す部分木は、他の変換規則によって、部分木ｓ２からｓ１９までのそれぞれに変換される。このように、規約違反として誤検出された変換木が、次の変換規則によって更に変換された場合においては、既に誤検出された変換木によって、次の変換結果が規約違反と判断されないようにされなければならない。このため、判断部１４０は、当該次の変換による変換木の構造が違反情報に一致する場合であっても、当該次の変換による変換の対象となる部分木が誤検出された部分木と同一であれば、引き続き誤検出であるとして取り扱う。つまり、判断部１４０は、当該次の変換による変換の対象となる部分木が誤検出された部分木とは異なることを更に条件として、対象プログラムが規約に違反していると判断する。この条件判断は、履歴記憶部１２０に記憶された、変換前の変換木および変換後の変換木を比較することによって実現される。即ち例えば、判断部１４０は、一旦誤検出パターンとして判断された部分木が、当該次の変換によって変換されていない場合においては、対象プログラムを規約違反としては判断しない。これにより、誤検出パターンが一旦検出された場合においても、続いて適用される変換規則によって生じた規約違反を適切に判断することができる。
【００４１】
以上、図６および図７において例示したように、本実施例における判断装置１０は、実際に記述されたプログラムを対象として、プロジェクト管理者などによって定められた規約違反を適切に判断することが確かめられた。また、この判断に要した時間は１秒未満であり、実用上充分な処理速度であることが確かめられた。
【００４２】
図８は、判断装置１０として機能する情報処理装置５００のハードウェア構成の一例を示す。情報処理装置５００は、ホストコントローラ１０８２により相互に接続されるＣＰＵ１０００、ＲＡＭ１０２０、及びグラフィックコントローラ１０７５を有するＣＰＵ周辺部と、入出力コントローラ１０８４によりホストコントローラ１０８２に接続される通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を有する入出力部と、入出力コントローラ１０８４に接続されるＲＯＭ１０１０、フレキシブルディスクドライブ１０５０、及び入出力チップ１０７０を有するレガシー入出力部とを備える。
【００４３】
ホストコントローラ１０８２は、ＲＡＭ１０２０と、高い転送レートでＲＡＭ１０２０をアクセスするＣＰＵ１０００及びグラフィックコントローラ１０７５とを接続する。ＣＰＵ１０００は、ＲＯＭ１０１０及びＲＡＭ１０２０に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ１０７５は、ＣＰＵ１０００等がＲＡＭ１０２０内に設けたフレームバッファ上に生成する画像データを取得し、表示装置１０８０上に表示させる。これに代えて、グラフィックコントローラ１０７５は、ＣＰＵ１０００等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
【００４４】
入出力コントローラ１０８４は、ホストコントローラ１０８２と、比較的高速な入出力装置である通信インターフェイス１０３０、ハードディスクドライブ１０４０、及びＣＤ−ＲＯＭドライブ１０６０を接続する。通信インターフェイス１０３０は、ネットワークを介して外部の装置と通信する。ハードディスクドライブ１０４０は、情報処理装置５００が使用するプログラム及びデータを格納する。ＣＤ−ＲＯＭドライブ１０６０は、ＣＤ−ＲＯＭ１０９５からプログラム又はデータを読み取り、ＲＡＭ１０２０又はハードディスクドライブ１０４０に提供する。
【００４５】
また、入出力コントローラ１０８４には、ＲＯＭ１０１０と、フレキシブルディスクドライブ１０５０や入出力チップ１０７０等の比較的低速な入出力装置とが接続される。ＲＯＭ１０１０は、情報処理装置５００の起動時にＣＰＵ１０００が実行するブートプログラムや、情報処理装置５００のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ１０５０は、フレキシブルディスク１０９０からプログラム又はデータを読み取り、入出力チップ１０７０を介してＲＡＭ１０２０またはハードディスクドライブ１０４０に提供する。入出力チップ１０７０は、フレキシブルディスク１０９０や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
【００４６】
情報処理装置５００に提供されるプログラムは、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５、又はＩＣカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ１０７０及び/又は入出力コントローラ１０８４を介して、記録媒体から読み出され情報処理装置５００にインストールされて実行される。プログラムは、例えば、本発明に係る判断プログラムであり、この判断プログラムが情報処理装置５００等に働きかけて行わせる動作は、図１から図７において説明した判断装置１０における動作と同一であるから、説明を省略する。
【００４７】
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク１０９０、ＣＤ−ＲＯＭ１０９５の他に、ＤＶＤやＰＤ等の光学記録媒体、ＭＤ等の光磁気記録媒体、テープ媒体、ＩＣカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はＲＡＭ等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムを情報処理装置５００に提供してもよい。
【００４８】
以上、本実施例における判断装置１０によれば、対象プログラムについて、これまで検出の難しかった規約違反を効率的に判断することができる。本実施例で判断する規約違反とは、プログラムの構文上の誤りのみならず、そのプログラムを開発しているプロジェクトや、そのプログラムが組み込まれるライブラリにおいて局所的に設けられた規約に対する違反を含む。このような規約によってプログラムを検査し、規約違反のプログラムを予め修正しておけば、プログラムの実行を効率化して、ソフトウェア開発や運用の効率を高めることができる。更に、誤検出パターンという規約違反の例外を定めることができるようにすることで、規約違反を判断する精度を高め、また、規約や変換規則の効率的に作成することができる。更に、誤検出パターンが一旦検出された場合には、そのパターンに一致する部分木は誤検出パターンとして判断し続けることにより、続いて適用される変換規則によって生じた規約違反を適切に判断することができる。
【００４９】
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
【図面の簡単な説明】
【００５０】
【図１】図１は、判断装置１０の機能構成を示す。
【図２】図２は、変換規則記憶部１０５のデータ構造の一例を示す。
【図３ａ】図３ａは、違反記憶部１３０に記憶されている違反情報およびそれに対応する変更方法を示す。
【図３ｂ】図３ｂは、違反記憶部１３０に記憶されている誤検出パターンを示す。
【図４】図４は、誤検出を引き起こす変換の例を示す。
【図５】図５は、対象プログラムが規約に違反しているか否かを判断する処理の流れを示す。
【図６】図６は、対象プログラムの一例を示す。
【図７】図７は、対象プログラムの抽象構文木を変換した変換木によって表されるプログラムの一例を示す。
【図８】図８は、判断装置１０として機能する情報処理装置５００のハードウェア構成の一例を示す。
【符号の説明】
【００５１】
１０  判断装置
１００  入力部
１０５  変換規則記憶部
１１０  変換部
１２０  履歴記憶部
１３０  違反記憶部
１４０  判断部
１５０  通知部
１６０  修正部
４００  集合
４１０  集合
４２０  集合
５００  情報処理装置
【図１】
2007122631.tif 000003
【図２】
2007122631.tif 000004
【図３ａ】
2007122631.tif 000005
【図３ｂ】
2007122631.tif 000006
【図４】
2007122631.tif 000007
【図５】
2007122631.tif 000008
【図６】
2007122631.tif 000009
【図７】
2007122631.tif 000010
【図８】
2007122631.tif 000011