(57)【要約】【課題】構文やデータ構造が異なるが処理内容が類似するプログラムを正確に類似プログラムと判定すること。【解決手段】モデル抽出部１１が、構文定義情報を用いてソースコードをモデルに変換する。そして、モデル要約部１３が、データ領域定義情報を用いて、モデルの中で同じデータ領域に対して同じ命令が連続する箇所を１つの命令にまとめることでモデルを要約モデルに変換する。そして、類似度計算部１５が、要約モデルを用いて要約モデル間の類似度を計算する。そして、判定部１７が、要約モデルの類似度を用いて、ソースコードが類似しているか否かを判定し、判定結果を出力する。【選択図】図１
2018124901.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードを所定の数の基本命令と制御構造を示す命令とにより表わされるモデルに変換する変換部と、
前記変換部によりソースコードから変換されたモデルの中で同じデータ領域に対して同じ基本命令が連続する箇所を１つの基本命令にまとめることで要約モデルを作成する要約部と、
前記要約部により作成された要約モデルを用いてソースコード間の類似度を計算する類似度計算部と
を有することを特徴とするプログラム分析装置。
【請求項２】
前記変換部は、ソースコードを更新命令、計算命令、入力命令及び出力命令の４つの基本命令と制御構造を示す命令とに変換することを特徴とする請求項１に記載のプログラム分析装置。
【請求項３】
前記要約部は、ソースコードがＣＯＢＯＬの場合には、データ領域定義ファイルを用いて同じデータ領域であるかを判定し、ソースコードがＪａｖａの場合には、クラス定義を用いて同じデータ領域であるかを判定し、ソースコードがＣの場合には、構造体の定義を用いて同じデータ領域であるかを判定することを特徴とする請求項１又は２に記載のプログラム分析装置。
【請求項４】
コンピュータが、
ソースコードを所定の数の基本命令と制御構造を示す命令とにより表わされるモデルに変換し、
前記モデルの中で同じデータ領域に対して同じ基本命令が連続する箇所を１つの基本命令にまとめることで要約モデルを作成し、
作成した要約モデルを用いてソースコード間の類似度を計算する
処理を実行することを特徴とするプログラム分析方法。
【請求項５】
コンピュータに、
ソースコードを所定の数の基本命令と制御構造を示す命令とにより表わされるモデルに変換し、
前記モデルの中で同じデータ領域に対して同じ基本命令が連続する箇所を１つの基本命令にまとめることで要約モデルを作成し、
作成した要約モデルを用いてソースコード間の類似度を計算する
処理を実行させることを特徴とするプログラム分析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム分析装置、プログラム分析方法及びプログラム分析プログラムに関する。
【背景技術】
【０００２】
ソフトウェア開発では、類似した機能を実現するために、プログラムの複製がよく行われる。このため、あるプログラムにバグが見つかった場合、複製された部分を含む類似プログラムにも同様のバグがある可能性が高い。したがって、ソフトウェアの保守においては、類似したプログラムを把握することが重要となる。
【０００３】
類似したプログラムを把握するために、プログラム間の類似度を計算する技術がある。例えば、変数名を全て特殊文字列に置換した後、２つのプログラム間で共通する行の数に基づいて、２つのプログラム間の類似度を計算する技術がある。
【０００４】
また、プログラムの修正内容を管理するための修正管理情報とプログラムの構造を示すシステム構造情報に基づいて検索条件の抽象化レベルを決定し、検索対象プログラムと検索元コードを抽象化して比較することで行単位の類似度比率を算出する技術がある。この技術によれば、プログラムの中から検索元コードと関連性のあるコードを自動的に検出することができる。
【０００５】
また、ソースコードの特徴を表す第１特徴情報と、ソースコードの更新状況を表す補助情報とを対応づけて記憶し、解析対象とするソースコードの特徴を表す第２特徴情報と第１特徴情報との類似度に基づいて、補助情報を選択して出力する技術がある。この技術に因れば、コードの更新作業を効率化することができる。
【０００６】
また、各ソースコードについて共通コードと差分からなる埋め込みコードを生成し、各ソースコードについて部分コードを削除して埋め込みコードを埋め込んで、ソースコードの構造上の形態を実質的に変えることなく埋め込みコードを埋め込む技術がある。この技術によれば、ソースコードを効率よく共通化することができる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００５−３０１８５９号公報
【特許文献２】特開２０１５−１７９３１２号公報
【特許文献３】特開２０１５−１８４７３５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
変数名を全て特殊文字列に置換した後、２つのプログラム間で共通する行の数に基づいて、２つのプログラム間の類似度を計算する技術には、処理内容が類似しているプログラムを正しく認識することができない場合があるという問題がある。
【０００９】
図１５は、処理内容は類似するがソースコードは異なる２つのプログラムの例を示す図である。図１５に示す２つのソースコードは、入力ファイルに基づいてマスタを更新するプログラムをＣＯＢＯＬを用いて作成したものである。
【００１０】
図１６は、図１５に示した２つのソースコードの類似度の計算例を示す図である。図１６では、変数名の差異による構文の差異をなくすため、変数名が全て特殊文字列（＄ＮＡＭＥ＄）に置換されている。図１６において、Ｓ＃１は、ソースコード＃１を表し、Ｓ＃２は、ソースコード＃２を表す。
【００１１】
図１６に示すように、Ｓ＃１とＳ＃２の類似度（Ｓ＃１，Ｓ＃２）を（Ｓ＃１とＳ＃２で共通している行の数）／（Ｓ＃１の行数とＳ＃２の行数の最大値）とすると、類似度（Ｓ＃１，Ｓ＃２）＝２６／４４≒０．５９である。一般的に、類似度がある閾値（例えば、０．８）以上であるプログラムを類似プログラムとするため、従来技術はこの例のような類似プログラムを検出することができない。
【００１２】
本発明は、１つの側面では、処理内容が類似するプログラムを正しく検出することを目的とする。
【課題を解決するための手段】
【００１３】
１つの態様では、プログラム分析装置は、変換部と、要約部と、類似度計算部を有する。変換部は、ソースコードを所定の数の基本命令と制御構造を示す命令とにより表わされるモデルに変換する。要約部は、変換部によりソースコードから変換されたモデルの中で同じデータ領域に対して同じ基本命令が連続する箇所を１つの基本命令にまとめることで要約モデルを作成する。類似度計算部は、要約部により作成された要約モデルを用いてソースコード間の類似度を計算する。
【発明の効果】
【００１４】
１つの側面では、本発明は、処理内容が類似するプログラムを正しく検出することができる。
【図面の簡単な説明】
【００１５】
【図１】図１は、実施例に係るプログラム分析装置の機能構成を示す図である。
【図２】図２は、ソースコードの例を示す図である。
【図３】図３は、図２に示したソースコードから作成されたモデルを示す図である。
【図４】図４は、図１５に示したソースコード＃２から作成されたモデルを示す図である。
【図５】図５は、データ領域定義情報の例を示す図である。
【図６】図６は、図５に示したデータ領域定義情報で定義されたデータ領域のイメージを示す図である。
【図７】図７は、図３に示したモデルの要約モデルを示す図である。
【図８】図８は、要約モデル間の類似度の計算例を示す図である。
【図９】図９は、類似度情報の例を示す図である。
【図１０】図１０は、プログラム分析装置による処理のフローを示すフローチャートである。
【図１１】図１１は、ソースコードをモデル化する処理のフローを示すフローチャートである。
【図１２】図１２は、モデルを要約する処理のフローを示すフローチャートである。
【図１３】図１３は、モデル間の類似度を計算する処理のフローを示すフローチャートである。
【図１４】図１４は、実施例に係るプログラム分析プログラムを実行するコンピュータのハードウェア構成を示す図である。
【図１５】図１５は、処理内容は類似するがソースコードは異なる２つのプログラムの例を示す図である。
【図１６】図１６は、図１５に示した２つのソースコードの類似度の計算例を示す図である。
【発明を実施するための形態】
【００１６】
以下に、本願の開示するプログラム分析装置、プログラム分析方法及びプログラム分析プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００１７】
実施例に係るプログラム分析装置は、ソースコードを単純なモデルに変換し、モデルの要約を行った上で、ソースコード間の類似度を計算する。ソースコードでは、同様の処理を行う場合でも複数通りの記述ができるため、実施例に係るプログラム分析装置は、モデル化によりソースコードを抽象化した命令列に変換することで、記述の相違をなくす。そして、実施例に係るプログラム分析装置は、処理対象のデータ構造によって命令の長さが異なることがあるため、データ構造を考慮した要約を行うことで、データ構造によらず処理内容の類似性を認識する。
【００１８】
図１は、実施例に係るプログラム分析装置の機能構成を示す図である。図１に示すように、実施例に係るプログラム分析装置１は、モデル抽出部１１と、モデル情報記憶部１２と、モデル要約部１３と、要約モデル情報記憶部１４と、類似度計算部１５と、類似度情報記憶部１６と、判定部１７とを有する。
【００１９】
モデル抽出部１１は、ソースコード及び構文定義情報を入力し、ソースコードに対応するモデルを作成し、作成したモデルの情報をモデル情報記憶部１２に格納する。モデル抽出部１１は、ソースコード及び構文定義情報を例えばディスク装置が記憶するファイルから読み込む。モデル情報記憶部１２は、モデル抽出部１１により作成されたモデルの情報を記憶する。
【００２０】
モデル抽出部１１は、構文定義情報を用いてソースコードを以下の４つの命令と制御構造を示す命令によって表すことでモデル化を行う。
【００２１】
（１）更新：ｕｐｄａｔｅ（Ｘ）
変数Ｘの値を更新する命令
（２）計算：ｃｏｍｐ（Ｘ1，Ｘ2，．．．，Ｘn−＞Ｙ）
変数Ｘ1，Ｘ2，．．．，Ｘnの値を入力として計算を行い、結果を変数Ｙに出力する命令
（３）入力：ｒｅａｄ（Ｘ）
外部記憶装置（ファイル）Ｘから値を読み込む命令
（４）出力：ｗｒｉｔｅ（Ｘ）
外部記憶装置Ｘに値を書き込む命令
【００２２】
制御構造には、分岐と繰り返しがある。また、構文定義情報は、ＣＯＢＯＬ、Ｊａｖａ（登録商標、以下同様）、Ｃ等のプログラミング言語の仕様を定めた情報である。
【００２３】
図２は、ソースコードの例を示す図である。図２は、ＣＯＢＯＬを用いて作成されたソースコードを示す。図２において、例えば、１行目のＰＥＲＦＯＲＭ〜ＵＮＴＩＬは、繰り返しを実現する構文であり、ｌｏｏｐ命令に置き換えられる。４行目のＲＥＡＤは、ファイルから値を読み込み、読み込み結果によって分岐する構文でありｓｗｉｔｃｈ、ｃａｓｅを含むｒｅａｄ命令に置き換えられる。
【００２４】
６行目のＭＯＶＥ、９行目のＩＮＩＴＩＡＬＩＺＥは、変数の値を更新する構文であり、ｕｐｄａｔｅ命令に置き換えられる。２８行目のＡＤＤは、足し算を行う構文であり、ｃｏｍｐ命令に置き換えられる。下から４行目のＷＲＩＴＥは、ファイルに値を書き込む構文であり、ｗｒｉｔｅ命令に置き換えられる。なお、図２に示したソースコードは、図１５に示したソースコード＃１と同じである。
【００２５】
図３は、図２に示したソースコードから作成されたモデルを示す図である。図３に示すように、ＰＥＲＦＯＲＭ〜ＵＮＴＩＬは、繰り返しを表現するｌｏｏｐ命令に置き換えられ、ＭＯＶＥ及びＩＮＩＴＩＡＬＩＺＥは、ｕｐｄａｔｅ命令に置き換えられている。また、ＲＥＡＤは、分岐を表現するｓｗｉｔｃｈ、ｃａｓｅを含むｒｅａｄ命令に置き換えられ、ＷＲＩＴＥは、ｗｒｉｔｅ命令に置き換えられ、ＡＤＤは、ｃｏｍｐ命令に置き換えられている。
【００２６】
図４は、図１５に示したソースコード＃２から作成されたモデルを示す図である。図１５と図４を比較すると、ＰＥＲＦＯＲＭ〜ＵＮＴＩＬは、繰り返しを表現するｌｏｏｐ命令に置き換えられ、ＭＯＶＥ及びＩＮＩＴＩＡＬＩＺＥは、ｕｐｄａｔｅ命令に置き換えられている。また、ＲＥＡＤは、分岐を表現するｓｗｉｔｃｈ、ｃａｓｅを含むｒｅａｄ命令に置き換えられ、ＷＲＩＴＥは、ｗｒｉｔｅ命令に置き換えられ、ＣＯＭＰＵＴＥは、ｃｏｍｐ命令に置き換えられている。
【００２７】
モデル要約部１３は、データ領域定義情報を入力し、モデル情報記憶部１２からモデル情報を読み出す。そして、モデル要約部１３は、データ領域定義情報を用いてモデルを要約し、要約モデルを作成する。そして、モデル要約部１３は、作成した要約モデルの情報を要約モデル情報記憶部１４に格納する。要約モデル情報記憶部１４は、モデル要約部１３により作成された要約モデルの情報を記憶する。
【００２８】
図５は、データ領域定義情報の例を示す図である。図５は、ＣＯＢＯＬのデータ領域定義ファイルである。図５に示すように、ＡＡＡ−ＲＥＣというデータ領域は、ＡＡＡ−ＫＥＹ１、ＡＡＡ−ＳＹＲＩ、ＡＡＡ−ＳＩＫＩＲＩ１、ＡＡＡ−ＧＥＮＫＡ、ＡＡＡ−ＺＫＮＴＢＬ、ＡＡＡ−ＦＬＧＴＢＬ、ＡＡＡ−ＥＲＲＴＢＬ、ＡＡＡ−ＫＡＮＲＩというデータ領域を含む。
【００２９】
また、ＡＡＡ−ＫＥＹ１というデータ領域は、ＡＡＡ−ＡＳＤ、ＡＡＡ−ＫＥＹ２というデータ領域を含む。また、ＡＡＡ−ＫＥＹ２というデータ領域は、ＡＡＡ−ＨＩＮＫＯＵ、ＡＡＡ−ＳＩＡＧＥというデータ領域を含む。
【００３０】
図６は、図５に示したデータ領域定義情報で定義されたデータ領域のイメージを示す図である。図６に示すように、ＡＡＡ−ＲＥＣというデータ領域は、ＡＡＡ−ＫＥＹ１、ＡＡＡ−ＳＹＲＩ、・・・というデータ領域を含み、ＡＡＡ−ＫＥＹ１というデータ領域は、ＡＡＡ−ＡＳＤ、ＡＡＡ−ＫＥＹ２というデータ領域を含む。そして、ＡＡＡ−ＫＥＹ２というデータ領域は、ＡＡＡ−ＨＩＮＫＯＵ、ＡＡＡ−ＳＩＡＧＥというデータ領域を含む。
【００３１】
すなわち、ＡＡＡ−ＫＥＹ１、ＡＡＡ−ＳＹＲＩ、．．．、ＡＡＡ−ＡＳＤ、ＡＡＡ−ＫＥＹ２、ＡＡＡ−ＨＩＮＫＯＵ、ＡＡＡ−ＳＩＡＧＥ、．．．は、ＡＡＡ−ＲＥＣというデータ領域に含まれるデータ領域である。
【００３２】
モデル要約部１３は、１つのデータ領域及びそのデータ領域に含まれるデータ領域の全てを同じデータ領域とみなす。例えば、モデル要約部１３は、ＡＡＡ−ＲＥＣ、ＡＡＡ−ＫＥＹ１、ＡＡＡ−ＳＹＲＩ、．．．、ＡＡＡ−ＡＳＤ、ＡＡＡ−ＫＥＹ２、ＡＡＡ−ＨＩＮＫＯＵ、ＡＡＡ−ＳＩＡＧＥ、．．．を同じデータ領域とみなす。
【００３３】
そして、モデル要約部１３は、同じデータ領域に対して同じ命令が連続している場合は、連続した同じ命令を１つの命令にまとめる。図７は、図３に示したモデルの要約モデルを示す図である。図７に示すように、ｕｐｄａｔｅ（ＡＡＡ−ＫＥＹ１）〜ｕｐｄａｔｅ（ＡＡＡ−ＳＩＡＧＥ）は、同じデータ領域に対して同じｕｐｄａｔｅ命令が連続しているので、１つのｕｐｄａｔｅ命令にまとめられている。
【００３４】
同様に、ｕｐｄａｔｅ（ＡＡＡ−ＥＲＲＴＢＬ）〜ｕｐｄａｔｅ（ＡＡＡ−ＵＰＤＡＴＥ）は、同じデータ領域に対して同じｕｐｄａｔｅ命令が連続しているので、１つのｕｐｄａｔｅ命令にまとめられている。同様に、ｕｐｄａｔｅ（ＡＡＡ−ＲＥＣ）〜ｕｐｄａｔｅ（ＡＡＡ−ＣＲＴＹＭＤ）は、同じデータ領域に対して同じｕｐｄａｔｅ命令が連続しているので、１つのｕｐｄａｔｅ命令にまとめられている。
【００３５】
なお、モデル要約部１３は、ソースコードがＪａｖａで記述されている場合には、データ領域定義情報としてクラス定義の情報を用い、ソースコードがＣで記述されている場合には、データ領域定義情報として構造体定義の情報を用いる。
【００３６】
類似度計算部１５は、２つの要約モデルの情報を要約モデル情報記憶部１４から読み込み、２つの要約モデル間の類似度を計算することで対応するソースコード間の類似度を計算し、２つの要約モデルの名前、類似度を類似度情報記憶部１６に格納する。類似度情報記憶部１６は、類似度計算部１５により計算された類似度を２つの要約モデルの名前に対応付けて類似度情報として記憶する。
【００３７】
例えば、類似度計算部１５は、２つの要約モデルＭ＃１とＭ＃２の類似度（Ｍ＃１，Ｍ＃２）を（Ｍ＃１とＭ＃２で共通している行の数）／（Ｍ＃１の行数とＭ＃２の行数の最大値）により計算する。図８は、要約モデル間の類似度の計算例を示す図である。図８において、要約モデル＃１は、図１５に示したソースコード＃１から作成された要約モデルであり、要約モデル＃２は、図１５に示したソースコード＃２から作成された要約モデルである。
【００３８】
図８に示すように、要約モデル＃１の行数は２１であり、要約モデル＃２の行数は２２であり、要約モデル＃１と要約モデル＃２で共通する行数は、要約モデル＃２の８行目のｃｏｍｐを除く２１であるので、類似度は２１／２２≒０．９５である。
【００３９】
図９は、類似度情報の例を示す図である。図９に示すように、類似度情報は、対象＃１と対象＃２と類似度を対応付ける。対象＃１及び対象＃２は、類似度が計算された２つの要約モデルの名前である。図９では、要約モデル＃１と要約モデル＃２の類似度が０．９５である。
【００４０】
判定部１７は、類似度情報記憶部１６が記憶する類似度情報を用いてソースコード間に類似性があるか否かを判定し、判定結果を出力する。例えば、判定部１７は、類似度が０．８以上である場合に、ソースコードが類似していると判定する。そして、判定部１７は、類似度と判定結果を、類似度が計算された２つのソースコードの名前とともに判定情報として表示装置に表示する。
【００４１】
次に、プログラム分析装置１による処理のフローについて説明する。図１０は、プログラム分析装置１による処理のフローを示すフローチャートである。図１０に示すように、プログラム分析装置１は、ソースコードをモデル化し（ステップＳ１）、モデルを要約する（ステップＳ２）。
【００４２】
そして、プログラム分析装置１は、要約モデル間の類似度を計算する（ステップＳ３）。そして、プログラム分析装置１は、要約モデル間の類似度を用いてソースコードが類似するか否かを判定し、判定情報を出力する（ステップＳ４）。
【００４３】
このように、プログラム分析装置１は、ソースコードのモデル化を行った後、モデルを要約することで、データ構造が異なった場合でも類似する処理を認識することができる。
【００４４】
図１１は、ソースコードをモデル化する処理のフローを示すフローチャートである。図１１の処理は、図１０に示したステップＳ１の処理に対応する。図１１に示すように、モデル抽出部１１は、全てのソースコードを処理済みであるか否かを判定し（ステップＳ１１）、全てのソースコードを処理済みである場合には、処理を終了する。
【００４５】
一方、未処理のソースコードがある場合には、モデル抽出部１１は、次のソースコードを取得し（ステップＳ１２）、全ての構文を処理済みであるか否かを判定する（ステップＳ１３）。そして、全ての構文を処理済みである場合には、モデル抽出部１１は、モデル情報記憶部１２に命令列を格納し（ステップＳ１４）、ステップＳ１１へ戻る。
【００４６】
一方、処理していない構文がある場合には、モデル抽出部１１は、次の構文を取得し（ステップＳ１５）、取得した構文が計算を行う構文であるか否かを判定する（ステップＳ１６）。そして、モデル抽出部１１は、取得した構文が計算を行う構文である場合には、命令列に計算命令を追加し（ステップＳ１７）、ステップＳ１３へ戻る。
【００４７】
一方、取得した構文が計算を行う構文でない場合には、モデル抽出部１１は、取得した構文が更新を行う構文であるか否かを判定する（ステップＳ１８）。そして、モデル抽出部１１は、取得した構文が更新を行う構文である場合には、命令列に更新命令を追加し（ステップＳ１９）、ステップＳ１３へ戻る。
【００４８】
一方、取得した構文が更新を行う構文でない場合には、モデル抽出部１１は、取得した構文が外部からデータを読み込む構文であるか否かを判定する（ステップＳ２０）。そして、モデル抽出部１１は、取得した構文が外部からデータを読み込む構文である場合には、命令列に入力命令を追加し（ステップＳ２１）、ステップＳ１３へ戻る。
【００４９】
一方、取得した構文が外部からデータを読み込む構文でない場合には、モデル抽出部１１は、取得した構文が外部にデータを書き込む構文であるか否かを判定する（ステップＳ２２）。そして、モデル抽出部１１は、取得した構文が外部にデータを書き込む構文である場合には、命令列に出力命令を追加し（ステップＳ２３）、ステップＳ１３へ戻る。
【００５０】
一方、取得した構文が外部へデータを書き込む構文でない場合には、モデル抽出部１１は、取得した構文が処理を分岐させる構文であるか否かを判定する（ステップＳ２４）。そして、モデル抽出部１１は、取得した構文が処理を分岐させる構文である場合には、命令列に分岐命令を追加し（ステップＳ２５）、ステップＳ１３へ戻る。
【００５１】
一方、取得した構文が処理を分岐させる構文でない場合には、モデル抽出部１１は、取得した構文が処理を繰り返す構文であるか否かを判定する（ステップＳ２６）。そして、モデル抽出部１１は、取得した構文が処理を繰り返す構文である場合には、命令列にループ命令を追加し（ステップＳ２７）、ステップＳ１３へ戻り、取得した構文が処理を繰り返す構文でない場合には、ステップＳ１３へ戻る。
【００５２】
このように、モデル抽出部１１が、ソースコードをモデル化することで、プログラム分析装置１は、２つのソースコードの構文が異なる場合でも、類似処理を認識することができる。
【００５３】
図１２は、モデルを要約する処理のフローを示すフローチャートである。図１２の処理は、図１０に示したステップＳ２の処理に対応する。図１２に示すように、モデル要約部１３は、全てのモデルを処理済みであるか否かを判定し（ステップＳ３１）、全てのモデルを処理済みである場合には、処理を終了する。
【００５４】
一方、未処理のモデルがある場合には、モデル要約部１３は、次のモデルを取得し（ステップＳ３２）、全ての命令を処理済みであるか否かを判定する（ステップＳ３３）。そして、全ての命令を処理済みである場合には、モデル要約部１３は、要約モデル情報記憶部１４に要約命令列を格納し（ステップＳ３４）、ステップＳ３１へ戻る。
【００５５】
一方、処理していない命令がある場合には、モデル要約部１３は、次の命令を取得し（ステップＳ３５）、取得した命令が、直前の命令と同じ命令であり、かつ、直前の命令と同じデータ領域を対象としているか否かを判定する（ステップＳ３６）。
【００５６】
そして、モデル要約部１３は、取得した命令が、直前の命令と同じ命令でないか、又は、直前の命令と同じデータ領域を対象としていない場合には、取得した命令を要約命令列に追加し（ステップＳ３７）、ステップＳ３３へ戻る。一方、取得した命令が、直前の命令と同じ命令であり、かつ、直前の命令と同じデータ領域を対象としている場合には、モデル要約部１３は、ステップＳ３３へ戻る。
【００５７】
このように、モデル要約部１３がモデルを要約することで、プログラム分析装置１は、２つのソースコードのデータ構造が異なる場合でも、類似処理を認識することができる。
【００５８】
図１３は、モデル間の類似度を計算する処理のフローを示すフローチャートである。図１３の処理は、図１０に示したステップＳ３の処理に対応する。図１３に示すように、類似度計算部１５は、全ての要約モデルのペアを処理済みであるか否かを判定し（ステップＳ４１）、全ての要約モデルのペアを処理済みである場合には、処理を終了する。
【００５９】
一方、未処理の要約モデルのペアがある場合には、類似度計算部１５は、要約モデル間の類似度を計算し（ステップＳ４２）、計算結果を類似度情報記憶部１６に要約モデルの名前とともに格納する（ステップＳ４３）。そして類似度計算部１５は、ステップＳ４１へ戻る。
【００６０】
このように、類似度計算部１５が要約モデル間の類似度を計算することで、プログラム分析装置１は、ソースコード間の類似度を計算することができる。
【００６１】
上述してきたように、実施例では、モデル抽出部１１が、構文定義情報を用いてソースコードをモデルに変換する。そして、モデル要約部１３が、データ領域定義情報を用いて、モデルの中で同じデータ領域に対して同じ命令が連続する箇所を１つの命令にまとめることでモデルを要約モデルに変換する。そして、類似度計算部１５が、要約モデルを用いて要約モデル間の類似度を計算する。そして、判定部１７が、要約モデルの類似度を用いて、ソースコードが類似しているか否かを判定し、判定結果を出力する。したがって、プログラム分析装置１は、構文やデータ構造は異なるが処理内容が類似するプログラムを正しく検出することができる。
【００６２】
例えば、従来技術では類似度が０．１４であるが、プログラム分析装置１が計算した類似度は０．９２である場合もある。
【００６３】
また、実施例では、モデル抽出部１１は、ソースコードを更新命令、計算命令、入力命令及び出力命令の４つの基本命令と制御構造を示す命令とに変換するので、ソースコードを適切にモデル化することができる。
【００６４】
また、実施例では、モデル要約部１３は、データ領域定義情報を用いてデータ領域が同じであるか否かを判定するので、同一であるデータ領域を正しく判定することができる。
【００６５】
なお、実施例では、プログラム分析装置１について説明したが、プログラム分析装置１が有する構成をソフトウェアによって実現することで、同様の機能を有するプログラム分析プログラムを得ることができる。そこで、プログラム分析プログラムを実行するコンピュータについて説明する。
【００６６】
図１４は、実施例に係るプログラム分析プログラムを実行するコンピュータのハードウェア構成を示す図である。図１４に示すように、コンピュータ５０は、メインメモリ５１と、ＣＰＵ（Central  Processing  Unit）５２と、ＬＡＮ（Local  Area  Network）インタフェース５３と、ＨＤＤ（Hard  Disk  Drive）５４とを有する。また、コンピュータ５０は、スーパーＩＯ（Input  Output）５５と、ＤＶＩ（Digital  Visual  Interface）５６と、ＯＤＤ（Optical  Disk  Drive）５７とを有する。
【００６７】
メインメモリ５１は、プログラムやプログラムの実行途中結果などを記憶するメモリである。ＣＰＵ５２は、メインメモリ５１からプログラムを読み出して実行する中央処理装置である。ＣＰＵ５２は、メモリコントローラを有するチップセットを含む。
【００６８】
ＬＡＮインタフェース５３は、コンピュータ５０をＬＡＮ経由で他のコンピュータに接続するためのインタフェースである。ＨＤＤ５４は、プログラムやデータを格納するディスク装置であり、スーパーＩＯ５５は、マウスやキーボードなどの入力装置を接続するためのインタフェースである。ＤＶＩ５６は、液晶表示装置を接続するインタフェースであり、ＯＤＤ５７は、ＤＶＤの読み書きを行う装置である。
【００６９】
ＬＡＮインタフェース５３は、ＰＣＩエクスプレス（ＰＣＩｅ）によりＣＰＵ５２に接続され、ＨＤＤ５４及びＯＤＤ５７は、ＳＡＴＡ（Serial  Advanced  Technology  Attachment）によりＣＰＵ５２に接続される。スーパーＩＯ５５は、ＬＰＣ（Low  Pin  Count）によりＣＰＵ５２に接続される。
【００７０】
そして、コンピュータ５０において実行されるプログラム分析プログラムは、ＤＶＤに記憶され、ＯＤＤ５７によってＤＶＤから読み出されてコンピュータ５０にインストールされる。あるいは、プログラム分析プログラムは、ＬＡＮインタフェース５３を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ５０にインストールされる。そして、インストールされたプログラム分析プログラムは、ＨＤＤ５４に記憶され、メインメモリ５１に読み出されてＣＰＵ５２によって実行される。
【００７１】
また、実施例では、モデル抽出部１１が、更新命令、計算命令、入力命令、出力命令の４つの命令と制御構造を示す命令を用いてモデル化を行う場合について説明した。しかし、モデル抽出部１１は、例えば、計算命令を加算、減算、乗算、除算に細分する等、他の命令と制御構造を示す命令を用いてモデル化を行ってもよい。
【００７２】
また、実施例では、類似度計算部１５が、２つの要約モデルＭ＃１とＭ＃２の類似度（Ｍ＃１，Ｍ＃２）を（Ｍ＃１とＭ＃２で共通している行の数）／（Ｍ＃１の行数とＭ＃２の行数の最大値）により計算する場合について説明した。しかし、類似度計算部１５は、他の類似度を用いて２つの要約モデル間の類似度を計算してもよい。
【符号の説明】
【００７３】
１    プログラム分析装置
１１    モデル抽出部
１２    モデル情報記憶部
１３    モデル要約部
１４    要約モデル情報記憶部
１５    類似度計算部
１６    類似度情報記憶部
１７    判定部
５０    コンピュータ
５１    メインメモリ
５２    ＣＰＵ
５３    ＬＡＮインタフェース
５４    ＨＤＤ
５５    スーパーＩＯ
５６    ＤＶＩ
５７    ＯＤＤ
【図１】
2018124901.tif 000003
【図２】
2018124901.tif 000004
【図３】
2018124901.tif 000005
【図４】
2018124901.tif 000006
【図５】
2018124901.tif 000007
【図６】
2018124901.tif 000008
【図７】
2018124901.tif 000009
【図８】
2018124901.tif 000010
【図９】
2018124901.tif 000011
【図１０】
2018124901.tif 000012
【図１１】
2018124901.tif 000013
【図１２】
2018124901.tif 000014
【図１３】
2018124901.tif 000015
【図１４】
2018124901.tif 000016
【図１５】
2018124901.tif 000017
【図１６】
2018124901.tif 000018