(57)【要約】【課題】パッチの適用の有無を判定できるようにする。【解決手段】情報処理装置１０は、一部の命令列を修正命令列１ａに変更するパッチの適用対象であるソースファイル２を記憶する。情報処理装置１０は、修正命令列１ａを含むパッチファイル１に基づいて、修正命令列１ａ内の各命令の命令種別を示すパッチ命令種別情報３を生成する。次に情報処理装置１０は、ソースファイル２内の各命令の命令種別を示すソース命令種別情報４を生成する。さらに情報処理装置１０は、パッチ命令種別情報３とソース命令種別情報４とに基づいて、ソースファイル２から、修正命令列１ａと命令種別の並びが一致する種別一致命令列２ａを抽出する。そして情報処理装置１０は、種別一致命令列２ａと修正命令列１ａとの、変数名と関数名とを除外した記述内容に基づいて、ソースファイル２にパッチが適用されているか否かを判定する。【選択図】図１
2020013385.tif 000002
【特許請求の範囲】
【請求項１】
一部の命令列を修正命令列に変更するパッチの適用対象であるソースファイルを記憶する記憶部と、
前記修正命令列を含むパッチファイルに基づいて、前記修正命令列内の各命令の命令種別を示すパッチ命令種別情報を生成し、前記ソースファイル内の各命令の命令種別を示すソース命令種別情報を生成し、前記パッチ命令種別情報と前記ソース命令種別情報とに基づいて、前記ソースファイルから、前記修正命令列と命令種別の並びが一致する種別一致命令列を抽出し、前記種別一致命令列と前記修正命令列との、変数名と関数名とを除外した記述内容に基づいて、前記ソースファイルに前記パッチが適用されているか否かを判定する処理部と、
を有する情報処理装置。
【請求項２】
前記処理部は、変数名と関数名とを除外した前記種別一致命令列の記述内容と、変数名と関数名とを除外した前記修正命令列の記述内容との類似度を算出し、前記類似度に基づいて、前記ソースファイルに前記パッチが適用されているか否かを判定する、
請求項１記載の情報処理装置。
【請求項３】
前記処理部は、前記種別一致命令列と前記修正命令列とのそれぞれの命令行に先頭から順に行番号を付与し、同じ行番号の行同士の記述の同一性を判定し、一致すると判定した行の割合を前記類似度とする、
請求項２記載の情報処理装置。
【請求項４】
前記記憶部は、行間の同一性の判定において比較対象とする単語のリストを含むキーワード辞書をさらに記憶し、
前記処理部は、前記種別一致命令列の第１の行内の前記キーワード辞書に含まれる単語と、前記修正命令列における、前記第１の行と同じ行番号の第２の行内の前記キーワード辞書に含まれる単語との比較結果に基づいて、同じ行番号の行同士の同一性を判定する、
請求項３記載の情報処理装置。
【請求項５】
一部の命令列を修正命令列に変更するパッチ用の、前記修正命令列を含むパッチファイルを配布するサーバと、
前記パッチの適用対象であるソースファイルを記憶する記憶部と、前記サーバから前記パッチファイルを取得し、前記パッチファイルに基づいて、前記修正命令列内の各命令の命令種別を示すパッチ命令種別情報を生成し、前記ソースファイル内の各命令の命令種別を示すソース命令種別情報を生成し、前記ソース命令種別情報と前記パッチ命令種別情報とに基づいて、前記ソースファイルから、前記修正命令列と命令種別の並びが一致する種別一致命令列を抽出し、前記種別一致命令列と前記修正命令列との、変数名と関数名とを除外した記述内容に基づいて、前記ソースファイルに前記パッチが適用されているか否かを判定する、処理部と、を有する情報処理装置と、
を有するパッチ適用確認システム。
【請求項６】
コンピュータが、
一部の命令列を修正命令列に変更するパッチ用の、前記修正命令列を含むパッチファイルに基づいて、前記修正命令列内の各命令の命令種別を示すパッチ命令種別情報を生成し、
前記パッチの適用対象であるソースファイル内の各命令の命令種別を示すソース命令種別情報を生成し、
前記パッチ命令種別情報と前記ソース命令種別情報とに基づいて、前記ソースファイルから、前記修正命令列と命令種別の並びが一致する種別一致命令列を抽出し、
前記種別一致命令列と前記修正命令列との、変数名と関数名とを除外した記述内容に基づいて、前記ソースファイルに前記パッチが適用されているか否かを判定する、
パッチ適用確認方法。
【請求項７】
コンピュータに、
一部の命令列を修正命令列に変更するパッチ用の、前記修正命令列を含むパッチファイルに基づいて、前記修正命令列内の各命令の命令種別を示すパッチ命令種別情報を生成し、
前記パッチの適用対象であるソースファイル内の各命令の命令種別を示すソース命令種別情報を生成し、
前記パッチ命令種別情報と前記ソース命令種別情報とに基づいて、前記ソースファイルから、前記修正命令列と命令種別の並びが一致する種別一致命令列を抽出し、
前記種別一致命令列と前記修正命令列との、変数名と関数名とを除外した記述内容に基づいて、前記ソースファイルに前記パッチが適用されているか否かを判定する、
処理を実行させるパッチ適用確認プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、パッチ適用確認システム、パッチ適用確認方法、およびパッチ適用確認プログラムに関する。
【背景技術】
【０００２】
オープンソースソフトウェア（ＯＳＳ：Open Source Software）の商用システムへの適用が近年盛んになっている。ＯＳＳを利用したシステムを構築する場合、システムの管理者は、例えばＯＳＳのソースコードをビルドして実行形式のソフトウェアを生成し、そのソフトウェアをシステムに導入する。
【０００３】
ＯＳＳの脆弱性が見つかると、システムの管理者は、ＯＳＳ修正用のパッチプログラム（以下、修正パッチと呼ぶ）を取得して、ＯＳＳを修正する。システムには、様々な修正パッチが適用される。そこで、システムを安全に運用するために、システムの管理者は、システムへの各種修正パッチの適用の有無を管理することとなる。ＯＳＳは、パッケージ管理ツールによって脆弱性管理ができるディストリビューションと異なり、脆弱性管理ツールが十分に整備されていない。そのためシステムの管理者は、提供元が公開している修正パッチ情報を収集し、独自に脆弱性の修正パッチ適用の有無を管理する。
【０００４】
ＯＳＳをシステムへ導入する際には、ソフトウェアの開発支援技術を利用することができる。ソフトウェアの開発支援に関する技術としては、例えば、複数のソフトウェア部品を結合する作業において、当該複数のソフトウェア間で公開、参照される関数の取り扱いの整合性を保つために人が行う作業量を低減するソフトウェア開発支援システムがある。
【０００５】
またパッチ適用を可視化する技術もある。例えばカスタマイズした基準ソースコードに対して、その基準ソースコードのバージョン変更による変更箇所を反映する場合に、変更すべき確度に基づいて修正候補箇所を提示するソフトウェア開発支援方法がある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００４−３６２０４８号公報
【特許文献２】特開２０１７−０４５３５４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ＯＳＳのソースコードをビルドして利用しているシステムでは、脆弱性に対処するための修正パッチの適用状況の調査に時間がかかるという問題がある。その要因の１つは、ＯＳＳの変数名や関数名を変更して運用する場合があることである。
【０００８】
例えば、修正パッチにおいて、変数名や関数名を含む行の削除や追加が行われる場合、変数名や関数名でソースコード内を検索すれば、修正パッチの適用により修正される行を容易に見つけ出すことができる。しかし、ＯＳＳの修正パッチを適用する際に、プログラム側の命名規則にしたがってＯＳＳの修正パッチの変数名や関数名を書き換えて適用していると、ソースコードに対する変数名や関数名での検索では、修正パッチの適用箇所を抽出することができない。この場合、管理者は、ソースコードを詳細に確認して、パッチの適用の有無を判断することとなり、調査に時間がかかってしまう。
【０００９】
１つの側面では、本件は、パッチの適用の有無を判定できるようにすることを目的とする。
【課題を解決するための手段】
【００１０】
１つの案では、以下に示す記憶部と処理部とを有する情報処理装置が適用される。
記憶部は、一部の命令列を修正命令列に変更するパッチの適用対象であるソースファイルを記憶する。処理部は、修正命令列を含むパッチファイルに基づいて、修正命令列内の各命令の命令種別を示すパッチ命令種別情報を生成する。次に処理部は、ソースファイル内の各命令の命令種別を示すソース命令種別情報を生成する。さらに処理部は、パッチ命令種別情報とソース命令種別情報とに基づいて、ソースファイルから、修正命令列と命令種別の並びが一致する種別一致命令列を抽出する。そして処理部は、種別一致命令列と修正命令列との、変数名と関数名とを除外した記述内容に基づいて、ソースファイルにパッチが適用されているか否かを判定する。
【発明の効果】
【００１１】
１態様によれば、パッチの適用の有無が判定可能となる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態に係るパッチ適用確認方法の一例を示す図である。
【図２】第２の実施の形態のパッチ適用確認システムの一例を示す図である。
【図３】コンピュータのハードウェアの一例を示す図である。
【図４】修正パッチ適用可視化機能の一例を示すブロック図である。
【図５】修正パッチの一例を示す図である。
【図６】ソースファイルの一例を示す図である。
【図７】固定キーワード辞書の一例を示す図である。
【図８】修正パッチに対する命令種別判定の一例を示す図である。
【図９】配列を用いた修正パッチの命令種別判定処理の一例を示す図である。
【図１０】ソースファイルに対する命令種別判定の一例を示す図である。
【図１１】配列を用いたソースファイルの命令種別判定処理の一例を示す図である。
【図１２】パッチ導入箇所推定処理の一例を示す図である。
【図１３】マッチング処理の一例を示す図である。
【図１４】配列を用いたマッチング処理の一例を示す図である。
【図１５】マッチング結果の一例を示す図である。
【図１６】可変キーワードの対応関係の保存例を示す図である。
【図１７】類似度算出処理の一例を示す図である。
【図１８】パッチ適用情報の一例を示す図である。
【図１９】結果表示画面の一例を示す図である。
【図２０】修正パッチ適用可視化処理の手順の一例を示すフローチャートである。
【図２１】命令種別判定処理の手順の一例を示すフローチャートである。
【図２２】命令種別情報取得処理の手順の詳細を示すフローチャートの前半である。
【図２３】命令種別情報取得処理の手順の詳細を示すフローチャートの後半である。
【図２４】パッチ導入箇所推定処理の手順の一例を示すフローチャートである。
【図２５】マッチング処理の手順の一例を示すフローチャートである。
【図２６】類似度算出処理の手順の一例を示すフローチャートである。
【図２７】結果出力処理の手順の一例を示すフローチャートである。
【発明を実施するための形態】
【００１３】
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第１の実施の形態〕
まず第１の実施の形態について説明する。
【００１４】
図１は、第１の実施の形態に係るパッチ適用確認方法の一例を示す図である。図１の例では、情報処理装置１０を用いてパッチ適用確認方法を実施している。情報処理装置１０は、記憶部１１と処理部１２とを有する。記憶部１１は、例えば情報処理装置１０が有するメモリ、またはストレージ装置である。処理部１２は、例えば情報処理装置１０が有するプロセッサ、または演算回路である。情報処理装置１０は、例えばパッチ適用確認方法の処理手順を記述したパッチ適用確認プログラムを処理部１２に実行させることで、パッチ適用確認方法を実施することができる。
【００１５】
記憶部１１は、一部の命令列を修正命令列１ａに変更するパッチの適用対象であるソースファイル２を記憶する。
処理部１２は、修正命令列１ａを含むパッチファイル１に基づいて、修正命令列１ａ内の各命令の命令種別を示すパッチ命令種別情報３を生成する。例えばパッチファイル１には、ソースファイル２のどの命令を削除して、どのような命令を追加するのかが定義されている。処理部１２は、パッチファイル１を解析することで、パッチ適用後に、ソースファイル２内のパッチにより修正された部分が、どのような命令列になるのかを判断し、その命令列を修正命令列１ａとする。また処理部１２は、ソースファイル２内の各命令の命令種別を示すソース命令種別情報４を生成する。命令種別には、変数型を定義する「宣言」や、処理の実施条件を定義する「条件」や、変数または配列の要素に値を設定する「代入」などがある。
【００１６】
次に処理部１２は、パッチ命令種別情報３とソース命令種別情報４とに基づいて、ソースファイル２内の、修正命令列１ａと命令種別の並びが一致する種別一致命令列２ａの位置（命令種別一致箇所）を判定する。命令種別一致箇所は、例えばソースファイル２内のソースコードの行の範囲（何行目から何行目までか）で示される。そして処理部１２は、ソースファイル２から、命令種別一致箇所に記述された種別一致命令列２ａを抽出する。
【００１７】
処理部１２は、種別一致命令列２ａと修正命令列１ａとの、変数名と関数名とを除外した記述内容に基づいて、ソースファイル２にパッチが適用されているか否かを判定する。例えば処理部１２は、変数名と関数名とを除外した種別一致命令列２ａの記述内容と、変数名と関数名とを除外した修正命令列１ａの記述内容との類似度を算出する。そして処理部１２は、算出した類似度に基づいて、ソースファイル２にパッチが適用されているか否かを判定する。
【００１８】
類似度算出では、例えば処理部１２は、種別一致命令列２ａと修正命令列１ａとのそれぞれの命令行に先頭から順に行番号を付与する。そして処理部１２は、同じ行番号の行同士の記述の同一性を判定し、一致すると判定した行の割合を類似度とする。
【００１９】
行同士の同一性の判定では、例えば処理部１２は、比較対象の行内の単語同士を、行の先頭から順に比較する。その際、処理部１２は、例えば少なくとも単語の種別が同一であれば、単語が一致すると判定する。また処理部１２は、単語の種別だけでなく、単語の文字または記号が完全に同一の場合に、単語が一致すると判定してもよい。さらに処理部１２は、種別が同一であれば一致と判定する方法と、文字または記号が完全に同一であれば一致と判定する方法とのうち、採用する判定方法を、単語の種別に応じて決定してもよい。例えば処理部１２は、単語の種別が変数型の場合、種別が同一であれば、単語が一致すると判定し、単語の種別は算術演算子などの演算子の場合、文字または記号が完全に同一であれば、単語が一致すると判定する。
【００２０】
単語の種別の判定には、キーワード辞書を用いることができる。例えば記憶部１１は、行間の同一性の判定において比較対象とする単語のリストを含むキーワード辞書を記憶する。処理部１２は、種別一致命令列２ａの第１の行内のキーワード辞書に含まれる単語と、修正命令列１ａにおける、第１の行と同じ行番号の第２の行内のキーワード辞書に含まれる単語とを比較することで、同じ行番号の行同士の同一性を判定する。
【００２１】
類似度に基づくパッチ適用の有無の判定では、処理部１２は、類似度が１００％であれば、ソースファイル２にパッチが適用済みであると判定する。また処理部１２は、類似度が予め設定された閾値以上であれば、ソースファイル２にパッチが適用されている可能性が高いと判定する。さらに処理部１２は、類似度が閾値未満であれば、ソースファイル２に対してパッチが未適用であると判定する。
【００２２】
このようにして、変数名や関数名のように、変更の自由度が高く、システムの管理者が自由に変更できる単語を除外して、パッチの適用の有無を判断できる。すなわち処理部１２が、修正命令列１ａと命令種別の並びが同じ種別一致命令列２ａをソースファイル２から抽出することで、パッチの適用により修正される可能性の高い部分を適切に抽出できる。そして、パッチ適用で修正される可能性が高い部分である種別一致命令列２ａと修正命令列１ａとを比較して、パッチの適用の有無を判定することで、変数名や関数名を除外しても、高精度に判定することができる。
【００２３】
また処理部１２は、変数型の型の定義の変更のように、同一種別内で単語を変更してもプログラム上の処理のアルゴリズムに変更がないような単語については、種別が同一であれば一致すると判定することができる。これにより、パッチ適用の有無の判定精度が向上する。例えば図１の例では、修正命令列１ａの１行目の先頭の単語は、変数型の単語「ｓｈｏｒｔ」である。それに対して、種別一致命令列２ａの１行目の先頭の単語は、変数型の単語「ｉｎｔ」である。単語「ｓｈｏｒｔ」と単語「ｉｎｔ」は、変数型のうちの整数型と呼ばれる型の指定であり、変数に格納する値のサイズが異なるのみである。このような変数型の変更は、情報処理装置１０の使用者が独自に行っている可能性がある。そのため処理部１２は、変数型の単語については、種別が変数型で同一であれば、文字または記号が同一でなくても、類似度の算出時の比較においては、一致すると判定してもよい。これにより、ソースファイル２に対して変数型の変更の改変が加えられている場合でも、パッチの適用の有無を正しく判断できるようになる。
【００２４】
〔第２の実施の形態〕
次に第２の実施の形態について説明する。第２の実施の形態は、ＯＳＳを利用しているコンピュータにおける修正パッチの適用状況を可視化するものである。
【００２５】
図２は、第２の実施の形態のパッチ適用確認システムの一例を示す図である。ＯＳＳを利用しているコンピュータ１００は、ネットワーク２０を介してサーバ２００に接続されている。サーバ２００は、修正パッチを配布するコンピュータである。
【００２６】
コンピュータ１００は、ＯＳＳコミュニティがサーバ２００を用いて公開している修正パッチとソースファイルとの類似度に基づいて、ソースファイルへの修正パッチの適用の有無を判断する。
【００２７】
例えばコンピュータ１００に導入しているＯＳＳの脆弱性が、サーバ２００で配布されている修正パッチで修正できる場合、コンピュータ１００の管理者は、その修正パッチがコンピュータ１００に適用済みか否かを調査することとなる。このとき管理者は、パッチ適用確認プログラムをコンピュータ１００で実行することで、コンピュータ１００に修正パッチの適用状況を可視化させる。管理者は、例えば可視化された修正パッチの適用状況を参考にして、ソースコードの内容を確認し、修正パッチが正しく適用されているか否かを調査する。
【００２８】
図３は、コンピュータのハードウェアの一例を示す図である。コンピュータ１００は、プロセッサ１０１によって装置全体が制御されている。プロセッサ１０１には、バス１０９を介してメモリ１０２と複数の周辺機器が接続されている。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ（Central Processing Unit）、ＭＰＵ（Micro Processing Unit）、またはＤＳＰ（Digital Signal Processor）である。プロセッサ１０１がプログラムを実行することで実現する機能の少なくとも一部を、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）などの電子回路で実現してもよい。
【００２９】
メモリ１０２は、コンピュータ１００の主記憶装置として使用される。メモリ１０２には、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、メモリ１０２には、プロセッサ１０１による処理に利用する各種データが格納される。メモリ１０２としては、例えばＲＡＭ（Random Access Memory）などの揮発性の半導体記憶装置が使用される。
【００３０】
バス１０９に接続されている周辺機器としては、ストレージ装置１０３、グラフィック処理装置１０４、入力インタフェース１０５、光学ドライブ装置１０６、機器接続インタフェース１０７およびネットワークインタフェース１０８がある。
【００３１】
ストレージ装置１０３は、内蔵した記録媒体に対して、電気的または磁気的にデータの書き込みおよび読み出しを行う。ストレージ装置１０３は、コンピュータの補助記憶装置として使用される。ストレージ装置１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。なお、ストレージ装置１０３としては、例えばＨＤＤ（Hard Disk Drive）やＳＳＤ（Solid State Drive）を使用することができる。
【００３２】
グラフィック処理装置１０４には、モニタ２１が接続されている。グラフィック処理装置１０４は、プロセッサ１０１からの命令に従って、画像をモニタ２１の画面に表示させる。モニタ２１としては、有機ＥＬ（Electro Luminescence）を用いた表示装置や液晶表示装置などがある。
【００３３】
入力インタフェース１０５には、キーボード２２とマウス２３とが接続されている。入力インタフェース１０５は、キーボード２２やマウス２３から送られてくる信号をプロセッサ１０１に送信する。なお、マウス２３は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
【００３４】
光学ドライブ装置１０６は、レーザ光などを利用して、光ディスク２４に記録されたデータの読み取りを行う。光ディスク２４は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク２４には、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。
【００３５】
機器接続インタフェース１０７は、コンピュータ１００に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース１０７には、メモリ装置２５やメモリリーダライタ２６を接続することができる。メモリ装置２５は、機器接続インタフェース１０７との通信機能を搭載した記録媒体である。メモリリーダライタ２６は、メモリカード２７へのデータの書き込み、またはメモリカード２７からのデータの読み出しを行う装置である。メモリカード２７は、カード型の記録媒体である。
【００３６】
ネットワークインタフェース１０８は、ネットワーク２０に接続されている。ネットワークインタフェース１０８は、ネットワーク２０を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
【００３７】
コンピュータ１００は、以上のようなハードウェア構成によって、第２の実施の形態の処理機能を実現することができる。なおサーバ２００も、図３に示したコンピュータ１００と同様のハードウェアにより実現することができる。また第１の実施の形態に示した情報処理装置１０も、図３に示したコンピュータ１００と同様のハードウェアにより実現することができる。
【００３８】
コンピュータ１００は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第２の実施の形態の処理機能を実現する。コンピュータ１００に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、コンピュータ１００に実行させるプログラムをストレージ装置１０３に格納しておくことができる。プロセッサ１０１は、ストレージ装置１０３内のプログラムの少なくとも一部をメモリ１０２にロードし、プログラムを実行する。またコンピュータ１００に実行させるプログラムを、光ディスク２４、メモリ装置２５、メモリカード２７などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ１０１からの制御により、ストレージ装置１０３にインストールされた後、実行可能となる。またプロセッサ１０１が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
【００３９】
コンピュータ１００は、修正パッチの適用の有無を可視化するための修正パッチ適用可視化機能を有する。
図４は、修正パッチ適用可視化機能の一例を示すブロック図である。コンピュータ１００は、導入されているＯＳＳの修正パッチを、サーバ２００が有するリポジトリ２１０から取得し、取得した修正パッチの適用の有無を可視化することができる。修正パッチの適用の有無を可視化するために、コンピュータ１００は、図４に示す各要素を有する。すなわちコンピュータ１００は、ソースファイル記憶部１１０、固定キーワード辞書記憶部１２０、類似度閾値記憶部１３０、ソースコード取得部１４１、命令種別判定部１４２、命令種別記憶部１４３、パッチ導入箇所推定部１４４、パッチ導入推定箇所記憶部１４５、マッチング処理部１４６、マッチング結果記憶部１４７、類似度算出部１４８、類似度記憶部１４９、結果出力部１５０、およびパッチ適用情報記憶部１５１を有する。
【００４０】
ソースファイル記憶部１１０は、ＯＳＳのソースコードが記述されたソースファイルを記憶する。ソースファイルは、修正パッチ適用可視化処理の開始前に、予めソースファイル記憶部１１０に格納される。なおソースファイルに記述されているＯＳＳのソースコードは、変数名や関数名が変更されている場合がある。
【００４１】
固定キーワード辞書記憶部１２０は、固定キーワード辞書を記憶する。固定キーワード辞書は、ソースコードに含まれる単語を固定キーワードと可変キーワードとに分類する場合における、固定キーワードに該当する単語を示す情報である。固定キーワードは、例えば算術演算子のように、変更してしまうと、ソースファイルで示されるプログラムの処理内容が変わってしまう単語である。命令の終端を示す「；」のように、プログラミング言語の仕様上、他の文字に置き換えることが許容されない文字も、固定キーワードである。可変キーワードは、例えば変数名や関数名のように、変更してもソースファイルで示されるプログラムの処理内容が変わらない単語である。
【００４２】
また固定キーワード辞書には、各単語の種別（変数型、条件演算子など）が示されている。固定キーワード辞書は、修正パッチ適用可視化処理の開始前に、予め固定キーワード辞書記憶部１２０に格納される。
【００４３】
類似度閾値記憶部１３０は、修正パッチ導入推定箇所について、部分一致とするか不一致とするかを判定するための類似度の閾値を記憶する。類似度の閾値は、例えば「５０％」である。類似度の閾値は、修正パッチ適用可視化処理の開始前に、予め類似度閾値記憶部１３０に格納される。
【００４４】
ソースコード取得部１４１は、適用対象の修正パッチを示すパッチファイルに記述された修正用ソースコードと、その修正パッチを適用するＯＳＳのソースコードとを取得する。例えばソースコード取得部１４１は、ネットワーク２０を介して、サーバ２００内のリポジトリ２１０から、修正パッチの修正用ソースコードを取得する。またソースコード取得部１４１は、ソースファイル記憶部１１０内のソースファイルから、修正パッチを適用するＯＳＳのソースコードを取得する。
【００４５】
命令種別判定部１４２は、固定キーワード辞書に示された単語の種別に基づいて、修正パッチの修正用ソースコードと、ＯＳＳのソースファイル内のソースコードとのそれぞれについて、行ごとの命令種別を判定する。命令種別判定部１４２は、命令種別の判定結果を、命令種別記憶部１４３に格納する。
【００４６】
命令種別記憶部１４３は、修正パッチの修正用ソースコードとＯＳＳのソースコードとの行ごとの命令種別を記憶する。
パッチ導入箇所推定部１４４は、修正パッチのソースコードとＯＳＳのソースコードとの行ごとの命令種別に基づいて、ＯＳＳのソースコード内のパッチ導入推定箇所を特定する。パッチ導入推定箇所は、ＯＳＳのソースコードのうち、修正パッチに基づいて修正されている可能性がある部分である。パッチ導入箇所推定部１４４は、パッチ導入推定箇所を示す情報を、パッチ導入推定箇所記憶部１４５に格納する。
【００４７】
パッチ導入推定箇所記憶部１４５は、パッチ導入推定箇所を示す情報を記憶する。
マッチング処理部１４６は、固定キーワード辞書を参照し、パッチ導入推定箇所の各行の固定キーワードを、修正パッチの修正用ソースコードの各行の固定キーワードと比較し、行ごとの一致・不一致を判断する。マッチング処理部１４６は、一致・不一致の判断結果（マッチング結果）を、マッチング結果記憶部１４７に格納する。
【００４８】
マッチング結果記憶部１４７は、マッチング結果を記憶する。
類似度算出部１４８は、マッチング結果に基づいて、パッチ導入推定箇所と修正パッチとの類似度を算出する。そして類似度算出部１４８は、算出した類似度に基づいて、類似度のランク分けを行う。例えば類似度算出部１４８は、パッチ導入推定箇所の類似度が１００％一致の場合、そのパッチ導入推定箇所について完全一致と判定する。また類似度算出部１４８は、類似度閾値記憶部１３０に格納されている類似度の閾値に基づいて、パッチ導入推定箇所の類似度が閾値以上の場合、そのパッチ導入推定箇所について類似度高（部分一致）と判定する。また類似度算出部１４８は、パッチ導入推定箇所の類似度が閾値未満の場合、そのパッチ導入推定箇所について不一致と判定する。類似度算出部１４８は、算出した類似度と、類似度のランクとを、類似度記憶部１４９に格納する。
【００４９】
類似度記憶部１４９は、パッチ導入推定箇所の類似度と、類似度のランクとを記憶する。
結果出力部１５０は、類似度記憶部１４９に格納されたパッチ導入推定箇所の類似度に基づいて、ＯＳＳのソースファイルごとに、そのソースファイルへの修正パッチの適用状況を示すパッチ適用情報を生成する。さらに結果出力部１５０は、パッチ導入推定箇所のソースコードと修正パッチの修正用ソースコードとの比較情報を生成してもよい。そして結果出力部１５０は、パッチ適用情報またはソースコードの比較情報を、パッチ適用情報記憶部１５１に格納する。また結果出力部１５０は、パッチ適用情報またはソースコードの比較情報を、モニタ２１に表示させることもできる。
【００５０】
なお、図４に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。また、図４に示した各要素の機能は、例えば、その要素に対応するプログラムモジュールをコンピュータに実行させることで実現することができる。
【００５１】
次にサーバ２００のリポジトリ２１０に格納される修正パッチについて具体的に説明する。
図５は、修正パッチの一例を示す図である。リポジトリ２１０には、複数の修正パッチ２１１，２１２，・・・が格納されている。修正パッチ２１１，２１２，・・・には、ＯＳＳのソースファイルの修正内容を示す修正用ソースコードが記述されている。修正パッチ２１１，２１２，・・・において、先頭の文字が「＋」の行は、その行の「＋」に続く文字列を、ソースファイルに追加することを示している。また、修正パッチ２１１，２１２，・・・において、先頭の文字が「−」の行は、その行の「−」に続く文字列に対応する行を、ソースファイルから削除することを示している。
【００５２】
次にソースファイル記憶部１１０に格納されるソースファイルについて具体的に説明する。
図６は、ソースファイルの一例を示す図である。ソースファイル記憶部１１０には、複数のソースファイル１１１，１１２，・・・が格納されている。各ソースファイル１１１，１１２，・・・に記述されているソースコードは、一般に配布されているオリジナルのソースファイルに対して、変数名や関数名の書き換えが行われている可能性がある。例えばソースファイル１１１の「ｉｎｔ」は、オリジナルのソースファイルにおける「ｓｈｏｒｔ」から書き換えられたものである。
【００５３】
このように、ソースファイル１１１，１１２，・・・内のソースコードの書き換えが行われている場合がある。この場合、各ソースファイル１１１，１１２，・・・への適用の有無を判定する際に、変数名や関数名を含む検索キーによる修正箇所の検索を行っても、修正箇所を適切に検出することができない。そこでコンピュータ１００では、ソースコードから変数名や関数名を抽出し、変数名または関数名以外の記述を解析して、修正パッチの適用の有無を判断する。例えばコンピュータ１００は、修正パッチの適用の有無の判断には、固定キーワード辞書を用いる。
【００５４】
次に、固定キーワード辞書記憶部１２０に格納された固定キーワード辞書について、具体的に説明する。
図７は、固定キーワード辞書の一例を示す図である。固定キーワード辞書１２１は、例えば表形式のデータ構造となっている。固定キーワード辞書１２１の各行の第０列には、ソースコードに用いられる単語（記号を含む）の種別（単語種別）が設定されている。例えば「変数型」、「算術演算子」、「関係演算子」、「条件演算子」、「記号・引用符」、「その他」などの単語種別がある。固定キーワード辞書１２１の各行の第２列以降の各列には、その行に設定された単語種別に該当する単語が設定されている。
【００５５】
単語種別「変数型」は、変数の型（文字型、整数型、浮動小数点型など）を示す単語であり、例えば「ｉｎｔ」、「ｓｈｏｒｔ」などの型名を示す単語が該当する。
単語種別「算術演算子」は、算術演算を示す単語であり、例えば「＋」、「−」、「＊」、「／」、「％」などの記号が該当する。
【００５６】
単語種別「関係演算子」は、２つの対象の関係を判定するための単語であり、例えば「＝」、「＞」、「＜」、「≠」、「＝＝」、「！＝」などの記号が該当する。
単語種別「条件演算子」は、処理の分岐条件を定義するのに用いる単語であり、例えば「ｉｆ」、「ｗｈｉｌｅ」、「ｆｏｒ」などの単語が該当する。
【００５７】
単語種別「記号・引用符」は、続く文字が記号または引用符であることを示す単語であり、例えば「“」、「￥」、「’」などの記号が該当する。
単語種別「その他」は、上記の単語種別以外の固定キーワードであり、例えば「（」、「）」などの記号が該当する。
【００５８】
固定キーワード辞書１２１は、ソースコードの各行の命令種別の判定や、各単語が固定キーワードか可変キーワードかの判定に用いられる。命令種別の判定は、適用の有無の確認対象の修正パッチと、その修正パッチの適用対象のソースファイルとのそれぞれに対して行われる。
【００５９】
図８は、修正パッチに対する命令種別判定の一例を示す図である。ソースコード取得部１４１がリポジトリ２１０から、適用の有無の確認対象の修正パッチ２１１を取得し、取得した修正パッチ２１１を命令種別判定部１４２に送信する。すると命令種別判定部１４２が、修正パッチ２１１内のソースコードについて、１行ごとの命令種別を判定する。
【００６０】
例えば命令種別判定部１４２は、種別判別のために、種別判別に不要な修正パッチ２１１内の記載を削除する編集を行う。例えば命令種別判定部１４２は、以下の編集処理を行う。
【００６１】
（編集＃１）命令種別判定部１４２は、行頭が「−」の行を削除する。これにより、行の削除の命令の行が、修正パッチ２１１，２１２，・・・から削除され、該当行に関する命令種別の判定は行われなくなる。
【００６２】
（編集＃２）命令種別判定部１４２は、行頭が「＋」の行の先頭の「＋」の文字を削除する。
命令種別判定部１４２は、編集後の修正パッチ２１１ａに含まれるソースコードの各行について、固定キーワード辞書１２１に基づいて、以下のような基準で命令種別の判定を行う。修正パッチ２１１ａの各行の先頭に示されている数字は、命令種別判定対象の行の行番号であり、説明のために付与したものである。
【００６３】
（判定＃１）命令種別判定部１４２は、空白行、＃等のコメント行は、命令種別の判定を行わずに処理をスキップする。
（判定＃２）命令種別判定部１４２は、固定キーワード辞書１２１に登録されている単語種別（変数型、算術演算子など）を参照し、行頭の単語が「変数型」に登録されている単語と一致した場合は、該当行の命令種別を「宣言」と判定する。
【００６４】
（判定＃３）命令種別判定部１４２は、固定キーワード辞書１２１に登録されている単語種別（変数型、算術演算子など）を参照し、行頭の単語が「条件演算子」に登録されている単語と一致した場合は、該当行の命令種別を「条件」と判定する。
【００６５】
（判定＃４）命令種別判定部１４２は、行頭の単語が「変数型」と「条件演算子」とのいずれかに登録されている単語と一致せず、かつ行内に「＝」が出現した場合は、該当行の命令種別を「代入」と判定する。
【００６６】
（判定＃５）命令種別判定部１４２は、判定＃１〜＃４のいずれにも該当しない行の命令種別を、「その他」と判定する。
これにより、修正パッチ２１１ａに対応する命令種別情報３１が生成される。命令種別判定部１４２は、生成した命令種別情報３１を、命令種別記憶部１４３に格納する。例えば命令種別判定部１４２は、命令種別記憶部１４３内に設けられたパッチ意味用配列１４３ａの要素として、各行の命令種別を格納する。
【００６７】
図９は、配列を用いた修正パッチの命令種別判定処理の一例を示す図である。例えば命令種別判定部１４２は、作業用配列「tmp_mean_extract[]」を定義する。作業用配列のインデックスの値は、判定対象の行の単語の順番を示す番号である。単語の順番を示す番号は、行の先頭から順に、各単語に、０から昇順の番号が割り当てられているものとする。
【００６８】
例えば命令種別判定部１４２は、修正パッチ２１１ａの最初の行の命令種別を判定する際、判定対象の行内の各単語を、作業用配列に格納する。例えば「ｓｈｏｒｔ  ａｎｓ  ＝  −１；」の命令種別を判定する場合、「ｓｈｏｒｔ」、「ａｎｓ」、「＝」、「−１」、「；」の各単語が、作業用配列に格納される。なお、作業用配列は、判定対象の行が更新されるごとに初期化される。
【００６９】
命令種別判定部１４２は、作業用配列に格納した単語について、判定＃１〜＃５のどの判定条件を満たすのかを判断する。例えば命令種別判定部１４２は、固定キーワード辞書１２１を参照し、判定対象の行の先頭の単語「ｓｈｏｒｔ」の単語種別が「変数型」であることを認識する。その結果、命令種別判定部１４２は、判定対象の行が判定＃２の条件を満たしていると判断する。なお、判定対象の行内には「＝」が出現しているが、判定＃４では先頭の単語が「変数型」と「条件演算子」とのいずれでもないことが条件となっているため、判定＃４は満たしていない。そこで命令種別判定部１４２は、この行の命令種別を「宣言」と判定する。
【００７０】
命令種別判定部１４２は、判定結果をパッチ意味用配列１４３ａ「patch_mean_extract[]」に格納する。パッチ意味用配列１４３ａのインデックスの値は、編集後の修正パッチ２１１ａ内での判定対象の行の行番号である。行番号は、先頭行から順に、空白またはコメント行以外の各行に、０から昇順の番号が割り当てられているものとする。例えば修正パッチ２１１ａ内の先頭の行（行番号「０」）の命令種別は、インデックス値「０」の要素としてパッチ意味用配列１４３ａに格納される。
【００７１】
同様に、修正パッチ２１１の適用の有無の判定対象のソースファイルに対しても、命令種別の判定が行われる。
図１０は、ソースファイルに対する命令種別判定の一例を示す図である。命令種別判定部１４２は、ソースファイル記憶部１１０から判定対象のソースファイル１１１を取得し、ソースファイル１１１内のソースコードについて、１行ごとに命令種別を判定する。なおソースファイル１１１の各行の先頭に示されている数字は、命令種別判定対象の行の行番号であり、説明のために付与したものである。
【００７２】
例えば命令種別判定部１４２は、修正パッチに対する命令種別判定と同様に、判定＃１〜＃５を行い、ソースファイル１１１に対応する命令種別情報３２を生成する。そして命令種別判定部１４２は、生成した命令種別情報３２を命令種別記憶部１４３に格納する。例えば命令種別判定部１４２は、命令種別記憶部１４３内に設けられたソース意味用配列１４３ｂの要素として、各行の命令種別を格納する。
【００７３】
図１１は、配列を用いたソースファイルの命令種別判定処理の一例を示す図である。例えば命令種別判定部１４２は、ソースファイル１１１の最初の行の命令種別を判定する際、判定対象の行内の各単語を、作業用配列に格納する。例えば「ｉｎｔ  ｒｅｓ  ＝  −１；」の命令種別を判定する場合、「ｉｎｔ」、「ｒｅｓ」、「＝」、「−１」、「；」の各単語が、作業用配列に格納される。
【００７４】
命令種別判定部１４２は、作業用配列に格納した単語について、判定＃１〜＃５のどの判定条件を満たすのかを判断する。例えば命令種別判定部１４２は、固定キーワード辞書１２１を参照し、判定対象の行の先頭の単語「ｉｎｔ」の単語種別が「変数型」であることを認識する。その結果、命令種別判定部１４２は、判定対象の行が判定＃２の条件を満たしていると判断する。そこで命令種別判定部１４２は、この行の命令種別を「宣言」と判定する。
【００７５】
命令種別判定部１４２は、判定結果をソース意味用配列１４３ｂ「source_mean_extract[]」に格納する。ソース意味用配列１４３ｂのインデックスの値は、ソースファイル１１１内での判定対象の行の行番号である。行番号は、先頭行から順に、空白またはコメント行以外の各行に、０から昇順の番号が割り当てられているものとする。例えばソースファイル１１１内の「ｉｎｔ  ｒｅｓ  ＝  −１；」の行が２０行目（行番号「１９」）の場合、この行の命令種別は、インデックス値「１９」の要素としてソース意味用配列１４３ｂに格納される。
【００７６】
修正パッチ２１１ａとソースファイル１１１との命令種別判定が完了すると、命令種別情報３１，３２に基づいて、パッチ導入箇所推定部１４４が、修正パッチ適用によるソースファイル１１１内の修正対象の箇所を推定する。
【００７７】
図１２は、パッチ導入箇所推定処理の一例を示す図である。パッチ導入箇所推定部１４４は、修正パッチ２１１ａの命令種別情報３１とソースファイル１１１の命令種別情報３２とを比較する。そしてパッチ導入箇所推定部１４４は、ソースファイル１１１の命令種別情報３２の中から、修正パッチ２１１ａの命令種別情報３１の命令種別群と一致する命令種別群を抽出する。図１２の例では、修正パッチ２１１ａの命令種別情報３１には、「宣言」、「宣言」、「条件」、「代入」、「条件」、「代入」、「その他」、「その他」という並びで命令種別が示されている。パッチ導入箇所推定部１４４は、同じ命令種別の並びを、ソースファイル１１１の命令種別情報３２の中から抽出する。この場合、複数の箇所から抽出される場合もある。
【００７８】
パッチ導入箇所推定部１４４は、抽出した命令種別群に対応するソースファイル１１１内の部分を、パッチ導入推定箇所１１１ａ，１１１ｂとして特定する。そして、パッチ導入箇所推定部１４４は、パッチ導入推定箇所１１１ａ，１１１ｂを示す情報（パッチ導入推定箇所情報１４５ａ）を、パッチ導入推定箇所記憶部１４５に格納する。パッチ導入推定箇所情報１４５ａには、例えば、パッチ導入推定箇所を有するソースファイルのファイル名と、パッチ導入推定箇所の行番号とが示される。
【００７９】
パッチ導入推定箇所１１１ａ，１１１ｂが特定されると、次にマッチング処理部１４６により、マッチング処理が行われる。
図１３は、マッチング処理の一例を示す図である。マッチング処理部１４６は、固定キーワード辞書記憶部１２０内の固定キーワード辞書１２１を参照し、パッチ導入推定箇所１１１ａと修正パッチ２１１ａとに含まれる単語を、可変キーワードと固定キーワードとに分類する。すなわちマッチング処理部１４６は、固定キーワード辞書１２１に示されている単語を固定キーワードと判断し、それ以外の単語を可変キーワードと判断する。
【００８０】
そしてマッチング処理部１４６は、パッチ導入推定箇所１１１ａと修正パッチ２１１ａとの同一行番号の行同士の、固定キーワードの一致率を計算する。
図１３の例では、１行目は「一致」、２行目は「不一致」、３行目は「一致」となる。
【００８１】
以下、図１４〜図１６を参照して、マッチング処理を具体的に説明する。例えばマッチング処理部１４６は、パッチ導入推定箇所１１１ａと修正パッチ２１１ａとのソースコードを単語ごとに分割し、配列に格納する。そしてマッチング処理部１４６は、配列を用いてマッチング処理を行う。
【００８２】
図１４は、配列を用いたマッチング処理の一例を示す図である。パッチ導入推定箇所１１１ａ内の単語は、ソースマッチ用配列「source_comp[][]」に格納される。ソースマッチ用配列は２次元配列であり、１つ目のインデックスにはパッチ導入推定箇所１１１ａ内の行の行番号が設定され、２つ目のインデックスには行内の単語の順番を示す番号が設定される。ソースマッチ用配列には、１つ目のインデックスに示される行の、２つ目のインデックスに示される順番の単語が、それらのインデックス値に対応する要素として設定される。
【００８３】
修正パッチ２１１ａ内の単語は、パッチマッチ用配列「patch_comp[][]」に格納される。パッチマッチ用配列は２次元配列であり、１つ目のインデックスには修正パッチ２１１ａ内の行の行番号が設定され、２つ目のインデックスには行内の単語の順番を示す番号が設定される。パッチマッチ用配列には、１つ目のインデックスに示される行の、２つ目のインデックスに示される順番の単語が、それらのインデックス値に対応する要素として設定される。
【００８４】
そしてマッチング処理部１４６は、パッチ導入推定箇所１１１ａと修正パッチ２１１ａとの行ごとの比較を行う際、ソースマッチ用配列とパッチマッチ用配列との、同じインデックス値に設定されている単語同士を比較する。マッチング処理部１４６は、同一行番号の行内の単語同士の比較により、その行の一致・不一致を判定し、判定結果を結果格納用配列「result_comp[][]」に格納する。結果格納用配列は２次元配列であり、１つ目のインデックスには判定対象の行の行番号が設定され、２つ目のインデックスには行内の単語の順番を示す番号が設定される。図１４の例では、比較対象の行の先頭の単語に対応付けて、比較結果が格納されている。すなわち結果格納用配列には、１つ目のインデックスに示される行の判定結果が、２つ目のインデックス値「０」の要素として設定される。
【００８５】
図１５は、マッチング結果の一例を示す図である。例えばパッチ導入推定箇所１１１ａの１行目は、「ｉｎｔ  ｒｅｓ  ＝  −１；」である。この行には、固定キーワードが３単語（「ｉｎｔ」、「＝」、「；」）含まれている。また可変キーワードが２単語（「ｒｅｓ」、「−１」）含まれている。
【００８６】
また修正パッチ２１１ａの１行目は「ｓｈｏｒｔ  ａｎｓ  ＝  −１；」である。この行には、固定キーワードが３単語（「ｓｈｏｒｔ」、「＝」、「；」）含まれている。また可変キーワードが２単語（「ａｎｓ」、「−１」）含まれている。
【００８７】
１行目の行同士を比較すると、パッチ導入推定箇所１１１ａの固定キーワード「ｉｎｔ」が、修正パッチ２１１ａの固定キーワード「ｓｈｏｒｔ」に対応する。「ｉｎｔ」と「ｓｈｏｒｔ」とは、固定キーワード辞書１２１において、いずれも「変数型」であることが示されている。マッチング処理部１４６は、このように単語種別が「変数型」の固定キーワード同士は、一致すると判定する。またマッチング処理部１４６は、単語種別が「変数型」以外の場合、単語の１以上の文字または記号がすべて同じ場合、単語が一致すると判定する。パッチ導入推定箇所１１１ａの１行目と修正パッチ２１１ａの１行目との残りの固定キーワード「＝」、「；」はいずれも記号が一致している。その結果、マッチング処理部１４６は、１行目の固定キーワードの一致率を１００％とする。
【００８８】
パッチ導入推定箇所１１１ａの２行目は、「ｉｎｔ  ｃ  ＝  ｒｅｓ  ＋  １；」である。この行には、固定キーワードが４単語（「ｉｎｔ」、「＝」、「＋」、「；」）含まれている。また可変キーワードが３単語（「ｃ」、「ｒｅｓ」、「１」）含まれている。
【００８９】
また修正パッチ２１１ａの２行目は「ｓｈｏｒｔ  ｘ；」である。この行には、固定キーワードが２単語（「ｓｈｏｒｔ」、「；」）含まれている。また可変キーワードが１単語（「ｘ」）含まれている。
【００９０】
２行目の行同士を比較すると、パッチ導入推定箇所１１１ａの固定キーワード「ｉｎｔ」が、修正パッチ２１１ａの固定キーワード「ｓｈｏｒｔ」に対応する。「ｉｎｔ」と「ｓｈｏｒｔ」とは、固定キーワード辞書１２１において、いずれも「変数型」であるため、マッチング処理部１４６は固定キーワードが一致すると判定する。パッチ導入推定箇所１１１ａの２行目の固定キーワード「＝」（３番目の単語）は追加された単語であり、修正パッチ２１１ａの２行目には対応する固定キーワードが存在しない。そのためマッチング処理部１４６は、固定キーワード「＝」については不一致と判定する。パッチ導入推定箇所１１１ａの２行目の固定キーワード「；」は７番目の単語であり、修正パッチ２１１ａには７番目の単語は存在しない。そのためマッチング処理部１４６は、固定キーワード「；」については不一致と判定する。その結果、マッチング処理部１４６は、２行目の固定キーワードの一致率を３３％（１／３）とする。なお一致率は、例えば判定対象の２つ行のうちの固定キーワードを多く含む行の固定キーワード数で、一致した固定キーワード数を除算することにより求められる。
【００９１】
マッチング処理部１４６は、行単位での比較結果をマッチング結果記憶部１４７内の結果格納用配列１４７ａに格納する。
なおマッチング処理部１４６は、マッチング処理では、可変キーワードの変換前と変換後との対応関係を、メモリ１０２などに記憶しておくことができる。記憶した対応関係は、以後の可変キーワードの特定に利用することができる。
【００９２】
図１６は、可変キーワードの対応関係の保存例を示す図である。図１６の例では、パッチ導入推定箇所１１１ａにおける「ｒｅｓ」、「−１」、「＊ｓ」それぞれと、修正パッチ２１１ａの「ａｎｓ」、「−１」、「＊ｚ」それぞれとの対応関係が、メモリ１０２に保存される。マッチング処理部１４６は、例えば保存された対応関係を用いて、改変された可変キーワードを容易に検出することができる。例えばマッチング処理部１４６は、可変キーワードとして記憶した単語については、固定キーワード辞書１２１と照合するまでもなく、可変キーワードと判断する。
【００９３】
また改変された可変キーワードを記憶しておくことで、例えば修正パッチの適用状況を表示する際に、結果出力部１５０が、保存された可変キーワードに基づいて、改変された可変キーワードを強調表示することもできる。
【００９４】
マッチング処理が完了すると、類似度算出部１４８により、パッチ導入推定箇所１１１ａと修正パッチ２１１ａとの類似度が算出される。
図１７は、類似度算出処理の一例を示す図である。類似度算出部１４８は、パッチ導入推定箇所１１１ａと修正パッチ２１１ａとの行単位での比較結果に基づいて、一致する行の割合（一致率）を、類似度として計算する。図１７の例では、８行のうちの７行で一致しており、類似度は８７．５％である。
【００９５】
次に類似度算出部１４８は、類似度のランク分けを行う。例えば類似度算出部１４８は、類似度が１００％であれば一致と判定する。また類似度算出部１４８は、類似度が１００％未満で、類似度閾値記憶部１３０に格納されている類似度閾値１３１以上であれば、類似度高と判定する。類似度高は、部分一致（partial match）と呼ぶこともある。さらに類似度算出部１４８は、類似度閾値１３１未満であれば、不一致と判定する。図１７の例では、類似度閾値１３１は５０％である。そして類似度算出部１４８は、算出した類似度とランクとを示す類似度情報１４９ａを、類似度記憶部１４９に格納する。
【００９６】
類似度算出後、結果出力部１５０が、パッチ適用情報記憶部１５１内のパッチ適用情報に、パッチ適用判定結果を出力する。
図１８は、パッチ適用情報の一例を示す図である。パッチ適用情報１５１ａには、ソースファイルのファイル名が示された列の各行に、その行に対応する修正パッチのソースファイルへの適用状況が示されている。図１８の例では、ソースファイル内のパッチ導入推定箇所の類似度が１００％の場合（完全一致）、二重丸が設定される。またソースファイル内のパッチ導入推定箇所の類似度が１００％未満でかつ閾値以上の場合（類似度高）、丸印が設定される。さらにソースファイル内のパッチ導入推定箇所の類似度が閾値未満の場合（不一致）、ばつ印が設定される。なお、１つのソースファイルについて、パッチ導入推定箇所が複数検出された場合、パッチ導入推定箇所ごとの適用状況がパッチ適用情報１５１ａに設定される。
【００９７】
類似度に基づくランク分けにより、完全一致の場合と類似度高の場合とは、修正パッチ適用済みであると推定できる。またランク分けにより不一致とされた場合、修正パッチ未適用であると推定できる。なお修正パッチの適用対象外のソースファイルに対しては、パッチ適用の判定が行われておらず、空欄「−」となっている。
【００９８】
また結果出力部１５０は、ユーザからの指示に従って、パッチ適用情報１５１ａをモニタ２１に表示する。結果出力部１５０は、ソースファイルと修正パッチとを指定した表示指示を受け付けると、パッチ導入推定箇所と修正パッチとの比較結果を含む結果表示画面をモニタ２１に表示することもできる。
【００９９】
図１９は、結果表示画面の一例を示す図である。結果表示画面４１には、修正パッチ導入推定箇所ごとの、算出した類似度（８７．５％）と、類似度のランク（partial match）が示されている。また結果表示画面４１には、修正パッチ導入推定箇所ごとに、修正パッチ導入推定箇所のソースコードと修正パッチのソースコードとが対比して表示されている。
【０１００】
以下、修正パッチ適用可視化処理の手順について、詳細に説明する。
図２０は、修正パッチ適用可視化処理の手順の一例を示すフローチャートである。以下、図２０に示す処理をステップ番号に沿って説明する。
【０１０１】
［ステップＳ１０１］命令種別判定部１４２は、命令種別判定処理を行う。命令種別判定処理では、修正パッチのソースコードとＯＳＳのソースファイル内のソースコードとの行ごとの命令種別が判定される。命令種別判定処理の詳細は後述する（図２１参照）。
【０１０２】
［ステップＳ１０２］命令種別判定部１４２は、パッチ導入箇所推定処理を行う。パッチ導入箇所推定処理では、ソースファイル内のソースコードの中から、パッチ適用により修正された可能性がある箇所（１以上の連続の行）が検出される。パッチ導入箇所推定処理の詳細は後述する（図２４参照）。
【０１０３】
［ステップＳ１０３］命令種別判定部１４２は、修正パッチ導入推定箇所が少なくとも１つ抽出できたか否かを判断する。命令種別判定部１４２は、修正パッチ導入推定箇所が抽出できた場合、処理をステップＳ１０４に進める。また命令種別判定部１４２は、修正パッチ導入推定箇所が抽出できなかった場合、処理をステップＳ１０６に進める。
【０１０４】
［ステップＳ１０４］マッチング処理部１４６は、マッチング処理を行う。マッチング処理では、修正パッチ導入推定箇所と修正パッチとのソースコードについて、行ごとに比較され、一致・不一致が判定される。マッチング処理の詳細は後述する（図２５参照）。
【０１０５】
［ステップＳ１０５］類似度算出部１４８は、類似度算出処理を行う。類似度算出処理では、マッチング処理の結果に基づいて、修正パッチ導入推定箇所と修正パッチとの類似度が算出される。類似度算出処理の詳細は後述する（図２６参照）。
【０１０６】
［ステップＳ１０６］結果出力部１５０は、結果出力処理を行う。結果出力処理では、ソースファイルに対して修正パッチが適用されているか否かを示す情報の格納、または表示が行われる。結果出力処理の詳細は後述する（図２７参照）。
【０１０７】
次に、図２０に示す各ステップの処理の詳細を説明する。
図２１は、命令種別判定処理の手順の一例を示すフローチャートである。以下、図２１に示す処理をステップ番号に沿って説明する。
【０１０８】
［ステップＳ１１１］命令種別判定部１４２は、修正パッチとＯＳＳのソースファイルとを取得する。例えばソースコード取得部１４１が、サーバ２００内のリポジトリ２１０から修正パッチを取得すると共に、ソースファイル記憶部１１０からＯＳＳのソースファイルを取得する。そして、命令種別判定部１４２は、ソースコード取得部１４１から修正パッチとソースファイルとを取得する。
【０１０９】
［ステップＳ１１２］命令種別判定部１４２は、固定キーワード辞書記憶部１２０から固定キーワード辞書１２１を取得する。
［ステップＳ１１３］命令種別判定部１４２は、修正パッチとＯＳＳのソースファイルとのそれぞれについて、命令種別情報取得処理を行う。命令情報取得処理の詳細は、図２２、図２３を参照して説明する。
【０１１０】
図２２は、命令種別情報取得処理の手順の詳細を示すフローチャートの前半である。以下、図２２に示す処理をステップ番号に沿って説明する。
［ステップＳ１２１］命令種別判定部１４２は、配列のインデックスの値を示す変数ｉに初期値「０」を設定する。
【０１１１】
［ステップＳ１２２］命令種別判定部１４２は、修正パッチまたはソースファイル内に未選択の行があるか否かを判断する。命令種別判定部１４２は、未選択の行がある場合、処理をステップＳ１２３に進める。また命令種別判定部１４２は、すべての行が選択済みの場合、命令種別情報取得処理を終了する。
【０１１２】
［ステップＳ１２３］命令種別判定部１４２は、修正パッチまたはソースファイルの先頭から順に、未選択の次の行を選択する。
［ステップＳ１２４］命令種別判定部１４２は、選択した行から単語を抽出し、作業用配列に格納する。
【０１１３】
［ステップＳ１２５］命令種別判定部１４２は、選択した行の先頭に「−」があるか否かを判断する。例えば命令種別判定部１４２は、作業用配列の最初の要素に「−」の単語が格納されていれば、先頭に「−」があると判断する。命令種別判定部１４２は、先頭に「−」がある場合、処理をステップＳ１２６に進める。また命令種別判定部１４２は、先頭に「−」がないと判断した場合、処理をステップＳ１２７に進める。
【０１１４】
なお先頭に「−」が設定された行を含むのは修正パッチのみである。そのためソースファイルに対する命令種別情報取得処理を行う場合、ステップＳ１２５，Ｓ１２６の処理をスキップしてもよい。
【０１１５】
［ステップＳ１２６］命令種別判定部１４２は、修正パッチの選択された行を削除する。命令種別判定部１４２は、その後、処理をステップＳ１２３に進める。
［ステップＳ１２７］命令種別判定部１４２は、選択した行が空白行またはコメント行であるか否かを判断する。例えば命令種別判定部１４２は、「＃」で始まる行をコメント行と判断する。命令種別判定部１４２は、空白行またはコメント行の場合、処理をステップＳ１２３に進める。また命令種別判定部１４２は、空白行およびコメント行のいずれでもなければ、処理をステップＳ１２８に進める。
【０１１６】
［ステップＳ１２８］命令種別判定部１４２は、選択した行の先頭に「＋」が単体で存在するか否かを判断する。命令種別判定部１４２は、先頭に「＋」が単体で存在する場合、処理をステップＳ１２９に進める。また命令種別判定部１４２は、先頭に「＋」が単体で存在しない場合、処理をステップＳ１３１（図２３参照）に進める。
【０１１７】
なお先頭に「＋」が単独で設定された行を含むのは修正パッチのみである。そのためソースファイルに対する命令種別情報取得処理を行う場合、ステップＳ１２８，Ｓ１２９の処理をスキップしてもよい。
【０１１８】
［ステップＳ１２９］命令種別判定部１４２は、修正パッチの選択された行から、先頭の「＋」を削除する。その後、命令種別判定部１４２は、処理をステップＳ１３１（図２３参照）に進める。
【０１１９】
図２３は、命令種別情報取得処理の手順の詳細を示すフローチャートの後半である。以下、図２３に示す処理をステップ番号に沿って説明する。
［ステップＳ１３１］命令種別判定部１４２は、選択した行の先頭に、固定キーワード辞書１２１において「変数型」とされている単語があるか否かを判断する。行の先頭の単語が「ｉｎｔ」や「ｓｈｏｒｔ」などの変数型を指定する単語の場合、その行は、変数型を宣言する命令文であると考えられる。命令種別判定部１４２は、先頭の単語が変数型の場合、処理をステップＳ１３２に進める。また命令種別判定部１４２は、先頭の単語が変数型でなければ、処理をステップＳ１３３に進める。
【０１２０】
［ステップＳ１３２］命令種別判定部１４２は、ソース意味用配列１４３ｂまたはパッチ意味用配列１４３ａのｉ番目の要素に、「宣言」を格納する。例えば命令種別判定部１４２は、ソースファイルに対して命令種別情報取得処理を行っている場合、ソース意味用配列１４３ｂの要素に「宣言」を格納する。また命令種別判定部１４２は、修正パッチに対して命令種別情報取得処理を行っている場合、パッチ意味用配列１４３ａの要素に「宣言」を格納する。その後、命令種別判定部１４２は、処理をステップＳ１３８に進める。
【０１２１】
［ステップＳ１３３］命令種別判定部１４２は、選択した行の先頭に、固定キーワード辞書１２１において「条件演算子」とされている単語があるか否かを判断する。行の先頭の単語が「ｉｆ」、「ｗｈｉｌｅ」などの条件演算子の場合、その行は、処理の条件を定義する命令文であると考えられる。命令種別判定部１４２は、先頭の単語が条件演算子の場合、処理をステップＳ１３４に進める。また命令種別判定部１４２は、先頭の単語が条件演算子でなければ、処理をステップＳ１３５に進める。
【０１２２】
［ステップＳ１３４］命令種別判定部１４２は、ソース意味用配列１４３ｂまたはパッチ意味用配列１４３ａのｉ番目の要素に、「条件」を格納する。例えば命令種別判定部１４２は、ソースファイルに対して命令種別情報取得処理を行っている場合、ソース意味用配列１４３ｂの要素に「条件」を格納する。また命令種別判定部１４２は、修正パッチに対して命令種別情報取得処理を行っている場合、パッチ意味用配列１４３ａの要素に「条件」を格納する。その後、命令種別判定部１４２は、処理をステップＳ１３８に進める。
【０１２３】
［ステップＳ１３５］命令種別判定部１４２は、選択した行の中に、「＝」が単体で存在するか否かを判断する。行の中に「＝」が単体である場合、その行は、変数への値の代入を指示する命令文であると考えられる。命令種別判定部１４２は、「＝」が単体で存在する場合、処理をステップＳ１３６に進める。また命令種別判定部１４２は、単体の「＝」が存在しない場合、処理をステップＳ１３７に進める。
【０１２４】
［ステップＳ１３６］命令種別判定部１４２は、ソース意味用配列１４３ｂまたはパッチ意味用配列１４３ａのｉ番目の要素に、「代入」を格納する。例えば命令種別判定部１４２は、ソースファイルに対して命令種別情報取得処理を行っている場合、ソース意味用配列１４３ｂの要素に「代入」を格納する。また命令種別判定部１４２は、修正パッチに対して命令種別情報取得処理を行っている場合、パッチ意味用配列１４３ａの要素に「代入」を格納する。その後、命令種別判定部１４２は、処理をステップＳ１３８に進める。
【０１２５】
［ステップＳ１３７］命令種別判定部１４２は、ソース意味用配列１４３ｂまたはパッチ意味用配列１４３ａのｉ番目の要素に、「その他」を格納する。例えば命令種別判定部１４２は、ソースファイルに対して命令種別情報取得処理を行っている場合、ソース意味用配列１４３ｂの要素に「その他」を格納する。また命令種別判定部１４２は、修正パッチに対して命令種別情報取得処理を行っている場合、パッチ意味用配列１４３ａの要素に「その他」を格納する。
【０１２６】
［ステップＳ１３８］命令種別判定部１４２は、変数ｉの値を１だけインクリメントする。その後、命令種別判定部１４２は、処理をステップＳ１２２（図２２参照）に進める。
【０１２７】
このように、命令種別判定部１４２は、図２２、図２３に示すような命令種別情報取得処理を、修正パッチとソースファイルとのそれぞれのすべての行に対して実行することで、各行の命令種別を示す情報（命令種別情報）を取得する。そしてパッチ導入箇所推定部１４４により、命令種別情報に基づいてパッチ導入箇所推定処理が行われる。
【０１２８】
図２４は、パッチ導入箇所推定処理の手順の一例を示すフローチャートである。以下、図２４に示す処理をステップ番号に沿って説明する。
［ステップＳ１４１］パッチ導入箇所推定部１４４は、修正パッチの修正用ソースコードとＯＳＳのソースコードとの行単位の命令種別情報を取得する。
【０１２９】
［ステップＳ１４２］パッチ導入箇所推定部１４４は、修正パッチの修正用ソースコードの命令種別情報とＯＳＳのソースコードの命令種別情報とを比較する。パッチ導入箇所推定部１４４は、修正パッチの修正用ソースコードの命令種別情報に示される命令種別と、命令種別の並びが一致する部分（ブロック）を、ＯＳＳのソースコードの命令種別情報から検索する。
【０１３０】
［ステップＳ１４３］パッチ導入箇所推定部１４４は、一致するブロックがあるか否かを判断する。パッチ導入箇所推定部１４４は、一致するブロックが検出できた場合、処理をステップＳ１４４に進める。またパッチ導入箇所推定部１４４は、一致するブロックが検出できなければ、パッチ導入箇所推定処理を終了する。
【０１３１】
［ステップＳ１４４］パッチ導入箇所推定部１４４は、ＯＳＳのソースコード内の一致するすべてのブロックを示す情報を、パッチ導入推定箇所としてすべて抽出する。パッチ導入推定箇所には、例えばブロックに含まれる１以上の連続する行のＯＳＳのソースコード内での位置が示される。パッチ導入箇所推定部１４４は、その後、パッチ導入箇所指定処理を終了する。
【０１３２】
パッチ導入箇所推定処理により１以上のパッチ導入推定箇所が特定できた場合、パッチ導入推定箇所と修正パッチとのマッチング処理が行われる。
図２５は、マッチング処理の手順の一例を示すフローチャートである。以下、図２５に示す処理をステップ番号に沿って説明する。
【０１３３】
［ステップＳ１５１］マッチング処理部１４６は、修正パッチの修正用ソースコードを取得する。またマッチング処理部１４６は、ＯＳＳのソースコード内のパッチ導入推定箇所を取得する。例えばマッチング処理部１４６は、パッチ導入推定箇所情報１４５ａ（図１２参照）に基づいて、ソースファイル内のパッチ導入推定箇所を認識し、該当箇所に示される１以上の行を取得する。
【０１３４】
［ステップＳ１５２］マッチング処理部１４６は、固定キーワード辞書記憶部１２０から固定キーワード辞書１２１を取得する。
［ステップＳ１５３］マッチング処理部１４６は、ソースマッチ用配列とパッチマッチ用配列とに単語を格納する。
【０１３５】
［ステップＳ１５４］マッチング処理部１４６は、ソースマッチ用配列とパッチマッチ用配列とに基づいて、パッチ導入推定箇所と修正パッチの修正用ソースコードを行単位で比較し、一致・不一致を判断する。例えばマッチング処理部１４６は、比較対象の２つの行のうちの一方の行の固定キーワードと、その固定キーワードと同じ位置（先頭からの単語の順番）にある他方の行の単語とを比較する。そしてマッチング処理部１４６は、一方の行の固定キーワードと同じ種別および文字の固定キーワードが、他の行の同じ位置にある場合、それらの固定キーワードが一致していると判断する。なおマッチング処理部１４６は、一方の行の固定キーワードの種別が「変数型」の場合、「変数型」の固定キーワードが他の行の同じ位置にある場合、それらの固定キーワードが一致していると判断する。
【０１３６】
［ステップＳ１５５］マッチング処理部１４６は、固定キーワードの一致または不一致を示す情報を、結果格納用配列１４７ａ（図１５参照）に格納する。
［ステップＳ１５６］マッチング処理部１４６は、固定キーワードが一致すると判定した行の可変キーワードの対応関係を、メモリ１０２に保存する。
【０１３７】
マッチング処理が完了すると、類似度算出部１４８が類似度算出処理を行う。
図２６は、類似度算出処理の手順の一例を示すフローチャートである。以下、図２６に示す処理をステップ番号に沿って説明する。
【０１３８】
［ステップＳ１６１］類似度算出部１４８は、マッチング結果を取得する。例えば類似度算出部１４８は、結果格納用配列１４７ａに格納された情報を読み取る。
［ステップＳ１６２］類似度算出部１４８は、類似度閾値記憶部１３０から類似度閾値１３１（図１７参照）を取得する。
【０１３９】
［ステップＳ１６３］類似度算出部１４８は、パッチ導入推定箇所と修正パッチとの一致度を算出する。例えば類似度算出部１４８は、結果格納用配列１４７ａに設定された一致・不一致の判断結果すべてのうちの、一致と判断された割合（一致率）を、類似度として算出する。この際、類似度算出部１４８は、類似度のランク分けをすることもできる。例えば類似度算出部１４８は、類似度が１００％であれば、類似度のランクを「一致」とする。また類似度算出部１４８は、類似度が１００％未満、類似度閾値以上であれば、類似度のランクを「類似度高（または部分一致：partial match）」とする。また類似度算出部１４８は、類似度が類似度閾値未満であれば、類似度のランクを「不一致」とする。
【０１４０】
［ステップＳ１６４］類似度算出部１４８は、類似度を示す類似度情報１４９ａ（図１７参照）を出力する。
類似度が算出されると、結果出力部１５０により、結果出力処理が行われる。
【０１４１】
図２７は、結果出力処理の手順の一例を示すフローチャートである。以下、図２７に示す処理をステップ番号に沿って説明する。
［ステップＳ１７１］結果出力部１５０は、類似度情報とパッチ導入推定箇所情報とを取得する。また結果出力部１５０は、ソースコード取得部１４１から、取得した修正パッチのパッチ名と、取得したソースファイルのファイル名とを取得する。
【０１４２】
［ステップＳ１７２］結果出力部１５０は、パッチ適用情報記憶部１５１から、パッチ適用情報１５１ａを取得する。
［ステップＳ１７３］結果出力部１５０は、類似度情報とパッチ導入推定箇所情報に基づいて、パッチ適用情報１５１ａを更新する。例えば結果出力部１５０は、パッチ名とソースファイル名との組に対応付けて、類似度情報とパッチ導入推定箇所情報とを、パッチ適用情報１５１ａに格納する。また結果出力部１５０は、パッチ適用情報１５１ａをモニタ２１に表示することもできる。
【０１４３】
このようにして、ＯＳＳのソースファイルの変数名や関数名が変更されていても、ソースファイルに対する修正パッチの適用の有無を適切に判断し、判断結果を可視化することができる。
【０１４４】
［その他の実施の形態］
第２の実施の形態では、ＯＳＳに修正パッチを適用する場合を想定しているが、第２の実施の形態に示したパッチ適用確認方法は、ＯＳＳ以外のソフトウェアにも適用可能である。
【０１４５】
また第２の実施の形態では、マッチング処理部１４６は、種別が変数型の単語については、比較される２つの単語が共に変数型であれば一致と判定しているが、変数型の単語について、文字または記号が同一の場合に一致と判定するようにしてもよい。例えば比較対象の単語が、変数型のうちの文字型を指定する「ｃｈａｒ」と整数型を指定する「ｉｎｔ」との場合、マッチング処理部１４６は、これらの単語の種別は同じ変数型であるが、文字が異なるため不一致と判定する。
【０１４６】
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の２以上の構成（特徴）を組み合わせたものであってもよい。
【符号の説明】
【０１４７】
１  パッチファイル
１ａ  修正命令列
２  ソースファイル
２ａ  種別一致命令列
１０  情報処理装置
１１  記憶部
１２  処理部
【図１】
2020013385.tif 000003
【図２】
2020013385.tif 000004
【図３】
2020013385.tif 000005
【図４】
2020013385.tif 000006
【図５】
2020013385.tif 000007
【図６】
2020013385.tif 000008
【図７】
2020013385.tif 000009
【図８】
2020013385.tif 000010
【図９】
2020013385.tif 000011
【図１０】
2020013385.tif 000012
【図１１】
2020013385.tif 000013
【図１２】
2020013385.tif 000014
【図１３】
2020013385.tif 000015
【図１４】
2020013385.tif 000016
【図１５】
2020013385.tif 000017
【図１６】
2020013385.tif 000018
【図１７】
2020013385.tif 000019
【図１８】
2020013385.tif 000020
【図１９】
2020013385.tif 000021
【図２０】
2020013385.tif 000022
【図２１】
2020013385.tif 000023
【図２２】
2020013385.tif 000024
【図２３】
2020013385.tif 000025
【図２４】
2020013385.tif 000026
【図２５】
2020013385.tif 000027
【図２６】
2020013385.tif 000028
【図２７】
2020013385.tif 000029