(57)【要約】      （修正有）【課題】ソースプログラムに関して静的解析プログラムが出力する情報から、不具合である可能性の高い情報を抽出する。【解決手段】出力判定装置１０１は、ソースプログラムから静的解析手段が抽出したフローと、フローから抽出した命令文とに基づき、ソースプログラムにおいて命令文を含む第１関数を特定し第１関数識別子を抽出する処理抽出部１０２と、ソースプログラムにおいて、第１関数を呼び出す第２関数を特定し第２関数識別子を抽出するとともに、第１関数が呼び出す第３関数を特定し第３関数識別子を抽出する関数抽出部１０３と、第１と第２ソースプログラムから抽出された第１と第２及び第３関数識別子が各々一致するかを判定し、いずれも一致すると判定した場合に、静的解析手段が第２ソースプログラムにおいて抽出した第２フローを出力せず、いずれかが一致しないと判定した場合に、第２フローを出力することを決定する出力決定部１０４を有する。【選択図】図１
2016128941.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムを静的に解析する静的解析手段が、前記ソースプログラムから抽出したフローと、前記フローから抽出した命令文とに基づき、前記ソースプログラムにおいて前記命令文を含む第１関数を特定し、特定した前記第１関数に関して、関数を一意に識別可能な関数識別子を第１関数識別子として抽出する処理抽出手段と、
前記ソースプログラムにおいて、前記第１関数識別子が表す前記関数を呼び出す第２関数を特定し、特定した前記第２関数を表す第２関数識別子を抽出するとともに、前記ソースプログラムにおいて前記第１関数識別子が表す前記関数が呼び出す第３関数を特定し、特定した前記第３関数を表す第３関数識別子を抽出する関数抽出手段と、
第１ソースプログラムにおいて抽出された前記第１関数識別子と、第２ソースプログラムにおいて抽出された前記第１関数識別子とが一致するか否か、前記第１ソースプログラムにおいて抽出された前記第２関数識別子と、前記第２ソースプログラムにおいて抽出された前記第２関数識別子とが一致するか否か、及び、前記第１ソースプログラムにおいて抽出された前記第３関数識別子と、前記第２ソースプログラムにおいて抽出された前記第３関数識別子とが一致するか否かを判定し、（ａ）いずれも一致すると判定した場合に、前記静的解析手段が前記第２ソースプログラムにおいて抽出した第２フローを出力せず、（ｂ）いずれかが一致しないと判定した場合に、前記第２フローを出力することを決定する出力決定手段と
備える出力判定装置。
【請求項２】
前記ソースプログラムにおいて、前記第３関数が出力する値の型を抽出する型抽出手段
をさらに備え、
前記出力決定手段は、前記（ａ）である場合に、前記第３関数に関して、前記第１ソースプログラムにおいて抽出された前記型と、前記第２ソースプログラムにおいて抽出された前記型とが一致するか否かを判定し、（ｃ）一致すると判定する場合に、前記第２フローを出力せず、（ｄ）一致しないと判定する場合に、前記第２フローを出力する
請求項１に記載の出力判定装置。
【請求項３】
前記型抽出手段は、前記（ｃ）である場合に、さらに、前記ソースプログラムにおいて、前記第１関数が出力する値の型、及び、前記第２関数が出力する値の型を抽出し、
前記出力決定手段は、前記第１ソースプログラムにおいて特定された前記第１関数に関する前記型と、前記第２ソースプログラムにおいて特定された前記第１関数に関する前記型とが一致するか否か、及び、前記第１ソースプログラムにおいて特定された前記第２関数に関する前記型と、前記第２ソースプログラムにおいて特定された前記第２関数に関する前記型とが一致するか否かを判定し、（ｅ）いずれもが一致すると判定する場合に、前記第２フローを出力せず、（ｆ）いずれかが一致しないと判定する場合に前記第２フローを出力する
請求項２に記載の出力判定装置。
【請求項４】
前記（ｃ）または前記（ｅ）である場合に、前記ソースプログラムにおいて、前記第１関数に対する入出力に関する変数を表す変数識別子を抽出する変数抽出手段
をさらに備え、
前記出力決定手段は、前記第１ソースプログラムにおいて抽出された前記変数識別子と、前記第２ソースプログラムにおいて抽出された前記変数識別子とが一致するか否かを判定し、（ｇ）一致すると判定する場合に、前記第２フローを出力せず、（ｈ）一致しないと判定する場合に前記第２フローを出力する
請求項２または請求項３に記載の出力判定装置。
【請求項５】
前記変数抽出手段は、さらに、前記ソースプログラムにおいて、前記第１関数乃至前記第３関数に関して、それぞれ、入出力に関する変数の型を抽出し、
前記出力決定手段は、
前記第１ソースプログラムにおいて抽出された前記第１関数に関する各変数の型と、前記第２ソースプログラムにおいて抽出された前記第１関数に関する各変数の型とが一致するか否か、
前記第１ソースプログラムにおいて抽出された前記第２関数に関する各変数の型と、前記第２ソースプログラムにおいて抽出された前記第２関数に関する各変数の型とが一致するか否か、
前記第１ソースプログラムにおいて抽出された前記第３関数に関する各変数の型と、前記第２ソースプログラムにおいて抽出された前記第３関数に関する各変数の型とが一致するか否か
を判定し、いずれも一致すると判定する場合に前記第２フローを出力せず、いずれかが一致しないと判定する場合に、前記第２フローを出力する
請求項４に記載の出力判定装置。
【請求項６】
前記（ｈ）である場合に、前記ソースプログラムを逆順に追跡することにより、前記フローから抽出された前記命令文から、前記（ｈ）において一致しない前記変数を表す前記変数識別子が含まれる命令文のうち、最初に前記変数識別子を含む命令文に至る命令文列において、一致しない前記変数に値を設定する命令文を特定し、前記設定する命令文を構成する前記変数を特定し、特定した前記変数を表す前記変数識別子を変数情報手段に格納する第１変数手段
をさらに備え、
前記出力決定手段は、前記（ｈ）において一致しない前記変数を表す前記変数識別子が、前記変数情報手段に含まれるか否かを判定し、含まれる場合に、前記第２フローを出力し、含まれない場合に、前記第２フローを出力しない
請求項４または請求項５に記載の出力判定装置。
【請求項７】
前記（ｈ）である場合に、前記ソースプログラムを逆順に追跡することにより、前記フローから抽出された命令文から、前記（ｈ）において一致しない前記変数を表す前記変数識別子が含まれる命令文のうち、最初に前記変数識別子を含む命令文に至る命令文列において、前記命令文が実行されるか否かを制御する制御命令文を特定し、前記制御命令文に含まれる前記変数を表す前記変数識別子を抽出し、抽出した前記変数識別子を前記変数情報手段に格納する第２変数手段
をさらに備え
前記出力決定手段は、一致しない前記変数を表す前記変数識別子が、前記変数情報手段に含まれるか否かを判定する
請求項６に記載の出力判定装置。
【請求項８】
前記（ｈ）である場合に、前記ソースプログラムを逆順に追跡することにより、前記第２変数手段が抽出した前記変数識別子に、値を設定する設定命令文を特定し、該特定した前記設定命令文にて前記値を算出する基となる前記変数識別子を特定し、特定した前記変数識別子を前記変数情報手段に格納する第３変数手段
をさらに備える
請求項７に記載の出力判定装置。
【請求項９】
情報処理装置が、
ソースプログラムを静的に解析する静的解析手段が、前記ソースプログラムから抽出したフローと、前記フローから抽出した命令文とに基づき、前記ソースプログラムにおいて前記命令文を含む第１関数を特定し、特定した前記第１関数に関して、関数を一意に識別可能な関数識別子を第１関数識別子として抽出し、
前記ソースプログラムにおいて、前記第１関数識別子が表す前記関数を呼び出す第２関数を特定し、特定した前記第２関数を表す第２関数識別子を抽出するとともに、前記ソースプログラムにおいて前記第１関数識別子が表す前記関数が呼び出す第３関数を特定し、特定した前記第３関数を表す第３関数識別子を抽出し、
第１ソースプログラムにおいて抽出された前記第１関数識別子と、第２ソースプログラムにおいて抽出された前記第１関数識別子とが一致するか否か、前記第１ソースプログラムにおいて抽出された前記第２関数識別子と、前記第２ソースプログラムにおいて抽出された前記第２関数識別子とが一致するか否か、及び、前記第１ソースプログラムにおいて抽出された前記第３関数識別子と、前記第２ソースプログラムにおいて抽出された前記第３関数識別子とが一致するか否かを判定し、（ａ）いずれも一致すると判定した場合に、前記静的解析手段が前記第２ソースプログラムにおいて抽出した第２フローを出力せず、（ｂ）いずれかが一致しないと判定した場合に、前記第２フローを出力することを決定する出力判定方法。
【請求項１０】
ソースプログラムを静的に解析する静的解析手段が、前記ソースプログラムから抽出したフローと、前記フローから抽出した命令文とに基づき、前記ソースプログラムにおいて前記命令文を含む第１関数を特定し、特定した前記第１関数に関して、関数を一意に識別可能な関数識別子を第１関数識別子として抽出する処理抽出機能と、
前記ソースプログラムにおいて、前記第１関数識別子が表す前記関数を呼び出す第２関数を特定し、特定した前記第２関数を表す第２関数識別子を抽出するとともに、前記ソースプログラムにおいて前記第１関数識別子が表す前記関数が呼び出す第３関数を特定し、特定した前記第３関数を表す第３関数識別子を抽出する関数抽出機能と、
第１ソースプログラムにおいて抽出された前記第１関数識別子と、前記第２ソースプログラムにおいて抽出された前記第１関数識別子とが一致するか否か、前記第１ソースプログラムにおいて抽出された前記第２関数識別子と、前記第２ソースプログラムにおいて抽出された前記第２関数識別子とが一致するか否か、及び、前記第１ソースプログラムにおいて抽出された前記第３関数識別子と、前記第２ソースプログラムにおいて抽出された前記第３関数識別子とが一致するか否かを判定し、（ａ）いずれも一致すると判定した場合に、前記静的解析手段が第２ソースプログラムにおいて抽出した第２フローを出力せず、（ｂ）いずれかが一致しないと判定した場合に、前記第２フローを出力することを決定する出力決定機能と
をコンピュータに実現させる出力判定プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、たとえば、静的解析プログラムに従い出力される情報から適切な情報を選択する出力判定装置等に関する。
【背景技術】
【０００２】
静的解析プログラムは、コンピュータソフトウェア（以降、「ソフトウェア」と表す）に関して、オブジェクトプログラムを実行することなく、ソースプログラムを解析することにより、該ソフトウェアに含まれる不具合等を解析する。静的解析プログラムは、ソースプログラムにおいて不具合と判定される箇所（フロー）を指摘することにより、ソフトウェアの開発を支援する情報を提供する。
【０００３】
しかし、静的解析プログラムは、ソースプログラムにおいて、実際には不具合ではないにもかかわらず、フローを不具合であると判定する場合もある。この場合に、開発者は、静的解析プログラムにより指摘されたフローが、実際に不具合であるのか否かを確認する必要がある。したがって、静的解析プログラムを用いてソフトウェアの開発を支援する場合には、指摘されたフローが、実際に実行される場合に不具合であるのか否かを確認するのに多くの時間を要するという問題がある。
【０００４】
この問題を解決する手法の一例として、あるソースプログラムに関して、静的解析プログラムが過去に不具合であると指摘されなかったフロー（「第１フロー」と表す）と、新たに不具合であると指摘されたフロー（「第２フロー」と表す）とが類似するか否かを判定する手法がある。該手法は、第１フローと、第２フローとが類似すると判定する場合に、第２フローが不具合でないと判定する。たとえば、特許文献１には、上述した時間を削減することが可能な解析装置が開示されている。
【０００５】
特許文献１は、静的解析プログラムを用いてソースプログラムを解析した結果に基づいて、警告文を出力する解析装置を開示する。該解析装置は、ソースプログラムを解析した結果を表すファイルを、複数バージョンに関してそれぞれ作成し、該ファイル間の差分を作成する。次に、該解析装置は、作成した差分に関連付けされた警告文を出力する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００４−１２６８６６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかし、上述したように、静的解析プログラムは、第１フローと第２フローとの類似性に基づき不具合を判定する場合に、判定を誤る可能性がある。たとえば、静的解析プログラムは、相互に類似する２つのソースコード（クローンコード）を検証する場合に、新たに指摘した第２フローが不具合でないと判定する可能性がある。これは、クローンコードが相互に類似するので、静的解析プログラムが、第１フローと第２フローとが類似すると判定するからである。この場合に、開発者は、第２フローが実際には不具合であっても、該不具合であることを見落としてしまう。
【０００８】
一方、静的解析プログラムが、第１フローと第２フローとが類似しているか否かを、厳密に判定すれば、第２フローが不具合であることを見落としてしまう可能性を低減することができる。しかし、この場合に、静的解析プログラムは、より多くの不具合を出力する。この結果、静的解析プログラムを用いてソフトウェアの開発を支援する場合には、フローが実際に実行される場合に、不具合であるのか否かを確認するのに多くの時間を要するという問題がある。
【０００９】
そこで、本発明の主たる目的は、ソースプログラムに関して静的解析プログラムが出力する情報から、該ソースプログラムが実行される場合に不具合である可能性の高い情報を抽出する出力判定装置等を提供することである。
【課題を解決するための手段】
【００１０】
前述の目的を達成するために、本発明の一態様として、出力判定装置は
ソースプログラムを静的に解析する静的解析手段が、前記ソースプログラムから抽出したフローと、前記フローから抽出した命令文とに基づき、前記ソースプログラムにおいて前記命令文を含む第１関数を特定し、特定した前記第１関数に関して、関数を一意に識別可能な関数識別子を第１関数識別子として抽出する処理抽出手段と、
前記ソースプログラムにおいて、前記第１関数識別子が表す前記関数を呼び出す第２関数を特定し、特定した前記第２関数を表す第２関数識別子を抽出するとともに、前記ソースプログラムにおいて前記第１関数識別子が表す前記関数が呼び出す第３関数を特定し、特定した前記第３関数を表す第３関数識別子を抽出する関数抽出手段と、
第１ソースプログラムにおいて抽出された前記第１関数識別子と、第２ソースプログラムにおいて抽出された前記第１関数識別子とが一致するか否か、前記第１ソースプログラムにおいて抽出された前記第２関数識別子と、前記第２ソースプログラムにおいて抽出された前記第２関数識別子とが一致するか否か、及び、前記第１ソースプログラムにおいて抽出された前記第３関数識別子と、前記第２ソースプログラムにおいて抽出された前記第３関数識別子とが一致するか否かを判定し、（ａ）いずれも一致すると判定した場合に、前記静的解析手段が前記第２ソースプログラムにおいて抽出した第２フローを出力せず、（ｂ）いずれかが一致しないと判定した場合に、前記第２フローを出力することを決定する出力決定手段
とを備える。
【００１１】
また、本発明の他の見地として、出力判定方法は、
情報処理装置が、
ソースプログラムを静的に解析する静的解析手段が、前記ソースプログラムから抽出したフローと、前記フローから抽出した命令文とに基づき、前記ソースプログラムにおいて前記命令文を含む第１関数を特定し、特定した前記第１関数に関して、関数を一意に識別可能な関数識別子を第１関数識別子として抽出し、
前記ソースプログラムにおいて、前記第１関数識別子が表す前記関数を呼び出す第２関数を特定し、特定した前記第２関数を表す第２関数識別子を抽出するとともに、前記ソースプログラムにおいて前記第１関数識別子が表す前記関数が呼び出す第３関数を特定し、特定した前記第３関数を表す第３関数識別子を抽出し、
第１ソースプログラムにおいて抽出された前記第１関数識別子と、第２ソースプログラムにおいて抽出された前記第１関数識別子とが一致するか否か、前記第１ソースプログラムにおいて抽出された前記第２関数識別子と、前記第２ソースプログラムにおいて抽出された前記第２関数識別子とが一致するか否か、及び、前記第１ソースプログラムにおいて抽出された前記第３関数識別子と、前記第２ソースプログラムにおいて抽出された前記第３関数識別子とが一致するか否かを判定し、（ａ）いずれも一致すると判定した場合に、前記静的解析手段が前記第２ソースプログラムにおいて抽出した第２フローを出力せず、（ｂ）いずれかが一致しないと判定した場合に、前記第２フローを出力することを決定する。
【００１２】
さらに、同目的は、係る出力判定プログラム、及び、そのプログラムを記録するコンピュータ読み取り可能な記録媒体によっても実現される。
【発明の効果】
【００１３】
本発明に係る出力判定装置等によれば、ソースプログラムに関して静的解析プログラムが出力する情報から、該ソースプログラムが実行される場合に不具合である可能性の高い情報を抽出することができる。
【図面の簡単な説明】
【００１４】
【図１】本発明の第１の実施形態に係る出力判定装置が有する構成を示すブロック図である。
【図２】第１の実施形態に係る出力判定装置における処理の流れを示すフローチャートである。
【図３Ａ】第１ソースプログラムの一例を表す図である。
【図３Ｂ】第１ソースプログラムの一例を表す図である。
【図４Ａ】第２ソースプログラムの一例を表す図である。
【図４Ｂ】第２ソースプログラムの一例を表す図である。
【図５】静的解析プログラムに従い抽出されたフローの一例を表す図である。
【図６】本発明の第２の実施形態に係る出力判定装置が有する構成を示すブロック図である。
【図７】第２の実施形態に係る出力判定装置における処理の流れを示すフローチャートである。
【図８】本発明の第３の実施形態に係る出力判定装置が有する構成を示すブロック図である。
【図９】第３の実施形態に係る出力判定装置における処理の流れを示すフローチャートである。
【図１０】本発明の第４の実施形態に係る出力判定装置が有する構成を示すブロック図である。
【図１１】第４の実施形態に係る出力判定装置における処理の流れを示すフローチャートである。
【図１２】出力決定部が判定する場合に参照する基準の一例を概念的に表す図である。
【図１３】第１ソースプログラムに基づくコールグラフ情報の一例を概念的に表す図である。
【図１４】第２ソースプログラムに基づくコールグラフ情報の一例を概念的に表す図である。
【図１５】差分情報の一例を概念的に表す図である。
【図１６】本発明の第５の実施形態に係る出力判定装置が有する構成を示すブロック図である。
【図１７】第５の実施形態に係る出力判定装置における処理の流れを示すフローチャートである。
【図１８】第２ソースプログラムの一例を表す図である。
【図１９】本発明の第６の実施形態に係る出力判定装置が有する構成を示すブロック図である。
【図２０】第６の実施形態に係る出力判定装置における処理の流れを示すフローチャートである。
【図２１】第２ソースプログラムの一例を表す図である。
【図２２】本発明の第７の実施形態に係る出力判定装置が有する構成を示すブロック図である。
【図２３】第７の実施形態に係る出力判定装置における処理の流れを示すフローチャートである。
【図２４】本発明の各実施形態に係る出力判定装置を実現可能な計算処理装置のハードウェア構成例を、概略的に示すブロック図である。
【発明を実施するための形態】
【００１５】
本発明の理解を容易にするために、以降の説明において用いる用語や前提等について説明する。
【００１６】
静的解析プログラムに従い処理を実行する静的解析部は、たとえば、ソースプログラムを受信し、受信したソースプログラムに内在するバグ、または、セキュリティに関する脆弱性等に関連するフロー（ソースプログラムの一部）及び命令文を算出する。静的解析部が算出するフロー及び命令文は、複数であってもよい。
【００１７】
フロー判定部は、改変される前のソースプログラムに関して静的解析プログラムが算出するフロー及び命令文と、改変された後のソースプログラムに関して該静的解析プログラムが算出するフロー及び命令文とを比較する。該フロー判定部は、たとえば、改変前後のフロー及び命令文が一致すると判定する場合に、該フローを出力しないことを決定する。一方、該フロー判定部は、たとえば、改変前後のフロー及び命令文が一致しないと判定する場合に、該フローを出力することを決定する。静的解析プログラムが算出するフロー及び命令文が複数である場合に、フロー判定部は、各フロー及び命令文に関して上述した処理を実行する。
【００１８】
尚、ソースプログラムがバージョンを用いて管理されている場合に、改変される前のソースプログラムと、改変された後のソースプログラムとは、２つのバージョンを用いて特定されるソースプログラムであってもよい。また、静的解析プログラムが算出するフローは、たとえば、バグ等に関連すると推定された命令文から、算出した命令文に至る命令文列を表す。
【００１９】
以降の各実施形態に示す出力判定装置は、たとえば、上述したようなフロー判定部がフローを出力するか否かを判定するのを支援することができる。
【００２０】
次に、本発明を実施する実施形態について図面を参照しながら詳細に説明する。
【００２１】
＜第１の実施形態＞
本発明の第１の実施形態に係る出力判定装置１０１が有する構成について、図１を参照しながら詳細に説明する。図１は、本発明の第１の実施形態に係る出力判定装置１０１が有する構成を示すブロック図である。
【００２２】
第１の実施形態に係る出力判定装置１０１は、処理抽出部１０２と、関数抽出部１０３と、出力決定部１０４とを有する。
【００２３】
出力判定装置１０１は、たとえば、第１ソースプログラム３０１と、静的解析プログラムに従い第１ソースプログラム３０１において抽出されたフロー３０３と、静的解析プログラムに従いフロー３０３において抽出された命令文３０５とを受信する。同様に、出力判定装置１０１は、たとえば、第２ソースプログラム３０２と、静的解析プログラムに従い第２ソースプログラム３０２において抽出されたフロー３０４と、静的解析プログラムに従いフロー３０４において抽出された命令文３０６とを受信する。
【００２４】
たとえば、第１ソースプログラム３０１は、図３Ａ及び図３Ｂに例示するようなプログラミング言語に従い記述されたソースプログラムである。図３Ａ及び図３Ｂは、Ｃ言語に従い記述された第１ソースプログラム３０１の一例を表す図である。たとえば、第２ソースプログラム３０２は、図４Ａ及び図４Ｂに例示するようなプログラミング言語に従い記述されたソースプログラムである。図４Ａ及び図４Ｂは、Ｃ言語に従い記述された第２ソースプログラム３０２の一例を表す図である。第１ソースプログラム３０１及び第２ソースプログラム３０２は、たとえば、上述したような改変前後のソースプログラムである。
【００２５】
この場合に、たとえば、改変前のソースプログラム（すなわち、第１ソースプログラム３０１）に関して、静的解析プログラムは、フロー３０３及び命令文３０５を算出する。また、改変後のソースプログラム（すなわち、第２ソースプログラム３０２）に関して、静的解析プログラムは、フロー３０４及び命令文３０６を算出する。
【００２６】
図３Ａ、または、図４Ａに例示するソースプログラムにおいて、命令文「＃ｄｅｆｉｎｅ  ＥＲＲＯＲ  ０」は、「ＥＲＲＯＲ」に０を設定する命令文を表す。また、「ｉｎｔ＿ｍａｉｎ（）」のうち、「ｍａｉｎ（）」は、ｍａｉｎ関数を表し、「ｉｎｔ」は、該ｍａｉｎ関数の出力である戻り値が「ｉｎｔ」型（たとえば、整数を表す型）であることを表す。「ｒｖ＝ｆｕｎｃＢ（Ｘ）」は、関数ｆｕｎｃＢを、入出力する変数を表す引数Ｘにて呼び出し、その後、関数ｆｕｎｃＢの戻り値を変数ｒｖに設定する設定命令文を表す。この場合、ｆｕｎｃＢの呼び出し元関数は、「ｍａｉｎ」である。
【００２７】
また、図３Ａ、または、図４Ａに例示するソースプログラムにおいて、「ｃｏｍｍａｎｄ」は、処理を関数の外部に移さない命令文（または、命令文列）を表す。また、「ｒｅｔｕｒｎ  ｖ」は、関数ｆｕｎｃＢの戻り値を設定するとともに、処理を終了する命令文を表す。
【００２８】
図３Ｂ、または、図４Ｂに例示するソースプログラムにおいて、「ｉｆ  （Ｕ＝＝ＮＵＬＬ）」は、制御命令文を表し、変数Ｕの値が空値（ＮＵＬＬ）である場合に、直後の｛｝にて囲まれた命令文列を実行することを表す。また、該制御命令文は、変数Ｕの値が空値（ＮＵＬＬ）でない場合に、「ｅｌｓｅ」直後の｛｝にて囲まれた命令文列を実行することを表す。
【００２９】
たとえば、静的解析プログラムに従い、第１ソースプログラム３０１、または、第２ソースプログラム３０２において、図５に例示されるフロー（すなわち、フロー３０３、または、フロー３０４）が抽出されているとする。図５は、静的解析プログラムに従い抽出されたフローの一例を表す図である。また、静的解析プログラムに従い、該フローの内、「ｐｒｉｎｔｆ（“％ｓ”，Ｘ）」が、命令文（すなわち、命令文３０５、または、命令文３０６）として抽出されているとする。すなわち、この例においては、静的解析プログラムに従い第１ソースプログラム３０１において抽出されたフロー３０３は、第２ソースプログラム３０２において抽出されたフロー３０４と同じであるとする。同様に、静的解析プログラムに従い第１ソースプログラム３０１において抽出された命令文３０５は、第２ソースプログラム３０２において抽出された命令文３０６と同じであるとする。
【００３０】
次に、第１の実施形態に係る出力判定装置１０１が行う処理について、図２を参照しながら詳細に説明する。図２は、第１の実施形態に係る出力判定装置１０１における処理の流れを示すフローチャートである。説明の便宜上、ソースプログラムは、Ｃ言語を用いて記述されているとするが、他のプログラミング言語を用いて記述されていてもよい。
【００３１】
まず、処理抽出部１０２は、第１ソースプログラム３０１において、命令文３０５を含む関数（説明の便宜上、「第１関数」と表す）を特定する（ステップＳ１０１）。同様に、処理抽出部１０２は、第２ソースプログラム３０２において、命令文３０６を含む関数を特定する（ステップＳ１０１）。
【００３２】
たとえば、図３Ａに例示するソースプログラムの場合に、関数ｆｕｎｃＢが、命令文「ｐｒｉｎｔｆ（“％ｓ”，Ｘ）」を含むので、処理抽出部１０２は、第１ソースプログラム３０１において、第１関数として、関数ｆｕｎｃＢを選ぶ。同様に、図４Ａに例示するソースプログラムの場合、関数ｆｕｎｃＢは、命令文「ｐｒｉｎｔｆ（“％ｓ”，Ｘ）」を含むので、処理抽出部１０２は、第２ソースプログラム３０２において、第１関数として、関数ｆｕｎｃＢを特定する。
【００３３】
次に、関数抽出部１０３は、第１ソースプログラム３０１において、第１関数を呼び出す関数（説明の便宜上、「第２関数」と表す）を特定する（ステップＳ１０２）。同様に、関数抽出部１０３は、第２ソースプログラム３０２において、第１関数を呼び出す関数を特定する（ステップＳ１０２）。
【００３４】
たとえば、図３Ａに例示するソースプログラムの場合、関数ｍａｉｎが命令文「ｒｖ＝ｆｕｎｃＢ（Ｘ）」にて、関数ｆｕｎｃＢを呼び出すので、関数抽出部１０３は、第１ソースプログラム３０１において、第２関数として関数ｍａｉｎを特定する。同様に、図４Ａに例示するソースプログラムの場合、関数ｍａｉｎが命令文「ｒｖ＝ｆｕｎｃＢ（Ｘ）」にて、関数ｆｕｎｃＢを呼び出すので、関数抽出部１０３は、第２ソースプログラム３０２において、第２関数として関数ｍａｉｎを特定する。
【００３５】
次に、関数抽出部１０３は、第１ソースプログラム３０１において、第１関数が呼び出す関数（説明の便宜上、「第３関数」と表す）を特定する（ステップＳ１０３）。同様に、関数抽出部１０３は、第２ソースプログラム３０２において、第１関数が呼び出す関数を特定する（ステップＳ１０３）。
【００３６】
たとえば、図３Ａに例示するソースプログラムの場合、関数ｆｕｎｃＢが命令文「ｖ＝ｆｕｎｃＣ（Ｘ）」にて、関数ｆｕｎｃＣを呼び出すので、関数抽出部１０３は、第１ソースプログラム３０１において、第３関数として関数ｆｕｎｃＣを特定する。同様に、図４Ａに例示するソースプログラムの場合、関数ｍａｉｎが命令文「ｖ＝ｆｕｎｃＣ（Ｘ）」にて、関数ｆｕｎｃＣを呼び出すので、関数抽出部１０３は、第２ソースプログラム３０２において、第３関数として関数ｆｕｎｃＣを特定する。
【００３７】
次に、出力決定部１０４は、第１ソースプログラム３０１において関数抽出部１０３が特定した関数と、第２ソースプログラム３０２において関数抽出部１０３が特定した関数とが一致するか否かを判定する（ステップＳ１０４）。出力決定部１０４は、たとえば、第１ソースプログラム３０１において特定された第１関数の名称（関数識別子）と、第２ソースプログラム３０２において特定された第１関数の名称（関数識別子）とが一致するか否かを判定する。尚、関数識別子は、関数を一意に識別可能な識別子を表すとする。さらに、出力決定部１０４は、第１ソースプログラム３０１において特定された第２関数の名称と、第２ソースプログラム３０２において特定された第２関数の名称とが一致するか否かを判定する。同様に、出力決定部１０４は、第１ソースプログラム３０１において特定された第３関数の名称と、第２ソースプログラム３０２において特定された第３関数の名称とが一致するか否かを判定する。
【００３８】
次に、出力決定部１０４は、第１ソースプログラム３０１において特定された関数と、第２ソースプログラム３０２において特定された関数とが一致すると判定する場合に（ステップＳ１０４にてＹＥＳ）、出力を表すフロー３０７として、フロー３０４を出力することを決定する（ステップＳ１０６）。尚、出力決定部１０４は、ステップＳ１０４にてＹＥＳである場合に、フロー３０３を、フロー３０７として出力することを決定してもよい。また、出力決定部１０４は、第１ソースプログラム３０１において特定された関数と、第２ソースプログラム３０２において特定された関数とが一致しないと判定する場合に（ステップＳ１０４にてＮＯ）、フロー３０４を出力しないことを決定する（ステップＳ１０５）。尚、上述した処理において、特定された関数は、第１関数乃至第３関数を表す。
【００３９】
たとえば、図３Ａ、図３Ｂ、図４Ａ、及び、図４Ｂに示す例の場合に、出力決定部１０４は、第１ソースプログラム３０１において特定された第１関数ｆｕｎｃＢと、第２ソースプログラム３０２において特定された第１関数ｆｕｎｃＢとを比較する。この場合に、２つの該第１関数の名称は一致する。同様に、出力決定部１０４は、第１ソースプログラム３０１において特定された第２関数ｍａｉｎと、第２ソースプログラム３０２において特定された第２関数ｍａｉｎとを比較する。この場合に、２つの該第２関数の名称は一致する。さらに、出力決定部１０４は、第１ソースプログラム３０１において特定された第３関数ｆｕｎｃＣと、第２ソースプログラム３０２において特定された第３関数ｆｕｎｃＣとを比較する。この場合に、２つの該第２関数の名称は一致する。この場合に、いずれの関数も一致するので、出力決定部１０４は、第１ソースプログラム３０１において特定された関数と、第２ソースプログラム３０２において特定された関数とが一致すると判定する。
【００４０】
以降、説明の便宜上、ステップＳ１０４にてＹＥＳと判定された場合に実行する処理を、「処理ｂ」と表す。また、ステップＳ１０４にてＮＯと判定された場合に実行する処理を、「処理ａ」と表す。
【００４１】
たとえば、上述した例において、処理ａは、フロー３０４を出力しないことを決定する処理を含む。また、処理ｂは、フロー３０４を出力することを決定する処理を含む。
【００４２】
次に、第１の実施形態に係る出力判定装置１０１に関する効果について説明する。
【００４３】
出力判定装置１０１によれば、ソースプログラムに関して静的解析プログラムが出力する情報から、該ソースプログラムが実行される場合に不具合である可能性の高い情報を抽出することができる。
【００４４】
この理由は、本実施形態に係る出力判定装置１０１が、静的解析プログラムによって出力される複数のフロー（すなわち、フロー３０３、または、フロー３０４）に関して、関数呼び出しに関する処理を比較した結果に基づき、出力するか否かを判定するからである。この処理において、出力判定装置１０１は、命令文を含む第１関数の関数識別子と、該関数を呼び出す第２関数の関数識別子と、該関数が呼び出す第３関数の関数識別子とを、第１ソースプログラム３０１及び第２ソースプログラム３０２に関して比較する。この結果、出力判定装置１０１は、該関数呼び出しに関する処理を比較した結果に基づいて、フローを出力するか否かを判定する。
【００４５】
一方、特許文献１に開示された解析装置は、単に、静的解析プログラムが出力する結果を表すファイルを比較し、比較した結果に応じて警告文を出力する。すなわち、該解析装置は、該ファイルのみに基づき警告文を出力する。この結果、該解析装置は、本実施形態に係る出力判定装置に比べ、関数呼び出しに関する処理を比較していないので、誤った警告文を出力する可能性が高い。
【００４６】
したがって、本実施形態に係る出力判定装置１０１よれば、ソースプログラムに関して静的解析プログラムが出力する情報から、該ソースプログラムが実行される場合に不具合である可能性の高い情報を抽出することができる。
【００４７】
尚、上述した実施形態において、出力判定装置１０１は、ソースプロプログラムにおいて、第１関数乃至第３関数を抽出するとした。出力判定装置１０１は、たとえば、後述するようなコールグラフ情報（たとえば、図１３、図１４）に基づいて、第１関数乃至第３関数を抽出してもよいし、ソースプログラムを解析することにより、第１関数乃至第３関数を抽出してもよい。
【００４８】
また、出力判定装置１０１と、上述した静的解析プログラムに従い処理を実行する静的解析部とを有する静的解析装置を構成することができる。この場合に、静的解析装置は、２つソースプログラムに基づき、上述したような処理を実行することにより、フロー及び命令文を算出する。
【００４９】
＜第２の実施形態＞
次に、上述した第１の実施形態を基本とする本発明の第２の実施形態について説明する。
【００５０】
以降の説明においては、本実施形態に係る特徴的な部分を中心に説明すると共に、上述した第１の実施形態と同様な構成については、同一の参照番号を付すことにより、重複する説明を省略する。
【００５１】
図６と図７とを参照しながら、第２の実施形態に係る出力判定装置２０１が有する構成と、出力判定装置２０１が行う処理とについて説明する。図６は、本発明の第２の実施形態に係る出力判定装置２０１が有する構成を示すブロック図である。図７は、第２の実施形態に係る出力判定装置２０１における処理の流れを示すフローチャートである。
【００５２】
第２の実施形態に係る出力判定装置２０１は、処理抽出部１０２と、関数抽出部１０３と、型抽出部２０２と、出力決定部２０３とを有する。
【００５３】
出力決定部２０３は、第１の実施形態に係る出力決定部１０４が実行する処理と同様の処理を実行した後に、第１ソースプログラム３０１に関して特定された関数と、第２ソースプログラム３０２に関して特定された関数とが一致するか否かを判定する。型抽出部２０２は、出力決定部２０３が一致しないと判定した場合に（ステップＳ１０４にてＮＯ、図２）、以降に示す処理を開始する。
【００５４】
型抽出部２０２は、第１ソースプログラム３０１にて特定された第３関数が出力する値の型を、第１ソースプログラム３０１において特定する（ステップＳ２０１）。すなわち、型抽出部２０２は、第１ソースプログラム３０１において、第３関数の戻り値の型を特定する。説明の便宜上、第３関数が出力する値の型を、「第３の型」と表す。同様に、型抽出部２０２は、第２ソースプログラム３０２にて特定された第３関数が出力する値の第３の型を、第２ソースプログラム３０２において特定する（ステップＳ２０２）。
【００５５】
たとえば、型抽出部２０２は、第３関数ｆｕｎｃＣの戻り値の型を特定する場合に、まず、第１ソースプログラム３０１において、「ｕｎｓｉｇｎｅｄ  ｉｎｔ  ｆｕｎｃＣ（ｃｈａｒ  ＊Ｕ）」（図３Ｂ）を特定する。次に、型抽出部２０２は、該第３関数ｆｕｎｃＣが出力する値の第３の型が、第１ソースプログラム３０１において、「ｕｎｓｉｇｎｅｄ  ｉｎｔ」型であることを特定する。同様に、型抽出部２０２は、第３関数ｆｕｎｃＣの戻り値の型を特定する場合に、第２ソースプログラム３０２において、「ｉｎｔ＿ｆｕｎｃＣ（ｃｈａｒ  ＊Ｕ）」（図４Ｂ）を特定する。次に、型抽出部２０２は、該第３関数ｆｕｎｃＣが出力する値の第３の型が、第２ソースプログラム３０２において、「ｉｎｔ」型であることを特定する。
【００５６】
次に、出力決定部２０３は、第１ソースプログラム３０１において特定された第３の型と、第２ソースプログラム３０２において特定された第３の型とが一致するか否かを判定する（ステップＳ２０３）。出力決定部２０３は、該２つの型が一致すると判定する場合に（ステップＳ２０３にてＹＥＳ）、フロー３０４を出力しないことを決定する（ステップＳ２０４）。出力決定部２０３は、該２つの第３の型が一致しないと判定する場合に（ステップＳ２０３にてＮＯ）、フロー３０４を出力することを決定する（ステップＳ２０５）。尚、出力決定部２０３は、ステップＳ２０５にてＹＥＳである場合に、フロー３０３を出力することを決定してもよい。
【００５７】
上述した例において、第１ソースプログラム３０１において特定された第３関数ｆｕｎｃＣに関する第３の型は、「ｕｎｓｉｇｎｅｄ  ｉｎｔ」型である。また、第２ソースプログラム３０２において特定された第３関数ｆｕｎｃＣに関する第３の型は、「ｉｎｔ」型である。したがって、該２つの第３の型が一致しないので、出力決定部２０３は、ステップＳ２０３にてＮＯと判定する。したがって、この場合に、出力決定部２０３は、フロー３０４を出力することを決定する。
【００５８】
以降、説明の便宜上、ステップＳ２０３にてＹＥＳと判定された場合に実行する処理を、「処理ｃ」と表す。また、ステップＳ２０３にてＮＯと判定された場合に実行する処理を、「処理ｄ」と表す。
【００５９】
たとえば、上述した例において、処理ｃは、フロー３０４を出力しないことを決定する処理を含む。また、処理ｄは、フロー３０４を出力することを決定する処理を含む。
【００６０】
次に、第２の実施形態に係る出力判定装置２０１に関する効果について説明する。
【００６１】
第２の実施形態に係る出力判定装置２０１によれば、ソースプログラムに関して静的解析プログラムが出力する情報から、該ソースプログラムが実行される場合に不具合である可能性の高い情報を抽出することができる。
【００６２】
この理由は、本実施形態に係る出力判定装置２０１が、さらに、第３関数が出力する値の型に基づき、フロー３０４を出力するか否かを判定するからである。
【００６３】
すなわち、本実施形態に係る出力判定装置２０１は、関数呼び出しに関する関数識別子に加え、さらに、第３関数が出力する値の型に基づいて、フロー３０４を出力するか否かを判定する。この結果、出力判定装置２０１が、第１の実施形態に係る出力判定装置１０１に比べ、さらに、関数を詳細に解析するので、より適切に情報を抽出することができる。
【００６４】
＜第３の実施形態＞
次に、上述した第２の実施形態を基本とする本発明の第３の実施形態について説明する。
【００６５】
以降の説明においては、本実施形態に係る特徴的な部分を中心に説明すると共に、上述した第２の実施形態と同様な構成については、同一の参照番号を付すことにより、重複する説明を省略する。
【００６６】
図８と図９とを参照しながら、第３の実施形態に係る出力判定装置２１１が有する構成と、出力判定装置２１１が行う処理とについて説明する。図８は、本発明の第３の実施形態に係る出力判定装置２１１が有する構成を示すブロック図である。図９は、第３の実施形態に係る出力判定装置２１１における処理の流れを示すフローチャートである。
【００６７】
第３の実施形態に係る出力判定装置２１１は、処理抽出部１０２と、関数抽出部１０３と、型抽出部２１２と、出力決定部２１３とを有する。
【００６８】
型抽出部２１２は、出力決定部２０３が一致すると判定した場合に（ステップＳ２０３にてＹＥＳ、図７）、以降に示す処理を開始する。
【００６９】
型抽出部２１２は、第１ソースプログラム３０１において特定された第１関数が出力する値の型、及び、第１ソースプログラム３０１において特定された第２関数が出力する値の型を特定する（ステップＳ２１１）。
【００７０】
説明の便宜上、第１関数が出力する値の型を、「第１の型」と表す。第２関数が出力する値の型を、「第２の型」と表す。すなわち、第１の型は、第１関数の戻り値に関する型を表す。第２の型は、第２関数の戻り値に関する型を表す。
【００７１】
同様に、型抽出部２１２は、第２ソースプログラム３０２において特定された第１関数に関する第１の型、及び、第２ソースプログラム３０２において特定された第２関数に関する第２の型を特定する（ステップＳ２１２）。
【００７２】
たとえば、型抽出部２１２は、第１ソースプログラム３０１において、第１関数ｆｕｎｃＢに関して、命令文「ｉｎｔ  ｆｕｎｃＢ（ｃｈａｒ  ＊Ｘ）」（図３Ａ）を特定する。型抽出部２１２は、特定した命令文に基づき、第１関数ｆｕｎｃＢが出力する値の第１の型が、「ｉｎｔ」型であることを特定する。同様に、型抽出部２１２は、第１ソースプログラム３０１において、第２関数ｍａｉｎに関して、命令文「ｉｎｔ  ｍａｉｎ（）」（図３Ａ）を特定する。次に、型抽出部２１２は、特定した命令文に基づき、該第２関数ｍａｉｎが出力する値の第２の型が、「ｉｎｔ」型であることを特定する。
【００７３】
同様に、型抽出部２１２は、第２ソースプログラム３０２において、第１関数ｆｕｎｃＢに関して、命令文「ｉｎｔ  ｆｕｎｃＢ（ｃｈａｒ  ＊Ｘ）」（図４Ａ）を特定する。型抽出部２１２は、特定した命令文に基づき、第１関数ｆｕｎｃＢが出力する値の第１の型が、「ｉｎｔ」型であることを特定する。型抽出部２１２は、第２ソースプログラム３０２において、第２関数ｍａｉｎに関して、命令文「ｉｎｔ  ｍａｉｎ（）」（図４Ａ）を特定する。次に、型抽出部２１２は、特定した命令文に基づき、第２関数ｍａｉｎが出力する値の第２の型が、「ｉｎｔ」型であることを特定する。
【００７４】
次に、出力決定部２１３は、第１ソースプログラム３０１において特定された第１の型と、第２ソースプログラム３０２において特定された第１の型とが一致するか否かを判定する。また、出力決定部２１３は、第１ソースプログラム３０１において特定された第２の型と、第２ソースプログラム３０２において特定された第２の型とが一致するか否かを判定する（ステップＳ２１３）。出力決定部２１３は、いずれもが一致すると判定する場合に（ステップＳ２１３にてＹＥＳ）、フロー３０４を出力しないことを決定する（ステップＳ２１４）。出力決定部２１３は、いずれかが一致しないと判定する場合に（ステップＳ２１３にてＮＯ）、フロー３０４を出力することを決定する（ステップＳ２１５）。尚、出力決定部２１３は、ステップＳ２１３にてＮＯである場合に、フロー３０３を出力することを決定してもよい。
【００７５】
上述した例において、第３の型は、一致していない。説明の便宜上、以降に示す実施形態において、第３の型は、一致しているとする。
【００７６】
第１ソースプログラム３０１において特定された第１関数ｆｕｎｃＢに関する第１の型は、「ｉｎｔ」型である。また、第２ソースプログラム３０２において特定された第１関数ｆｕｎｃＢに関する第１の型は、「ｉｎｔ」型である。したがって、該２つの第１の型は一致する。また、第１ソースプログラム３０１において特定された第２関数ｍａｉｎに関する第２の型は、「ｉｎｔ」型である。また、第２ソースプログラム３０２において特定された第２関数ｍａｉｎに関する第２の型は、「ｉｎｔ」型である。したがって、該２つの第２の型は一致する。したがって、第１関数及び第２関数に関して、型がいずれも一致するので、出力決定部２１３は、ステップＳ２１３にてＹＥＳと判定する。したがって、この場合に、出力決定部２１３は、フロー３０４を出力しないことを決定する。
【００７７】
以降、説明の便宜上、ステップＳ２１３にてＹＥＳと判定された場合に実行する処理を、「処理ｅ」と表す。また、ステップＳ２１３にてＮＯと判定された場合に実行する処理を、「処理ｆ」と表す。
【００７８】
たとえば、上述した例において、処理ｅは、フロー３０４を出力しないことを決定する処理を含む。また、処理ｆは、フロー３０４を出力することを決定する処理を含む。
【００７９】
次に、第３の実施形態に係る出力判定装置２１１に関する効果について説明する。
【００８０】
本実施形態に係る出力判定装置２１１によれば、静的解析プログラムによって出力される情報から適切な情報を選択することができる。さらに、本実施形態に係る出力判定装置２１１によれば、ソースプログラムに関して静的解析プログラムが出力する情報から、該ソースプログラムが実行される場合に不具合である可能性の高い情報を、一層、適切に抽出することができる。
【００８１】
この理由は、理由１及び理由２である。すなわち、
（理由１）第３の実施形態に係る出力判定装置２１１が有する構成は、第２の実施形態に係る出力判定装置２０１が有する構成を含むからである、
（理由２）本実施形態に係る出力判定装置２１１が、さらに、関数に関する型に基づき、出力するか否かを判定するからである。
【００８２】
すなわち、本実施形態に係る出力判定装置２１１は、第１の型乃至第３の型に基づいて、それぞれ、フロー３０４を出力するか否かを判定する。この結果、出力判定装置２１１が、第２の実施形態に係る出力判定装置２０１に比べ、さらに、関数を詳細に解析するので、より適切に情報を抽出することができる。
【００８３】
＜第４の実施形態＞
次に、上述した第２の実施形態を基本とする本発明の第４の実施形態について説明する。
【００８４】
以降の説明においては、本実施形態に係る特徴的な部分を中心に説明すると共に、上述した第２の実施形態と同様な構成については、同一の参照番号を付すことにより、重複する説明を省略する。
【００８５】
図１０と図１１とを参照しながら、第４の実施形態に係る出力判定装置２２１が有する構成と、出力判定装置２２１が行う処理とについて説明する。図１０は、本発明の第４の実施形態に係る出力判定装置２２１が有する構成を示すブロック図である。図１１は、第４の実施形態に係る出力判定装置２２１における処理の流れを示すフローチャートである。
【００８６】
第４の実施形態に係る出力判定装置２２１は、処理抽出部１０２と、関数抽出部１０３と、型抽出部２０２と、出力決定部２２２と、変数抽出部２２３とを有する。
【００８７】
変数抽出部２２３は、上述した処理ｃ、または、処理ｅにおいて以降に示す処理を開始する。
【００８８】
変数抽出部２２３は、第１ソースプログラム３０１において特定された第１関数に関して、該第１関数に対する入出力を表す変数を特定する。すなわち、変数抽出部２２３は、第１関数の引数を表す変数を特定する。たとえば、変数抽出部２２３は、該入出力を表す変数を識別可能な変数識別子を特定する（ステップＳ２２１）。同様に、変数抽出部２２３は、第２ソースプログラム３０２において特定された第１関数に関して、該第１関数に対する入出力を表す変数の変数識別子を特定する（ステップＳ２２２）。
【００８９】
たとえば、図３Ａに示す例において、変数抽出部２２３は、第１関数ｆｕｎｃＢに関して、第１ソースプログラム３０１のうち、命令文「ｉｎｔ  ｆｕｎｃＢ（ｃｈａｒ  ＊Ｘ）」を特定する。次に、変数抽出部２２３は、特定した命令文に基づき、第１関数ｆｕｎｃＢに対する入出力を表す変数が、変数識別子Ｘが表す変数であることを特定する。この場合に、変数抽出部２２３は、さらに、変数識別子Ｘを表す型が「ｃｈａｒ  ＊」型であることを特定してもよい。
【００９０】
同様に、図４Ａに示す例において、変数抽出部２２３は、第１関数ｆｕｎｃＢに関して、第２ソースプログラム３０２のうち、命令文「ｉｎｔ  ｆｕｎｃＢ（ｃｈａｒ  ＊Ｘ）」を特定する。次に、変数抽出部２２３は、特定した命令文に基づき、第１関数ｆｕｎｃＢに対する入出力を表す変数が、変数識別子Ｘが表す変数であることを特定する。この場合に、変数抽出部２２３は、さらに、変数識別子Ｘを表す型が「ｃｈａｒ  ＊」型であることを特定してもよい。
【００９１】
尚、入出力する変数が複数ある場合に、変数抽出部２２３は、該変数の変数識別子をそれぞれ特定してもよい。
【００９２】
次に、出力決定部２２２は、第１ソースプログラム３０１において特定された変数識別子と、第２ソースプログラム３０２において特定された変数識別子とが一致するか否かを判定する（ステップＳ２２３）。出力決定部２２２は、変数識別子が一致すると判定する場合に（ステップＳ２２３にてＹＥＳ）、フロー３０４を出力しないことを決定する（ステップＳ２２４）。出力決定部２２２は、変数識別子が一致しないと判定する場合に（ステップＳ２２３にてＮＯ）、フロー３０４を出力することを決定する（ステップＳ２２５）。尚、出力決定部２２２は、ステップＳ２２５にてＮＯである場合に、フロー３０３を出力することを決定してもよい。
【００９３】
上述した例において、第１ソースプログラム３０１において特定された変数識別子Ｘと、第２ソースプログラム３０２において特定された変数識別子Ｘとは一致する。この場合に、出力決定部２２２は、第１関数ｆｕｎｃＢに関する変数識別子が、第１ソースプログラム３０１と、第２ソースプログラム３０２とにおいて一致すると判定する。したがって、出力決定部２２２は、フロー３０４を出力しないことを決定する。
【００９４】
以降、説明の便宜上、ステップＳ２２３にてＹＥＳと判定された場合に実行する処理を、「処理ｇ」と表す。また、ステップＳ２２３にてＮＯと判定された場合に実行する処理を、「処理ｈ」と表す。
【００９５】
たとえば、上述した例において、処理ｇは、フロー３０４を出力しないことを決定する処理を含む。また、処理ｈは、フロー３０４を出力することを決定する処理を含む。
【００９６】
尚、出力決定部２２２は、変数識別子が一致するか否かを判定するだけでなく、さらに、該変数識別子の型が一致する否かを判定してもよい。この場合に、出力決定部２２２は、変数識別子、及び、該変数識別子の型がともに一致する場合に、フロー３０４を出力しないことを決定する。一方、出力決定部２２２は、変数識別子、及び、該変数識別子の型のうち、いずれかが一致しない場合に、フロー３０４を出力することを決定する。
【００９７】
または、出力決定部２２２は、図１２に示すように、第１関数に対する入出力を表す変数の値を表す型、第２関数に対する入出力を表す変数の値を表す型、及び、第３関数に対する入出力を表す変数の値を表す型を参照することにより判定してもよい。図１２は、出力決定部２２２が判定する場合に参照する基準の一例を概念的に表す図である。
【００９８】
図１２を参照すると、関数と、該関数の関数識別子と、該関数が出力する値の型と、該関数の引数である変数の型と、該変数の変数識別子とが関連付けされている。図１２において、「参照する」は、出力決定部２２２が判定する基準として参照することを表す。「参照しない」は、出力決定部２２２が判定する基準として参照しないことを表す。
【００９９】
すなわち、図１２に例示する基準において、出力決定部２２２は、判定する基準として項目１乃至項目８を参照する。すなわち、
（項目１）第２関数の関数識別子、
（項目２）第１関数の関数識別子、
（項目３）第３関数の関数識別子、
（項目４）第３関数が出力する値の型、
（項目５）第２関数の引数である変数の型、
（項目６）第１関数の引数である変数の型、
（項目７）第３関数の引数である変数の型、
（項目８）第１関数の引数である変数の変数識別子。
【０１００】
すなわち、この場合に、出力決定部２２２は、第１ソースプログラム３０１と、第２ソースプログラム３０２とに関して、項目１乃至項目８の観点から比較し、いずれかの項目が一致しない場合に、フロー３０４を出力することを決定する。また、出力決定部２２２は、項目１乃至項目８がいずれも一致する場合に、フロー３０４を出力しないことを決定する。
【０１０１】
次に、第４の実施形態に係る出力判定装置２２１に関する効果について説明する。
【０１０２】
本実施形態に係る出力判定装置２２１によれば、ソースプログラムに関して静的解析プログラムが出力する情報から、該ソースプログラムが実行される場合に不具合である可能性の高い情報を抽出することができる。さらに、本実施形態に係る出力判定装置２２１によれば、より一層適切に、情報を抽出することができる。
【０１０３】
この理由は、理由１及び理由２である。すなわち、
（理由１）第４の実施形態に係る出力判定装置２２１が有する構成は、第２の実施形態に係る出力判定装置２０１が有する構成を含むからである、
（理由２）本実施形態に係る出力判定装置２２１が、さらに、関数に対する入出力を表す変数の変数識別子に基づき、出力するか否かを判定するからである。
【０１０４】
すなわち、本実施形態に係る出力判定装置２２１は、関数呼び出しに関する関数識別子に加え、さらに、上述した情報に基づいて出力するか否かを判定する。この結果、出力判定装置２２１が、第２の実施形態に係る出力判定装置２０１に比べ、さらに、関数を詳細に解析するので、より適切に情報を抽出することができる。
【０１０５】
尚、上述した例においては、第１関数乃至第３関数の関数識別子、該第１関数乃至第３関数が出力する値の型、第１関数に対する入出力を表す変数の変数識別子、及び、該変数識別子の型等に基づき、フローを出力するか否かを判定した。たとえば、出力判定装置２２１は、上述したような情報を表すコールグラフ情報（図１３、図１４に例示）に基づいて、フローを出力するか否か判定してもよい。図１３は、第１ソースプログラム３０１に基づくコールグラフ情報４０１の一例を概念的に表す図である。図１４は、第２ソースプログラム３０２に基づくコールグラフ情報４０１の一例を概念的に表す図である。
【０１０６】
コールグラフ情報４０１は、関数呼び出しに基づいて、ソースプログラムに記載された関数を表す関数呼び出し情報４０２と、該関数が出力する値の型、及び、該関数の引数を表す変数識別子を含む変数情報４０３とを含む。関数呼び出し情報４０２においては、たとえば、第１関数が第３関数を呼び出すという関数の間の関係が、第１関数及び第３関数を結ぶ矢印線として表される。また、変数情報４０３においては、関数と、該関数が出力する値の型と、該関数の引数を表す変数識別子と、該変数識別子の値の型とが関連付けされている。尚、関数の引数を表す変数識別子の個数は、複数であってもよい。
【０１０７】
たとえば、図１３に例示する関数呼び出し情報４０２を参照すると、「ｍａｉｎ→ｆｕｎｃＢ→ｆｕｎｃＣ」なる記載は、関数ｍａｉｎが関数ｆｕｎｃＢを呼び出し、関数ｆｕｎｃＢが関数ｆｕｎｃＣを呼び出すことを表す。図１３に例示する変数情報４０３を参照すると、たとえば、「ｆｕｎｃＣ」と、「ｕｎｓｉｇｎｅｄ  ｉｎｔ」と、「Ｕ」とが関連付けされている。これは、関数ｆｕｎｃＣが出力する変数の型が「ｕｎｓｉｇｎｅｄ  ｉｎｔ」型であり、関数ｆｕｎｃＣの引数を表す変数識別子がＵであることを表す。
【０１０８】
出力判定装置２２１は、たとえば、第１ソースプログラム３０１に含まれる関数と、第２ソースプログラム３０２に含まれる関数とを比較し、比較した結果を図１５に例示するような差分情報として出力してもよい。図１５は、差分情報の一例を概念的に表す図である。あるいは、図１５に例示するような差分情報が算出されている場合に、出力判定装置２２１は、該差分情報に基づき、上述した処理を実行してもよい。
【０１０９】
図１５に例示する差分情報においては、図１３に例示する変数情報４０３に示す各項目と、図１３及び図１４に例示する変数情報４０３を比較した結果である差分とが関連付けされている。たとえば、図１５の５行目において、「ｆｕｎｃＣの戻り値の型」は、「有」に関連付けされている。これは、「ｆｕｎｃＣの戻り値の型（ｉｎｔ）」に関して、第１ソースプログラム３０１と、第２ソースプログラム３０２とに差分があることを表す。また、「ｆｕｎｃＣの変数識別子（Ｕ）」は、「無」に関連付けされている。これは、「ｆｕｎｃＣの変数識別子（Ｕ）」に関して、第１ソースプログラム３０１と、第２ソースプログラム３０２とに差分がないことを表す。
【０１１０】
＜第５の実施形態＞
次に、上述した第４の実施形態を基本とする本発明の第５の実施形態について説明する。
【０１１１】
以降の説明においては、本実施形態に係る特徴的な部分を中心に説明すると共に、上述した第４の実施形態と同様な構成については、同一の参照番号を付すことにより、重複する説明を省略する。
【０１１２】
図１６と図１７とを参照しながら、第５の実施形態に係る出力判定装置２３１が有する構成と、出力判定装置２３１が行う処理とについて説明する。図１６は、本発明の第５の実施形態に係る出力判定装置２３１が有する構成を示すブロック図である。図１７は、第５の実施形態に係る出力判定装置２３１における処理の流れを示すフローチャートである。
【０１１３】
第５の実施形態に係る出力判定装置２３１は、処理抽出部１０２と、関数抽出部１０３と、型抽出部２０２と、出力決定部２３３と、変数抽出部２２３と、第１変数部２３２とを有する。出力判定装置２３１は、さらに、変数情報部２３４を有してもよい。
【０１１４】
第１変数部２３２は、上述した処理ｈにおいて以降に示す処理を開始する。すなわち、第１変数部２３２は、第１関数に関する引数を表す変数識別子、第１関数に関する引数の型、第２関数に関する引数の型、または、第３関数に関する引数の型のうち、少なくとも一つの項目に差分がある場合に、以降に示す処理を開始する。
【０１１５】
説明の便宜上、第１ソースプログラム３０１と、第２ソースプログラム３０２との間において、引数を表す変数識別子（または、引数の型）に差分を有する対象である変数を、「差分変数」と表す。
【０１１６】
第１変数部２３２は、第２ソースプログラム３０２において、命令文３０６から、差分変数を表す変数識別子が含まれる命令文に至る命令文列を逆順に追跡することにより、差分変数に値を最初に設定する設定命令文を特定する（ステップＳ２３１）。
【０１１７】
たとえば、設定命令文は、「＝」の左側に変数識別子を含み、「＝」の右側に変数識別子、数値、計算式、または、関数等を含む命令文である。
【０１１８】
たとえば、第２ソースプログラム３０２が図１８に例示するようなソースプログラムであるとする。図１８は、第２ソースプログラム３０２の一例を表す図である。また、命令文３０６は、「ｐｒｉｎｔｆ（“％ｄ”，Ｘ）」であるとする。さらに、差分変数を表す変数識別子は、Ｘであるとする。
【０１１９】
この場合に、第１変数部２３２は、まず、命令文「Ｘ＝Ｄ＋Ｂ」を読み取る。読み取った命令文が、Ｘに「Ｄ＋Ｂ」の演算結果を設定する命令文であり、さらに、Ｘが差分変数であるので、第１変数部２３２は、該命令が、差分変数に最初に値を設定する命令文であると判定する。
【０１２０】
次に、第１変数部２３２は、特定した命令文において、差分変数に値を設定する基となる変数識別子を特定し、特定した変数識別子を変数情報部２３４に格納する（ステップＳ２３２）。
【０１２１】
上述した例の場合に、第１変数部２３２は、特定した命令文の右側（すなわち、「Ｄ＋Ｂ」）を読み取ることにより、変数識別子Ｄと、変数識別子Ｂとを特定し、変数識別子Ｄと、変数識別子Ｂと変数情報部２３４に格納する。
【０１２２】
次に、出力決定部２３３は、変数情報部２３４が記憶する変数識別子のうち、差分変数を表す変数識別子に一致する変数識別子があるか否かを判定する（ステップＳ２３３）。変数情報部２３４が、差分変数を含むと判定する場合に（ステップＳ２３３にてＹＥＳ）、出力決定部２３３は、フロー３０４を出力することを決定する（ステップＳ２３４）。変数情報部２３４が、差分変数を含まないと判定する場合に（ステップＳ２３３にてＮＯ）、出力決定部２３３は、フロー３０４を出力しないことを決定する（ステップＳ２３５）。
【０１２３】
次に、第５の実施形態に係る出力判定装置２３１に関する効果について説明する。
【０１２４】
本実施形態に係る出力判定装置２３１によれば、ソースプログラムに関して静的解析プログラムが出力する情報から、該ソースプログラムが実行される場合に不具合である可能性の高い情報を抽出することができる。さらに、本実施形態に係る出力判定装置２３１によれば、静的解析プログラムによって出力される情報から、さらに、適切に情報を抽出することができる。
【０１２５】
この理由は、理由１及び理由２である。すなわち、
（理由１）第５の実施形態に係る出力判定装置２３１が有する構成は、第４の実施形態に係る出力判定装置２２１が有する構成を含むからである、
（理由２）静的解析プログラムに従い抽出された命令文３０６の実行に関して、差分変数が関係しているか否かを、出力決定部２３３が判定するからである。
【０１２６】
出力決定部２３３は、変数情報部２３４が差分変数を含むと判定する場合に、差分変数が命令文３０６の実行に関係すると判定する。この場合に、出力決定部２３３は、フロー３０４を出力することを決定する。また、出力決定部２３３は、変数情報部２３４が差分変数を含まないと判定する場合に、差分変数が命令文３０６の実行に関係しないと判定する。この場合に、出力決定部２３３は、フロー３０４を出力しないことを決定する。
【０１２７】
したがって、出力判定装置２３１は、差分変数が命令文３０６の実行に影響を与えるか否かを判定するので、さらに適切に情報を抽出することができる。
【０１２８】
＜第６の実施形態＞
次に、上述した第４の実施形態を基本とする本発明の第６の実施形態について説明する。
【０１２９】
以降の説明においては、本実施形態に係る特徴的な部分を中心に説明すると共に、上述した第４の実施形態と同様な構成については、同一の参照番号を付すことにより、重複する説明を省略する。
【０１３０】
図１９と図２０とを参照しながら、第６の実施形態に係る出力判定装置２４１が有する構成と、出力判定装置２４１が行う処理とについて説明する。図１９は、本発明の第６の実施形態に係る出力判定装置２４１が有する構成を示すブロック図である。図２０は、第６の実施形態に係る出力判定装置２４１における処理の流れを示すフローチャートである。
【０１３１】
第６の実施形態に係る出力判定装置２４１は、処理抽出部１０２と、関数抽出部１０３と、型抽出部２０２と、出力決定部２４３と、変数抽出部２２３と、第２変数部２４２とを有する。出力判定装置２４１は、さらに、変数情報部２３４と、第１変数部２３２とを有してもよい。
【０１３２】
第２変数部２４２は、上述した処理ｈにおいて以降に示す処理を開始する。すなわち、第２変数部２４２は、第１関数に関する引数を表す変数識別子、第１関数に関する引数の型、第２関数に関する引数の型、または、第３関数に関する引数の型のうち、少なくとも一つが差分を有する場合に、以降に示す処理を開始する。
【０１３３】
第２変数部２４２は、第２ソースプログラム３０２において、命令文３０６から、差分変数を表す変数識別子が含まれる命令に至る命令文列を逆順に追跡することにより、命令文３０６を実行するか否かを決める制御命令文を特定する（ステップＳ２４１）。
【０１３４】
たとえば、第２ソースプログラム３０２が図２１に例示するようなソースプログラムであるとする。図２１は、第２ソースプログラム３０２の一例を表す図である。また、命令文３０６は、「Ｘ＝Ｗ＋１」であるとする。さらに、差分変数を表す変数識別子は、Ｘであるとする。
【０１３５】
この場合に、第２変数部２４２は、まず、命令文３０６から１つの命令文を逆順に追跡することにより、命令文「ｉｆ  （Ｄ！＝１）」を読み取る。第２変数部２４２は、読み取った命令文が、条件分岐を表す「ｉｆ」命令文であるので、命令文３０６を実行するか否かに関する制御命令文であると判定する。
【０１３６】
たとえば、制御命令文は、上述した「ｉｆ」命令文、条件を満たすまでの間に処理を繰り返すことを表す「ｗｈｉｌｅ」命令文、ある回数分、処理を繰り返す「ｆｏｒ」命令文等である。
【０１３７】
次に、第２変数部２４２は、特定した制御命令文において、命令文３０６を実行するか否かに関する変数識別子と特定し、特定した変数識別子を変数情報部２３４に格納する（ステップＳ２４２）。すなわち、第２変数部２４２は、特定した制御命令文を構成する条件に含まれる変数識別子を特定する。
【０１３８】
たとえば、上述した例において、第２変数部２４２は、命令文「ｉｆ  （Ｄ！＝１）」における変数識別子Ｄが、命令文３０６を実行するか否かに関する変数識別子であることを特定し、特定した変数識別子Ｄを変数情報部２３４に格納する。
【０１３９】
次に、出力判定装置２４１は、変数情報部２３４が記憶する変数識別子のうち、差分変数を表す変数識別子に一致する変数識別子があるか否かを判定する（ステップＳ２４３）。変数情報部２３４が、差分変数を含むと判定する場合に（ステップＳ２４３にてＹＥＳ）、出力決定部２４３は、フロー３０４を出力することを決定する（ステップＳ２４４）。変数情報部２３４が、差分変数を含まないと判定する場合に（ステップＳ２４３にてＮＯ）、出力決定部２４３は、フロー３０４を出力しないことを決定する（ステップＳ２４５）。
【０１４０】
次に、第６の実施形態に係る出力判定装置２４１に関する効果について説明する。
【０１４１】
本実施形態に係る出力判定装置２４１によれば、ソースプログラムに関して静的解析プログラムが出力する情報から、該ソースプログラムが実行される場合に不具合である可能性の高い情報を抽出することができる。さらに、本実施形態に係る出力判定装置２４１によれば、静的解析プログラムによって出力される情報から、さらに、適切に情報を抽出することができる。
【０１４２】
この理由は、理由１及び理由２である。すなわち、
（理由１）第６の実施形態に係る出力判定装置２４１が有する構成は、第４の実施形態に係る出力判定装置２２１が有する構成を含むからである、
（理由２）静的解析プログラムに従い抽出された命令文３０６を実行するか否かを制御する制御命令文を構成する条件に、差分変数が関係するか否かを、出力決定部２４３が判定するからである。
【０１４３】
出力決定部２４３は、変数情報部２３４が差分変数を含むと判定する場合に、差分変数が命令文３０６の実行に関係すると判定する。この場合に、出力決定部２４３は、フロー３０４を出力することを決定する。また、出力決定部２４３は、変数情報部２３４が差分変数を含まないと判定する場合に、差分変数が命令文３０６の実行に関係しないと判定する。この場合に、出力決定部２３３は、フロー３０４を出力しないことを決定する。
【０１４４】
したがって、出力判定装置２４１は、差分変数が命令文３０６の実行に影響を与えるか否かを判定するので、さらに適切に情報を抽出することができる。
【０１４５】
＜第７の実施形態＞
次に、上述した第６の実施形態を基本とする本発明の第７の実施形態について説明する。
【０１４６】
以降の説明においては、本実施形態に係る特徴的な部分を中心に説明すると共に、上述した第６の実施形態と同様な構成については、同一の参照番号を付すことにより、重複する説明を省略する。
【０１４７】
図２２と図２３とを参照しながら、第７の実施形態に係る出力判定装置２５１が有する構成と、出力判定装置２５１が行う処理とについて説明する。図２２は、本発明の第７の実施形態に係る出力判定装置２５１が有する構成を示すブロック図である。図２３は、第７の実施形態に係る出力判定装置２５１における処理の流れを示すフローチャートである。
【０１４８】
第７の実施形態に係る出力判定装置２５１は、処理抽出部１０２と、関数抽出部１０３と、型抽出部２０２と、第２変数部２４２と、出力決定部２５３と、変数抽出部２２３と、第３変数部２５２とを有する。出力判定装置２４１は、さらに、変数情報部２３４と、第１変数部２３２とを有してもよい。
【０１４９】
第２変数部２４２が、ステップＳ２４２に示す処理に従い、制御命令文に含まれる変数識別子を特定した後に、第３変数部２５２は、第２変数部２４２が特定した変数識別子に関連する処理を開始する。
【０１５０】
第３変数部２５２は、第２ソースプログラム３０２において、第２変数部２４２が特定した制御命令文から、差分変数を表す変数識別子が含まれる命令文に至る命令文列を逆順に追跡する処理を開始する。この場合に、第３変数部２５２は、第２変数部２４２が特定した変数識別子が表す変数に値を最初に設定する設定命令文を特定する（ステップＳ２５３）。
【０１５１】
上述した例において、図２１に例示するソースプログラムの場合に、第２変数部２４２は、変数識別子Ｄと、制御命令文「ｉｆ  （Ｄ！＝１）」を特定する。第３変数部２５２は、制御命令文「ｉｆ  （Ｄ！＝１）」の１つ前の命令文である「Ｄ＝Ｙ＋Ｂ」を読み取る。読み取った命令文が変数識別子Ｄに値を設定する設定命令文であるので、第３変数部２５２は、読み取った命令文が変数識別子Ｄに値を設定する設定命令文であると特定する。
【０１５２】
次に、第３変数部２５２は、特定した設定命令文において、第２変数部２４２が特定した変数識別子に値を設定する基となる変数識別子を特定し、特定した変数識別子を変数情報部２３４に格納する（ステップＳ２５４）。
【０１５３】
上述した例の場合に、第３変数部２５２は、特定した命令文の右側（すなわち、「Ｙ＋Ｂ」）を読み取ることにより、変数識別子Ｙと、変数識別子Ｂとを特定し、変数識別子Ｙと、変数識別子Ｂと変数情報部２３４に格納する。
【０１５４】
次に、出力決定部２５３は、変数情報部２３４が記憶する変数識別子のうち、差分変数を表す変数識別子に一致する変数識別子があるか否かを判定する（ステップＳ２５５）。変数情報部２３４が、差分変数を含むと判定する場合に（ステップＳ２５５にてＹＥＳ）、出力決定部２５３は、フロー３０４を出力することを決定する（ステップＳ２５７）。変数情報部２３４が、差分変数を含まないと判定する場合に（ステップＳ２５５にてＮＯ）、出力決定部２５３は、フロー３０４を出力しないことを決定する（ステップＳ２５６）。
【０１５５】
次に、第７の実施形態に係る出力判定装置２５１に関する効果について説明する。
【０１５６】
本実施形態に係る出力判定装置２５１によれば、ソースプログラムに関して静的解析プログラムが出力する情報から、該ソースプログラムが実行される場合に不具合である可能性の高い情報を抽出することができる。さらに、本実施形態に係る出力判定装置２５１によれば、静的解析プログラムによって出力される情報から、さらに、適切に情報を抽出することができる。
【０１５７】
この理由は、理由１及び理由２である。すなわち、
（理由１）第７の実施形態に係る出力判定装置２５１が有する構成は、第６の実施形態に係る出力判定装置２４１が有する構成を含むからである、
（理由２）静的解析プログラムに従い抽出された命令文３０６を実行するか否かを制御する制御命令文を構成する条件に関して、該条件を満たすか否かを判定する基となる変数に、差分変数が関係するか否かを、出力決定部２５３が判定するからである。
【０１５８】
出力決定部２５３は、変数情報部２３４が差分変数を含むと判定する場合に、差分変数が制御命令文の条件に関係すると判定する。この結果、出力決定部２５３は、差分変数が命令文３０６の実行に関係すると判定する。この場合に、出力決定部２５３は、フロー３０４を出力することを決定する。
【０１５９】
また、出力決定部２５３は、変数情報部２３４が差分変数を含まないと判定する場合に、差分変数が制御命令文の条件に関係しないと判定する。この結果、出力決定部２５３は、差分変数が命令文３０６の実行に関係しないと判定する。この場合に、出力決定部２３３は、フロー３０４を出力しないことを決定する。
【０１６０】
したがって、出力判定装置２５１は、差分変数が命令文３０６の実行に影響を与えるか否かを判定するので、さらに適切に情報を抽出することができる。
【０１６１】
（ハードウェア構成例）
上述した本発明の各実施形態における出力判定装置を、１つの計算処理装置（情報処理装置、コンピュータ）を用いて実現するハードウェア資源の構成例について説明する。但し、係る出力判定装置は、物理的または機能的に少なくとも２つの計算処理装置を用いて実現してもよい。また、係る出力判定装置は、専用の装置として実現してもよい。
【０１６２】
図２４は、第１の実施形態乃至第７の実施形態に係る出力判定装置を実現可能な計算処理装置のハードウェア構成例を概略的に示す図である。計算処理装置２０は、中央処理演算装置（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ、以降「ＣＰＵ」と表す）２１、メモリ２２、ディスク２３、及び、不揮発性記録媒体２４を有する。計算処理装置２０は、さらに、入力装置２５、出力装置２６、通信インターフェース（以降、「通信ＩＦ」と表す。）２７、及び、ディスプレー２８を有する。計算処理装置２０は、通信ＩＦ２７を介して、他の計算処理装置、及び、通信装置と情報を送受信することができる。
【０１６３】
不揮発性記録媒体２４は、コンピュータが読み取り可能な、たとえば、コンパクトディスク（Ｃｏｍｐａｃｔ  Ｄｉｓｃ）、デジタルバーサタイルディスク（Ｄｉｇｉｔａｌ＿Ｖｅｒｓａｔｉｌｅ＿Ｄｉｓｃ）である。また、不揮発性記録媒体２４は、ユニバーサルシリアルバスメモリ（ＵＳＢメモリ）、ソリッドステートドライブ（Ｓｏｌｉｄ＿Ｓｔａｔｅ＿Ｄｒｉｖｅ）等であってもよい。不揮発性記録媒体２４は、電源を供給しなくても係るプログラムを保持し、持ち運びを可能にする。不揮発性記録媒体２４は、上述した媒体に限定されない。また、不揮発性記録媒体２４の代わりに、通信ＩＦ２７を介して、通信ネットワークを介して係るプログラムを持ち運びしてもよい。
【０１６４】
すなわち、ＣＰＵ２１は、ディスク２３が記憶するソフトウェア・プログラム（コンピュータ・プログラム：以下、単に「プログラム」と称する）を、実行する際にメモリ２２にコピーし、演算処理を実行する。ＣＰＵ２１は、プログラム実行に必要なデータをメモリ２２から読み取る。表示が必要な場合には、ＣＰＵ２１は、ディスプレー２８に出力結果を表示する。外部への出力が必要な場合には、ＣＰＵ２１は、出力装置２６に出力結果を出力する。外部からプログラムを入力する場合、ＣＰＵ２１は、入力装置２５からプログラムを読み取る。ＣＰＵ２１は、上述した図１、図６、図８、図１０、図１６、図１９、または、図２２に示す各部が表す機能（処理）に対応するところのメモリ２２にある出力判定プログラム（図２、図７、図９、図１１、図１７、図２０、または、図２３）を解釈し実行する。ＣＰＵ２１は、上述した本発明の各実施形態において説明した処理を順次行う。
【０１６５】
すなわち、このような場合、本発明は、係る出力判定プログラムによっても成し得ると捉えることができる。更に、係る出力判定プログラムが記録されたコンピュータ読み取り可能な不揮発性の記録媒体によっても、本発明は成し得ると捉えることができる。
【０１６６】
以上、上述した実施形態を模範的な例として本発明を説明した。しかし、本発明は、上述した実施形態には限定されない。すなわち、本発明は、本発明のスコープ内において、当業者が理解し得る様々な態様を適用することができる。
【０１６７】
尚、上述した各実施形態の一部又は全部は、以下の付記のようにも記載されうる。しかし、上述した各実施形態により例示的に説明した本発明は、以下には限られない。すなわち、
（付記１）
ソースプログラムを静的に解析する静的解析手段が、前記ソースプログラムから抽出したフローと、前記フローから抽出した命令文とに基づき、前記ソースプログラムにおいて前記命令文を含む第１関数を特定し、特定した前記第１関数に関して、関数を一意に識別可能な関数識別子を第１関数識別子として抽出する処理抽出手段と、
前記ソースプログラムにおいて、前記第１関数識別子が表す前記関数を呼び出す第２関数を特定し、特定した前記第２関数を表す第２関数識別子を抽出するとともに、前記ソースプログラムにおいて前記第１関数識別子が表す前記関数が呼び出す第３関数を特定し、特定した前記第３関数を表す第３関数識別子を抽出する関数抽出手段と、
第１ソースプログラムにおいて抽出された前記第１関数識別子と、第２ソースプログラムにおいて抽出された前記第１関数識別子とが一致するか否か、前記第１ソースプログラムにおいて抽出された前記第２関数識別子と、前記第２ソースプログラムにおいて抽出された前記第２関数識別子とが一致するか否か、及び、前記第１ソースプログラムにおいて抽出された前記第３関数識別子と、前記第２ソースプログラムにおいて抽出された前記第３関数識別子とが一致するか否かを判定し、（ａ）いずれも一致すると判定する場合に、前記静的解析手段が前記第２ソースプログラムにおいて抽出した第２フローを出力せず、（ｂ）いずれかが一致しないと判定した場合に、前記第２フローを出力することを決定する出力決定手段と
備える出力判定装置。
【０１６８】
（付記２）
前記ソースプログラムにおいて、前記第３関数が出力する値の型を抽出する型抽出手段
をさらに備え、
前記出力決定手段は、前記（ａ）である場合に、前記第３関数に関して、前記第１ソースプログラムにおいて抽出された前記型と、前記第２ソースプログラムにおいて抽出された前記型とが一致するか否かを判定し、（ｃ）一致すると判定する場合に、前記第２フローを出力せず、（ｄ）一致しないと判定する場合に、前記第２フローを出力する
付記１に記載の出力判定装置。
【０１６９】
（付記３）
前記型抽出手段は、前記（ｃ）である場合に、さらに、前記ソースプログラムにおいて、前記第１関数が出力する値の型、及び、前記第２関数が出力する値の型を抽出し、
前記出力決定手段は、前記第１ソースプログラムにおいて特定された前記第１関数に関する前記型と、前記第２ソースプログラムにおいて特定された前記第１関数に関する前記型とが一致するか否か、及び、前記第１ソースプログラムにおいて特定された前記第２関数に関する前記型と、前記第２ソースプログラムにおいて特定された前記第２関数に関する前記型とが一致するか否かを判定し、（ｅ）いずれもが一致すると判定する場合に、前記第２フローを出力せず、（ｆ）いずれかが一致しないと判定する場合に前記第２フローを出力する
付記２に記載の出力判定装置。
【０１７０】
（付記４）
前記（ｃ）または前記（ｅ）である場合に、前記ソースプログラムにおいて、前記第１関数に対する入出力に関する変数を表す変数識別子を抽出する変数抽出手段
をさらに備え、
前記出力決定手段は、前記第１ソースプログラムにおいて抽出された前記変数識別子と、前記第２ソースプログラムにおいて抽出された前記変数識別子とが一致するか否かを判定し、（ｇ）一致すると判定する場合に、前記第２フローを出力せず、（ｈ）一致しないと判定する場合に前記第２フローを出力する
付記２または付記３に記載の出力判定装置。
【０１７１】
（付記５）
前記変数抽出手段は、さらに、前記ソースプログラムにおいて、前記第１関数乃至前記第３関数に関して、それぞれ、入出力に関する変数の型を抽出し、
前記出力決定手段は、
前記第１ソースプログラムにおいて抽出された前記第１関数に関する各変数の型と、前記第２ソースプログラムにおいて抽出された前記第１関数に関する各変数の型とが一致するか否か、
前記第１ソースプログラムにおいて抽出された前記第２関数に関する各変数の型と、前記第２ソースプログラムにおいて抽出された前記第２関数に関する各変数の型とが一致するか否か、
前記第１ソースプログラムにおいて抽出された前記第３関数に関する各変数の型と、前記第２ソースプログラムにおいて抽出された前記第３関数に関する各変数の型とが一致するか否か
を判定し、いずれも一致すると判定する場合に前記第２フローを出力せず、いずれかが一致しないと判定する場合に、前記第２フローを出力する
付記４に記載の出力判定装置。
【０１７２】
（付記６）
前記（ｈ）である場合に、前記ソースプログラムを逆順に追跡することにより、前記フローから抽出された前記命令文から、前記（ｈ）において一致しない前記変数を表す前記変数識別子が含まれる命令文のうち、最初に前記変数識別子を含む命令文に至る命令文列において、一致しない前記変数に値を設定する命令文を特定し、前記設定する命令文を構成する前記変数を特定し、特定した前記変数を表す前記変数識別子を変数情報手段に格納する第１変数手段
をさらに備え、
前記出力決定手段は、前記（ｈ）において一致しない前記変数を表す前記変数識別子が、前記変数情報手段に含まれるか否かを判定し、含まれる場合に、前記第２フローを出力し、含まれない場合に、前記第２フローを出力しない
付記４または付記５に記載の出力判定装置。
【０１７３】
（付記７）
前記（ｈ）である場合に、前記ソースプログラムを逆順に追跡することにより、前記フローから抽出された命令文から、前記（ｈ）において一致しない前記変数を表す前記変数識別子が含まれる命令文のうち、最初に前記変数識別子を含む命令文に至る命令文列において、前記命令文が実行されるか否かを制御する制御命令文を特定し、前記制御命令文に含まれる前記変数を表す前記変数識別子を抽出し、抽出した前記変数識別子を前記変数情報手段に格納する第２変数手段
をさらに備え
前記出力決定手段は、一致しない前記変数を表す前記変数識別子が、前記変数情報手段に含まれるか否かを判定する
付記６に記載の出力判定装置。
【０１７４】
（付記８）
前記（ｈ）である場合に、前記ソースプログラムを逆順に追跡することにより、前記第２変数手段が抽出した前記変数識別子に、値を設定する設定命令文を特定し、該特定した前記設定命令文にて前記値を算出する基となる前記変数識別子を特定し、特定した前記変数識別子を前記変数情報手段に格納する第３変数手段
をさらに備える
付記７に記載の出力判定装置。
【０１７５】
（付記９）
前記静的解析手段と、
付記１乃至付記８のいずれかに記載の出力判定装置と
を備える静的解析装置。
【０１７６】
（付記１０）
情報処理装置が、
ソースプログラムを静的に解析する静的解析手段が、前記ソースプログラムから抽出したフローと、前記フローから抽出した命令文とに基づき、前記ソースプログラムにおいて前記命令文を含む第１関数を特定し、特定した前記第１関数に関して、関数を一意に識別可能な関数識別子を第１関数識別子として抽出し、
前記ソースプログラムにおいて、前記第１関数識別子が表す前記関数を呼び出す第２関数を特定し、特定した前記第２関数を表す第２関数識別子を抽出するとともに、前記ソースプログラムにおいて前記第１関数識別子が表す前記関数が呼び出す第３関数を特定し、特定した前記第３関数を表す第３関数識別子を抽出し、
第１ソースプログラムにおいて抽出された前記第１関数識別子と、第２ソースプログラムにおいて抽出された前記第１関数識別子とが一致するか否か、前記第１ソースプログラムにおいて抽出された前記第２関数識別子と、前記第２ソースプログラムにおいて抽出された前記第２関数識別子とが一致するか否か、及び、前記第１ソースプログラムにおいて抽出された前記第３関数識別子と、前記第２ソースプログラムにおいて抽出された前記第３関数識別子とが一致するか否かを判定し、（ａ）いずれも一致すると判定した場合に、前記静的解析手段が前記第２ソースプログラムにおいて抽出した第２フローを出力せず、（ｂ）いずれかが一致しないと判定した場合に、前記第２フローを出力することを決定する出力判定方法。
【０１７７】
（付記１１）
ソースプログラムを静的に解析する静的解析手段が、前記ソースプログラムから抽出したフローと、前記フローから抽出した命令文とに基づき、前記ソースプログラムにおいて前記命令文を含む第１関数を特定し、特定した前記第１関数に関して、関数を一意に識別可能な関数識別子を第１関数識別子として抽出する処理抽出機能と、
前記ソースプログラムにおいて、前記第１関数識別子が表す前記関数を呼び出す第２関数を特定し、特定した前記第２関数を表す第２関数識別子を抽出するとともに、前記ソースプログラムにおいて前記第１関数識別子が表す前記関数が呼び出す第３関数を特定し、特定した前記第３関数を表す第３関数識別子を抽出する関数抽出機能と、
第１ソースプログラムにおいて抽出された前記第１関数識別子と、前記第２ソースプログラムにおいて抽出された前記第１関数識別子とが一致するか否か、前記第１ソースプログラムにおいて抽出された前記第２関数識別子と、前記第２ソースプログラムにおいて抽出された前記第２関数識別子とが一致するか否か、及び、前記第１ソースプログラムにおいて抽出された前記第３関数識別子と、前記第２ソースプログラムにおいて抽出された前記第３関数識別子とが一致するか否かを判定し、（ａ）いずれも一致すると判定した場合に、前記静的解析手段が第２ソースプログラムにおいて抽出した第２フローを出力せず、（ｂ）いずれかが一致しないと判定した場合に、前記第２フローを出力することを決定する出力決定機能と
をコンピュータに実現させる出力判定プログラム。
【符号の説明】
【０１７８】
１０１    出力判定装置
１０２    処理抽出部
１０３    関数抽出部
１０４    出力決定部
３０１    第１ソースプログラム
３０２    第２ソースプログラム
３０３    フロー
３０４    フロー
３０５    命令文
３０６    命令文
３０７    フロー
２０１    出力判定装置
２０２    型抽出部
２０３    出力決定部
２１１    出力判定装置
２１２    型抽出部
２１３    出力決定部
２２１    出力判定装置
２２２    出力決定部
２２３    変数抽出部
２３１    出力判定装置
２３２    第１変数部
２３３    出力決定部
２３４    変数情報部
２４１    出力判定装置
２４２    第２変数部
２４３    出力決定部
２５１    出力判定装置
２５２    第３変数部
２５３    出力決定部
４０１    コールグラフ情報
４０２    関数呼び出し情報
４０３    変数情報
２０    計算処理装置
２１    ＣＰＵ
２２    メモリ
２３    ディスク
２４    不揮発性記録媒体
２５    入力装置
２６    出力装置
２７    通信ＩＦ
２８    ディスプレー
【図１】
2016128941.tif 000003
【図２】
2016128941.tif 000004
【図３Ａ】
2016128941.tif 000005
【図３Ｂ】
2016128941.tif 000006
【図４Ａ】
2016128941.tif 000007
【図４Ｂ】
2016128941.tif 000008
【図５】
2016128941.tif 000009
【図６】
2016128941.tif 000010
【図７】
2016128941.tif 000011
【図８】
2016128941.tif 000012
【図９】
2016128941.tif 000013
【図１０】
2016128941.tif 000014
【図１１】
2016128941.tif 000015
【図１２】
2016128941.tif 000016
【図１３】
2016128941.tif 000017
【図１４】
2016128941.tif 000018
【図１５】
2016128941.tif 000019
【図１６】
2016128941.tif 000020
【図１７】
2016128941.tif 000021
【図１８】
2016128941.tif 000022
【図１９】
2016128941.tif 000023
【図２０】
2016128941.tif 000024
【図２１】
2016128941.tif 000025
【図２２】
2016128941.tif 000026
【図２３】
2016128941.tif 000027
【図２４】
2016128941.tif 000028