(57)【要約】  詳細解析部（１３０）は、変更前のソースコード（１０１）と変更後のソースコードとに対して、ソースコードに含まれる関数と関数が呼び出されたときに成り立つ呼出条件との組毎に、詳細条件リスト（１９６）を生成する。詳細条件リストは、関数に含まれる実行文と、呼出条件の下で実行文が実行される前に成り立つ詳細事前条件と、呼出条件の下で実行文が実行された後に成り立つ詳細事後条件と、を互いに対応付ける。比較部（１４０）は、変更前の詳細条件リストと変更後の詳細条件リストとに基づいて、変動リスト（１９９）を生成する。変動リストは、変更前のソースコードと変更後のソースコードとの間で詳細事前条件と詳細事後条件との少なくともいずれかが異なる実行文を特定する情報を含む。
2017115449.tif 000002
【特許請求の範囲】
【請求項１】
変更前のソースコードと変更後のソースコードとに対して、ソースコードに含まれる関数と関数が呼び出されたときに成り立つ呼出条件との組毎に、関数に含まれる実行文と、呼出条件の下で実行文が実行される前に成り立つ詳細事前条件と、呼出条件の下で実行文が実行された後に成り立つ詳細事後条件と、が互いに対応付けられた詳細条件リストを生成する詳細解析部と、
変更前のソースコードに対して生成された詳細条件リストである変更前の詳細条件リストと、変更後のソースコードに対して生成された詳細条件リストである変更後の詳細条件リストとに基づいて、変更前のソースコードと変更後のソースコードとの間で詳細事前条件と詳細事後条件との少なくともいずれかが異なる実行文を特定する情報を含んだ変動リストを生成する比較部と
を備えるソースコード比較装置。
【請求項２】
前記ソースコード比較装置は、
変更前のソースコードと変更後のソースコードとに対して、ソースコードに含まれる関数毎に、関数に含まれる実行文と、実行文が実行される前に成り立つ簡略事前条件と、実行文が実行された後に成り立つ簡略事後条件と、が互いに対応付けられた簡略条件リストを生成する簡略解析部を備え、
前記詳細解析部は、
変更前のソースコードと、変更前のソースコードに対して生成された簡略条件リストである変更前の簡略条件リストとに基づいて、変更前の詳細条件リストを生成し、
変更後のソースコードと、変更後のソースコードに対して生成された簡略条件リストである変更後の簡略条件リストとに基づいて、変更後の詳細条件リストを生成する
請求項１に記載のソースコード比較装置。
【請求項３】
前記詳細解析部は、
詳細条件リストが生成される対象となる関数である対象関数が呼び出されるときに成り立つ呼出条件を特定し、
対象関数の簡略条件リストから、実行文を、実行される順に対象文として選択し、
対象関数の簡略条件リストから、対象文の簡略事前条件と対象文の簡略事後条件とを、対象関数と当該呼出条件との組に対応する詳細条件リストに登録される対象文の詳細事前条件と対象文の詳細事後条件として取得し、
対象文の前に実行される実行文である直前文が対象関数に含まれる場合、直前文の詳細事後条件を対象関数と当該呼出条件との組に対応する詳細条件リストから取得して、直前文の詳細事後条件を対象文の詳細事前条件に追加する
請求項２に記載のソースコード比較装置。
【請求項４】
前記詳細解析部は、
対象関数の呼出条件に含まれる値または直前文の詳細事後条件に含まれる値に置き換えられる要素を含んだ条件が対象文の詳細事前条件または対象文の詳細事後条件に含まれる場合、当該要素を対象関数の呼出条件に含まれる値または直前文の詳細事後条件に含まれる値に置き換える
請求項３に記載のソースコード比較装置。
【請求項５】
前記詳細解析部は、
対象文が関数を呼び出すための実行文である場合、対象文によって呼び出される関数である呼び出し先関数について詳細条件リストを生成し、呼び出し先関数の詳細条件リストに基づいて呼び出し先関数が実行された後に成り立つ条件を特定し、特定した条件に対象文の詳細事後条件を置き換える
請求項３に記載のソースコード比較装置。
【請求項６】
前記詳細解析部は、
対象文が、追加の対象となる標準関数を呼び出すための実行文である場合、前記標準関数の引数について成り立つ条件を、対象文の詳細事後条件に追加する
請求項３に記載のソースコード比較装置。
【請求項７】
前記詳細解析部は、
対象文の詳細事前条件に矛盾があるか判定し、対象文の詳細事前条件に矛盾があると判定した場合、対象文の詳細事前条件として求められた条件と対象文の詳細事後条件として求められた条件とを削除する
請求項３に記載のソースコード比較装置。
【請求項８】
前記ソースコード比較装置は、
少なくともいずれかの関数を呼び出すがいずれの関数からも呼び出されない関数であるエントリ関数を特定するエントリ解析部を備え、
前記詳細解析部は、
前記エントリ関数を最初の対象関数にして、前記エントリ関数の詳細条件リストと、前記エントリ関数の実行に伴って呼び出される関数の詳細条件リストとを生成する
請求項３に記載のソースコード比較装置。
【請求項９】
前記詳細解析部は、除外の対象となる変数を含んだ条件を、詳細事前条件および詳細事後条件から除外する
請求項１に記載のソースコード比較装置。
【請求項１０】
変更前のソースコードと変更後のソースコードとに対して、ソースコードに含まれる関数と関数が呼び出されたときに成り立つ呼出条件との組毎に、関数に含まれる実行文と、呼出条件の下で実行文が実行される前に成り立つ詳細事前条件と、呼出条件の下で実行文が実行された後に成り立つ詳細事後条件と、が互いに対応付けられた詳細条件リストを生成する詳細解析処理と、
変更前のソースコードに対して生成された詳細条件リストである変更前の詳細条件リストと、変更後のソースコードに対して生成された詳細条件リストである変更後の詳細条件リストとに基づいて、変更前のソースコードと変更後のソースコードとの間で詳細事前条件と詳細事後条件との少なくともいずれかが異なる実行文を特定する情報を含んだ変動リストを生成する比較処理と
をコンピュータに実行させるためのソースコード比較プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアが変更される場合に変更の影響が及ぶ箇所を特定するための技術に関するものである。
【背景技術】
【０００２】
ソフトウェアが変更されると、変更された箇所とは別の箇所に変更の影響が及ぶ場合がある。変更の影響が及ぶ箇所についての修正漏れは、障害を作り込む要因となりうる。そのため、変更の影響が及ぶ箇所を特定する必要がある。【０００３】
大規模なソフトウェアの開発において、大量のソースコードの中から、変更の影響が及ぶ箇所を目視で探索することは非効率的であるため、目視による探索は作業工数の増加に繋がる。また、目視による探索では変更の影響が及ぶ箇所を見落し易く、見落とした箇所の修正漏れが発生する。つまり、目視による探索は、障害の作り込みの要因となりうる。したがって、変更の影響が及ぶ箇所を効率的かつ網羅的に特定することが求められる。【０００４】
特許文献１には、関数と変数との依存関係を利用して変更影響箇所を抽出する手法が記載されている。具体的には、依存強度に重みをつけて変更影響範囲を抽出する手法が記載されている。
しかし、特許文献１に記載の手法では、依存関係がある関数のうちの変更の影響を受ける関数については、関数内の記述を目視で確認する必要がある。【０００５】
特許文献２および特許文献３には、実行経路を利用して変更影響箇所を抽出する手法が記載されている。
具体的には、特許文献２には、各実行経路における出力項目の値域の変化を用いて、変更の影響を受けるテストケースを検出する手法が記載されている。
また、特許文献３には、各実行経路における入力項目の値域の変化を用いて、変更の影響を受けるテストケースを検出する手法が記載されている。
しかし、特許文献２または特許文献３に記載の手法では、変更影響箇所を関数粒度で特定することはできても、変更影響箇所を行単位で抽出することはできない。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１３−１２５４６６号
【特許文献２】特開２０１５−０９０６１６号
【特許文献３】特開２０１４−１９１６５２号
【非特許文献】
【０００７】
【非特許文献１】ＴｅｃｈＭａｔｒｉｘ  Ｃｏｒｐｏｒａｔｉｏｎ、“Ｌａｔｔｉｘ−アーキテクチャ分析ツール−”、インターネット（ＵＲＬ：ｈｔｔｐｓ：／／ｗｗｗ．ｔｅｃｈｍａｔｒｉｘ．ｃｏ．ｊｐ／ＱＵＡＬＩＴＹ／ＬＡＴＴＩＸ／）、２０１５年１２月２日検索
【発明の概要】
【発明が解決しようとする課題】
【０００８】
本発明は、ソフトウェアが変更される場合に変更の影響が及ぶ箇所を特定できるようにすることを目的とする。
【課題を解決するための手段】
【０００９】
本発明のソースコード比較装置は、
変更前のソースコードと変更後のソースコードとに対して、ソースコードに含まれる関数と関数が呼び出されたときに成り立つ呼出条件との組毎に、関数に含まれる実行文と、呼出条件の下で実行文が実行される前に成り立つ詳細事前条件と、呼出条件の下で実行文が実行された後に成り立つ詳細事後条件と、が互いに対応付けられた詳細条件リストを生成する詳細解析部と、
変更前のソースコードに対して生成された詳細条件リストである変更前の詳細条件リストと、変更後のソースコードに対して生成された詳細条件リストである変更後の詳細条件リストとに基づいて、変更前のソースコードと変更後のソースコードとの間で詳細事前条件と詳細事後条件との少なくともいずれかが異なる実行文を特定する情報を含んだ変動リストを生成する比較部とを備える。
【発明の効果】
【００１０】
本発明によれば、変更前のソースコードと変更後のソースコードとの間で詳細事前条件と詳細事後条件との少なくともいずれかが異なる実行文を、変更の影響が及ぶ箇所として特定することができる。
【図面の簡単な説明】
【００１１】
【図１】実施の形態１におけるソースコード比較装置１００の構成図。
【図２】実施の形態１におけるソースコード比較方法のフローチャート。
【図３】実施の形態１における解析処理（Ｓ２００）のフローチャート。
【図４】実施の形態１における変更前のソースコード１０１を示す図。
【図５】実施の形態１における変更前の簡略条件ファイル１９１を示す図。
【図６】実施の形態１における変更前のｆｕｎｃ関数の簡略条件リスト１９２を示す図。
【図７】実施の形態１におけるエントリ解析処理（Ｓ２２０）のフローチャート。
【図８】実施の形態１における依存リスト１９３を示す図。
【図９】実施の形態１におけるエントリ関数リスト１９４を示す図。
【図１０】実施の形態１における詳細解析処理（Ｓ２３０）のフローチャート。
【図１１】実施の形態１における再帰解析処理（Ｓ３００）のフローチャート。
【図１２】実施の形態１における直前評価処理（Ｓ３１０）のフローチャート。
【図１３】実施の形態１における直前評価処理（Ｓ３１０）を実行後の作業事前条件ＰＲＥＶおよび作業事後条件ＡＦＴＥＲの一例を示す図。
【図１４】実施の形態１における変数評価処理（Ｓ３２０）のフローチャート。
【図１５】実施の形態１における変数評価処理（Ｓ３２０）を実行後の作業事前条件ＰＲＥＶおよび作業事後条件ＡＦＴＥＲの一例を示す図。
【図１６】実施の形態１における再帰評価処理（Ｓ３３０）のフローチャート。
【図１７】実施の形態１における再帰評価処理（Ｓ３３０）を実行後の作業事前条件ＰＲＥＶおよび作業事後条件ＡＦＴＥＲの一例を示す図。
【図１８】実施の形態１における矛盾評価処理（Ｓ３４０）のフローチャート。
【図１９】実施の形態１における矛盾評価処理（Ｓ３４０）を実行後の作業事前条件ＰＲＥＶおよび作業事後条件ＡＦＴＥＲの一例を示す図。
【図２０】実施の形態１における変更前の詳細条件ファイル１９５の構成を示す図。
【図２１】実施の形態１における変更前のｉｎｖｏｋｅ関数（ｖｏｉｄ）の詳細条件リスト１９６を示す図。
【図２２】実施の形態１における変更前のｆｕｎｃ関数（ｘ＝０）の詳細条件リスト１９６を示す図。
【図２３】実施の形態１における変更前のａｒｒａｙＳｉｚｅ関数（ｘ＝０）の詳細条件リスト１９６を示す図。
【図２４】実施の形態１における変更前のａｒｒａｙＳｉｚｅ関数（ｘ＝１）の詳細条件リスト１９６を示す図。
【図２５】実施の形態１における変更前のａｒｒａｙＳｉｚｅ関数（ｘ＝２）の詳細条件リスト１９６を示す図。
【図２６】実施の形態１における変更前のａｒｒａｙＳｉｚｅ関数（ｘ＝３）の詳細条件リスト１９６を示す図。
【図２７】実施の形態１における変更前のａｒｒａｙＳｉｚｅ関数（ｘ＝４）の詳細条件リスト１９６を示す図。
【図２８】実施の形態１における比較処理（Ｓ１３０）のフローチャート。
【図２９】実施の形態１における変更前の結合条件ファイル１９７を示す図。
【図３０】実施の形態１における変更前のｆｕｎｃ関数の結合条件リスト１９８を示す図。
【図３１】実施の形態１における変更後のソースコード１０１を示す図。
【図３２】実施の形態１における変更後の結合条件ファイル１９７を示す図。
【図３３】実施の形態１における変更後のｆｕｎｃ関数の結合条件リスト１９８を示す図。
【図３４】実施の形態１における変動リスト１９９を示す図。
【図３５】実施の形態２におけるソースコード比較装置１００の構成図。
【図３６】実施の形態２における再帰解析処理（Ｓ３００）のフローチャート。
【図３７】実施の形態２における除外リスト１０３を示す図。
【図３８】実施の形態２における変更前のｉｎｖｏｋｅ関数（ｖｏｉｄ）の詳細条件リスト１９６を示す図。
【図３９】実施の形態２における変更前のｆｕｎｃ関数（ｘ＝０）の詳細条件リスト１９６を示す図。
【図４０】実施の形態３におけるソースコード比較装置１００の構成図。
【図４１】実施の形態３における再帰解析処理（Ｓ３００）のフローチャート。
【図４２】実施の形態３における追加評価処理（Ｓ３５０）のフローチャート。
【図４３】実施の形態３における追加リスト１０４を示す図。
【図４４】実施の形態３における変更前のｉｎｖｏｋｅ関数（ｖｏｉｄ）の詳細条件リスト１９６を示す図。
【図４５】実施の形態３における変更前のｆｕｎｃ関数（ｘ＝０）の詳細条件リスト１９６を示す図。
【図４６】実施の形態におけるソースコード比較装置１００のハードウェア構成図。
【発明を実施するための形態】
【００１２】
実施の形態１．
変更前のソースコードと変更後のソースコードとを比較するソースコード比較装置１００について、図１から図３４に基づいて説明する。
【００１３】
＊＊＊構成の説明＊＊＊
図１に基づいて、ソースコード比較装置１００の構成について説明する。
ソースコード比較装置１００は、プロセッサ９０１とメモリ９０２と補助記憶装置９０３といったハードウェアを備えるコンピュータである。プロセッサ９０１は、信号線を介して他のハードウェアと接続されている。
【００１４】
プロセッサ９０１は、プロセッシングを行うＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）であり、他のハードウェアを制御する。具体的には、プロセッサ９０１は、ＣＰＵ、ＤＳＰまたはＧＰＵである。ＣＰＵはＣｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔの略称であり、ＤＳＰはＤｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒの略称であり、ＧＰＵはＧｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔの略称である。
メモリ９０２は揮発性の記憶装置である。メモリ９０２は、主記憶装置またはメインメモリとも呼ばれる。具体的には、メモリ９０２はＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。
補助記憶装置９０３は不揮発性の記憶装置である。具体的には、補助記憶装置９０３は、ＲＯＭ、ＨＤＤまたはフラッシュメモリである。ＲＯＭはＲｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙの略称であり、ＨＤＤはＨａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅの略称である。
【００１５】
ソースコード比較装置１００は、簡略解析部１１０とエントリ解析部１２０と詳細解析部１３０と比較部１４０といった「部」を機能構成の要素として備える。「部」の機能はソフトウェアで実現される。「部」の機能については後述する。
【００１６】
補助記憶装置９０３には、「部」の機能を実現するプログラムが記憶されている。「部」の機能を実現するプログラムは、メモリ９０２にロードされて、プロセッサ９０１によって実行される。
さらに、補助記憶装置９０３にはＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）が記憶されている。ＯＳの少なくとも一部は、メモリ９０２にロードされて、プロセッサ９０１によって実行される。
つまり、プロセッサ９０１は、ＯＳを実行しながら、「部」の機能を実現するプログラムを実行する。
「部」の機能を実現するプログラムを実行して得られるデータは、メモリ９０２、補助記憶装置９０３、プロセッサ９０１内のレジスタまたはプロセッサ９０１内のキャッシュメモリといった記憶装置に記憶される。これらの記憶装置は、データを記憶する記憶部として機能する。
なお、ソースコード比較装置１００が複数のプロセッサ９０１を備えて、複数のプロセッサ９０１が「部」の機能を実現するプログラムを連携して実行してもよい。
【００１７】
メモリ９０２には、ソースコード比較装置１００で使用、生成、入出力または送受信されるデータが記憶される。
具体的には、メモリ９０２には次のようなデータが記憶される。メモリ９０２には、変更前のソースコード１０１および変更後のソースコード１０１が記憶される。メモリ９０２には、変更前のソースコード１０１に対応する簡略条件ファイル１９１と依存リスト１９３とエントリ関数リスト１９４と詳細条件ファイル１９５と結合条件ファイル１９７が記憶される。メモリ９０２には、変更後のソースコード１０１に対応する簡略条件ファイル１９１と依存リスト１９３とエントリ関数リスト１９４と詳細条件ファイル１９５と結合条件ファイル１９７が記憶される。メモリ９０２には変動リスト１９９が記憶される。メモリ９０２に記憶されるデータの内容については後述する。
【００１８】
プロセッサ９０１とメモリ９０２と補助記憶装置９０３とをまとめたハードウェアを「プロセッシングサーキットリ」という。
「部」は「処理」または「工程」に読み替えてもよい。「部」の機能はファームウェアで実現してもよい。
「部」の機能を実現するプログラムは、磁気ディスク、光ディスクまたはフラッシュメモリ等の不揮発性の記憶媒体に記憶することができる。
【００１９】
＊＊＊動作の説明＊＊＊
ソースコード比較装置１００の動作はソースコード比較方法に相当する。また、ソースコード比較方法の手順はソースコード比較プログラムの手順に相当する。
【００２０】
図２に基づいて、ソースコード比較方法について説明する。
ステップＳ１１０は、変更前のソースコード１０１に対する解析処理（Ｓ２００）である。
ステップＳ１１０において、ソースコード比較装置１００は、変更前のソースコード１０１に対して、解析処理（Ｓ２００）を行う。
ソースコード１０１は関数１０２毎のソースコードを含んでいる。つまり、ソースコード１０１は複数の関数１０２を含んでいる。関数１０２は１つ以上の命令文を含んでいる。
【００２１】
図３に基づいて、解析処理（Ｓ２００）を説明する。
ステップＳ２１０は簡略解析処理である。
ステップＳ２１０において、簡略解析部１１０は、ソースコード１０１に基づいて、簡略条件ファイル１９１を生成する。
簡略条件ファイル１９１は、ソースコード１０１に含まれる関数１０２毎の簡略条件リスト１９２を含んだファイルである。
簡略条件リスト１９２は、関数１０２に含まれる実行文と、実行文が実行される前に成り立つ簡略事前条件と、実行文が実行された後に成り立つ簡略事後条件と、が互いに対応付けられたリストである。
実行文は、関数１０２に含まれる命令文のうちの処理の内容が指定された命令文である。具体的には、演算式が指定された演算文、変数に値を代入するための代入文および関数を呼び出すための呼び出し文といった命令文が実行文である。一方、変数を定義するための定義文および処理の流れを制御するための制御文といった命令文は実行文ではない。但し、制御文の中で指定された演算文、代入文および呼び出し文は実行文である。具体的な制御文はＦＯＲ文およびＩＦ文などである。ＦＯＲ文は、同じ内容の処理を繰り返すためのループ文の１つである。ＩＦ文は、条件に応じて処理を分岐するための条件分岐文の１つある。
【００２２】
具体的には、簡略解析部１１０は、ホーア論理または抽象解釈に基づいたアルゴリズムでソースコード１０１を処理することによって、簡略条件ファイル１９１を生成する。ホーア論理および抽象解釈は、事前条件および事後条件を求める手法である。
【００２３】
図４に示すソースコード１０１に対して簡略解析処理（Ｓ２１０）が実行された場合、図５および図６に示すような簡略条件ファイル１９１が生成される。
図４のソースコード１０１は、ｉｎｖｏｋｅ関数とｆｕｎｃ関数とａｒｒａｙＳｉｚｅ関数とのそれぞれの変更前のソースコードを含んでいる。
図５の簡略条件ファイル１９１は、ｉｎｖｏｋｅ関数とｆｕｎｃ関数とａｒｒａｙＳｉｚｅ関数とのそれぞれの簡略条件リスト１９２を含んでいる。ｆｕｎｃ関数の簡略条件リスト１９２の全体は、図６に示している。
簡略条件リスト１９２の第１列は、実行文を識別する番号を示している。ソースコード１０１の図には、この番号を付している。
簡略条件リスト１９２の第２列は、実行文を示している。
簡略条件リスト１９２の第３列は、事前条件と事後条件とを区別している。
簡略条件リスト１９２の第４列は、事前条件または事後条件を示している。事前条件および事後条件は、１つの条件式または複数の条件式の結合で表される。事前条件および事後条件を表す１つの条件式または複数の条件式の結合は、論理式ともいう。
簡略条件リスト１９２における事前条件および事後条件は、簡略事前条件および簡略事後条件に相当する。
【００２４】
図３に戻り、ステップＳ２２０を説明する。
ステップＳ２２０はエントリ解析処理である。
ステップＳ２２０において、エントリ解析部１２０は、ソースコード１０１からエントリ関数を特定してエントリ関数リスト１９４を生成する。
エントリ関数リスト１９４は、エントリ関数を示すファイルである。エントリ関数は、少なくともいずれかの関数を呼び出すがいずれの関数からも呼び出されない関数である。
【００２５】
図７に基づいて、エントリ解析処理（Ｓ２２０）を説明する。
ステップＳ２２１において、エントリ解析部１２０は、依存リスト１９３を生成する。
依存リスト１９３は、関数を呼び出す関数である依存元関数と依存元関数から呼び出される関数である依存先関数とを互いに対応付けたリストである。
【００２６】
具体的には、エントリ解析部１２０は、関数１０２毎に次のような処理を行うことによって、依存リスト１９３を生成する。
まず、エントリ解析部１２０は、関数１０２のソースコードに対して構文解析および文字解析を行うことによって、関数１０２のソースコードから呼び出し文を抽出する。
次に、エントリ解析部１２０は、抽出した呼び出し文に対して構文解析および文字解析を行うことによって、抽出した呼び出し文によって呼び出される関数を特定する。
そして、エントリ解析部１２０は、関数１０２を依存元関数として依存リスト１９３に登録し、特定した関数を依存先関数として依存リスト１９３に登録する。
【００２７】
なお、販売されているツールがエントリ解析部１２０として用いられてもよい。具体的なツールは、［非特許文献１］に挙げたウェブページで紹介されているツールである。このツールは、ソースコードが入力されると依存リストを生成して出力する。
【００２８】
図４のソースコード１０１に対してステップＳ２２１の処理が行われることによって、図８の依存リスト１９３が生成される。
【００２９】
図７に戻り、ステップＳ２２２から説明を続ける。
ステップＳ２２２において、エントリ解析部１２０は、依存リスト１９３を複製する。複製された依存リスト１９３はエントリ関数リスト１９４の元になる。
【００３０】
ステップＳ２２３において、エントリ解析部１２０は、複製された依存リスト１９３から、未選択の依存元関数を１つ選択する。
具体的には、エントリ解析部１２０は、複製された依存リスト１９３の先頭から順番に依存元関数を１つずつ選択する。
【００３１】
ステップＳ２２４において、エントリ解析部１２０は、選択された依存元関数と同じ名称の依存先関数が複製された依存リスト１９３に含まれているか判定する。
選択された依存元関数と同じ名称の依存先関数が複製された依存リスト１９３に含まれている場合、処理はステップＳ２２５に進む。
選択された依存元関数と同じ名称の依存先関数が複製された依存リスト１９３に含まれていない場合、処理はステップＳ２２６に進む。
【００３２】
ステップＳ２２５において、エントリ解析部１２０は、選択された依存元関数を含んだ行を、複製された依存リスト１９３から削除する。
【００３３】
ステップＳ２２６において、エントリ解析部１２０は、未選択の依存元関数があるか判定する。
未選択の依存元関数がある場合、処理はステップＳ２２３に戻る。
未選択の依存元関数がない場合、処理はステップＳ２２７に進む。
【００３４】
ステップＳ２２７において、エントリ解析部１２０は、複製された依存リスト１９３から、依存先関数の列を削除する。
【００３５】
ステップＳ２２８において、エントリ解析部１２０は、依存元関数の欄の名称をエントリ関数に変更する。
【００３６】
図８の依存リスト１９３に対してステップＳ２２２からステップＳ２２８までの処理が行われることによって、図９のエントリ関数リスト１９４が生成される。
【００３７】
図３に戻り、ステップＳ２３０を説明する。
ステップＳ２３０は詳細解析処理である。
ステップＳ２３０において、詳細解析部１３０は、ソースコード１０１と簡略条件ファイル１９１とエントリ関数リスト１９４とに基づいて、詳細条件ファイル１９５を生成する。
詳細条件ファイル１９５は、ソースコード１０１に含まれる関数１０２と関数１０２が呼び出されるときに成り立つ呼出条件との組毎の詳細条件リスト１９６を含んだファイルである。
詳細条件リスト１９６は、関数１０２に含まれる実行文と、呼出条件の下で実行文が実行される前に成り立つ詳細事前条件と、呼出条件の下で実行文が実行された後に成り立つ詳細事後条件と、が互いに対応付けられたリストである。
【００３８】
図１０に基づいて、詳細解析処理（Ｓ２３０）を説明する。
ステップＳ２３１において、詳細解析部１３０は、エントリ関数リスト１９４から、未選択のエントリ関数を１つ選択する。
具体的には、詳細解析部１３０は、エントリ関数リスト１９４の先頭から順番にエントリ関数を１つずつ選択する。
【００３９】
ステップＳ３００は再帰解析処理である。
ステップＳ３００において、詳細解析部１３０は、エントリ関数を最初の対象関数にして、エントリ関数の詳細条件リスト１９６と、エントリ関数の実行に伴って呼び出される関数の詳細条件リスト１９６とを生成する。
再帰解析処理（Ｓ３００）については別途説明する。
【００４０】
ステップＳ２３２において、詳細解析部１３０は、未選択のエントリ関数があるか判定する。
未選択のエントリ関数がある場合、処理はステップＳ２３１に戻る。
未選択のエントリ関数がない場合、詳細解析処理（Ｓ２３０）は終了する。
【００４１】
図１１に基づいて、再帰解析処理（Ｓ３００）を説明する。
ステップＳ３０１において、詳細解析部１３０は、対象関数が呼び出されたときに成り立つ呼出条件を特定する。対象関数は、詳細条件リスト１９６が生成される対象となる関数１０２である。
具体的な呼出条件は、当該関数に引数として渡される値および当該関数で使用されるグローバル変数に設定される値である。
対象関数がエントリ関数である場合、詳細解析部１３０は、エントリ関数のソースコードを構文解析および文字解析することによって、エントリ関数の呼出条件を特定する。
対象関数がエントリ関数以外の関数である場合、詳細解析部１３０は、当該関数を呼び出す呼び出し文を構文解析および文字解析することによって、当該関数に引数として渡される値を、当該関数の呼出条件として特定する。さらに、詳細解析部１３０は、当該関数および当該呼び出し文を含んだ関数を構文解析および文字解析することによって、当該関数で使用されるグローバル変数に設定される値を、当該関数の呼出条件として特定する。
【００４２】
ステップＳ３０２において、詳細解析部１３０は、対象関数とステップＳ３０１で特定した呼出条件との組に対応する詳細条件リスト１９６が生成済みであるか判定する。
当該組に対応する詳細条件リスト１９６が生成済みである場合、再帰解析処理（Ｓ３００）は終了する。
当該組に対応する詳細条件リスト１９６が生成済みでない場合、処理はステップＳ３０３に進む。
【００４３】
ステップＳ３０３において、詳細解析部１３０は、対象関数とステップＳ３０１で特定した呼出条件との組に対応付けて、空の詳細条件リスト１９６を生成する。
具体的には、詳細解析部１３０は、対象関数の名称と対象関数に引数として渡される値との組に対応付けて、空の詳細条件リスト１９６を生成する。
【００４４】
ステップＳ３０４において、詳細解析部１３０は、対象関数の簡略条件リスト１９２から、実行文を実行される順に選択する。選択される実行文を対象文とする。
具体的には、詳細解析部１３０は、対象関数の簡略条件リスト１９２の先頭から順に、実行文を１つずつ対象文として選択する。
【００４５】
ステップＳ３０５において、詳細解析部１３０は、対象関数の簡略条件リスト１９２から、対象文の簡略事前条件と対象文の簡略事後条件とを取得する。
そして、詳細解析部１３０は、対象文の簡略事前条件を作業事前条件ＰＲＥＶに設定し、対象文の簡略事後条件を作業事後条件ＡＦＴＥＲに設定する。
作業事前条件ＰＲＥＶは、対象関数と当該呼出条件との組に対応する詳細条件リスト１９６に登録される対象文の詳細事前条件が設定される変数である。
作業事後条件ＡＦＴＥＲは、対象関数と当該呼出条件との組に対応する詳細条件リスト１９６に登録される対象文の詳細事後条件が設定される変数である。
【００４６】
ステップＳ３１０は直前評価処理である。
ステップＳ３１０において、詳細解析部１３０は、対象文の前に実行される実行文である直前文が対象関数に含まれる場合、直前文の詳細事後条件を、対象関数と当該呼出条件との組に対応する詳細条件リスト１９６から取得する。そして、詳細解析部１３０は、直前文の詳細事後条件を作業事前条件ＰＲＥＶに追加する。
直前評価処理（Ｓ３１０）の詳細については別途説明する。
【００４７】
ステップＳ３２０は変数評価処理である。
ステップＳ３２０において、詳細解析部１３０は、特定の要素を含んだ条件が作業事前条件ＰＲＥＶまたは作業事後条件ＡＦＴＥＲに含まれる場合、当該要素を、対象関数の呼出条件に含まれる値または直前文の詳細事後条件に含まれる値に置き換える。特定の要素とは、対象関数の呼出条件に含まれる値または直前文の詳細事後条件に含まれる値に置き換えられる要素である。
変数評価処理（Ｓ３２０）の詳細については別途説明する。
【００４８】
ステップＳ３３０は再帰評価処理である。
ステップＳ３３０において、詳細解析部１３０は、対象文が関数を呼び出すための実行文である場合、対象文によって呼び出される関数である呼び出し先関数について詳細条件リスト１９６を生成する。そして、詳細解析部１３０は、呼び出し先関数の詳細条件リスト１９６に基づいて呼び出し先関数が実行された後に成り立つ条件を特定し、特定した条件に作業事後条件ＡＦＴＥＲに設定されている条件を置き換える。
再帰評価処理（Ｓ３３０）の詳細については別途説明する。
【００４９】
ステップＳ３４０は矛盾評価処理である。
ステップＳ３４０において、詳細解析部１３０は、作業事前条件ＰＲＥＶに矛盾があるか判定する。作業事前条件ＰＲＥＶに矛盾があると判定した場合、詳細解析部１３０は、作業事前条件ＰＲＥＶに設定された条件と作業事後条件ＡＦＴＥＲに設定された条件とを削除する。
矛盾評価処理（Ｓ３４０）の詳細については別途説明する。
【００５０】
ステップＳ３０６において、詳細解析部１３０は、作業事前条件ＰＲＥＶに設定されている条件を、対象文の詳細事前条件として、ステップＳ３０３で生成された詳細条件リスト１９６に登録する。
さらに、詳細解析部１３０は、作業事後条件ＡＦＴＥＲに設定されている条件を、対象文の詳細事後条件として、ステップＳ３０３で生成された詳細条件リスト１９６に登録する。
【００５１】
ステップＳ３０７において、詳細解析部１３０は、対象文として選択されていない実行文があるか判定する。
対象文として選択されていない実行文がある場合、処理はステップＳ３０４に戻る。
対象文として選択されていない実行文がない場合、再帰解析処理（Ｓ３００）は終了する。
【００５２】
図１２に基づいて、直前評価処理（Ｓ３１０）を説明する。
ステップＳ３１１において、詳細解析部１３０は、対象関数に対象文に対する直前文があるか判定する。
具体的には、詳細解析部１３０は、対象関数のソースコードに対して構文解析および文字解析を行うことにより、対象関数に対象文に対する直前文があるか判定する。
対象文の直前が条件分岐文のブロックである場合、複数の直前文が存在する。具体的には、対象文の直前がＩＦ文のブロックである場合、ＴＲＵＥ経路の最終の実行文と、ＥＬＳＥ経路の最終の実行文とが、直前文になる。ＴＲＵＥ経路とは、ＩＦ文で指定された条件が成り立つ場合に実行される処理である。ＥＬＳＥ経路とは、ＩＦ文で指定された条件が成り立たない場合に実行される処理である。
対象関数に対象文に対する直前文がある場合、処理はステップＳ３１２に進む。
対象関数に対象文に対する直前文がない場合、処理はステップＳ３１６に進む。
【００５３】
ステップＳ３１２において、詳細解析部１３０は、直前条件ＰＡＦＴＥＲに無条件φを設定する。
直前条件ＰＡＦＴＥＲは、直前文の詳細事後条件が設定される変数である。
無条件φは、成り立つ特定の条件がないことを意味する。
【００５４】
ステップＳ３１３において、詳細解析部１３０は、未選択の直前文を１つ選択する。
【００５５】
ステップＳ３１４において、詳細解析部１３０は、対象関数と当該呼出条件との組に対応する詳細条件リスト１９６から、選択した直前文の詳細事後条件を取得する。
そして、詳細解析部１３０は、取得された詳細事後条件を直前条件ＰＡＦＴＥＲに追加する。具体的には、詳細解析部１３０は、直前条件ＰＡＦＴＥＲに設定されている条件に、和集合を意味する記号と、取得された詳細事後条件とを付けたす。
取得された詳細事後条件が追加された後の直前条件ＰＡＦＴＥＲは、直前条件ＰＡＦＴＥＲに設定されていた条件と取得された詳細事後条件との和集合である。
【００５６】
ステップＳ３１５において、詳細解析部１３０は、未選択の直前文があるか判定する。
未選択の直前文がある場合、処理はステップＳ３１３に戻る。
未選択の直前文がない場合、処理はステップＳ３１７に進む。
【００５７】
ステップＳ３１６において、詳細解析部１３０は、直前条件ＰＡＦＴＥＲに対象関数の呼出条件を設定する。
【００５８】
ステップＳ３１７において、詳細解析部１３０は、直前条件ＰＡＦＴＥＲが無条件φであるか判定する。
直前条件ＰＡＦＴＥＲが無条件φでない場合、処理はステップＳ３１８に進む。
直前条件ＰＡＦＴＥＲが無条件φである場合、処理はステップＳ３１９に進む。
【００５９】
ステップＳ３１８において、詳細解析部１３０は、直前条件ＰＡＦＴＥＲを対象文の作業事前条件ＰＲＥＶに追加する。具体的には、詳細解析部１３０は、対象文の作業事前条件ＰＲＥＶに設定されている条件に、積集合を意味する記号と、直前条件ＰＡＦＴＥＲに設定されている条件とを付け足す。
直前条件ＰＡＦＴＥＲが追加された後の作業事前条件ＰＲＥＶは、作業事前条件ＰＲＥＶに設定されていた条件と直前条件ＰＡＦＴＥＲに設定されていた条件との積集合である。
【００６０】
ステップＳ３１９において、詳細解析部１３０は、対象文の作業事前条件ＰＲＥＶと対象文の作業事後条件ＡＦＴＥＲとを無条件φに更新する。
【００６１】
図６に示したｆｕｎｃ関数の簡略条件リスト１９２のうちの（４）の実行文を対象文として、直前評価処理（Ｓ３１０）が実行された後の作業事前条件ＰＲＥＶおよび作業事後条件ＡＦＴＥＲを、図１３に示す。ｆｕｎｃ関数の呼出条件は「ｘ＝０」である。（４）の実行文の直前文は（２）の実行文である。図１３の下線部分が、直前文の詳細事後条件として追加された条件である。
【００６２】
図１４に基づいて、変数評価処理（Ｓ３２０）を説明する。
ステップＳ３２１において、詳細解析部１３０は、特定の条件が対象文の作業事前条件ＰＲＥＶまたは作業事後条件ＡＦＴＥＲに含まれるか判定する。
特定の条件とは、特定の要素を含んだ条件である。
特定の要素とは、対象関数の呼出条件に含まれる値または直前文の詳細事後条件に含まれる値に置き換えられる要素である。
【００６３】
具体的には、詳細解析部１３０は以下のようにして判定を行う。
詳細解析部１３０は、対象関数と当該呼出条件との組に対応する詳細条件リスト１９６から、直前文の詳細事後条件を取得する。
そして、詳細解析部１３０は、対象文の作業事前条件ＰＲＥＶまたは作業事後条件ＡＦＴＥＲに含まれる条件毎に次のような処理を行う。
詳細解析部１３０は、条件を表す条件式の左辺に含まれる変数を取得し、取得した変数と同じ名称の変数が左辺に含まれる条件式を、対象関数の呼出条件および直前文の詳細事後条件から検索する。
当該条件式が対象関数の呼出条件または直前文の詳細事後条件に含まれる場合、詳細解析部１３０は、特定の条件が対象文の作業事前条件ＰＲＥＶまたは作業事後条件ＡＦＴＥＲに含まれる、と判定する。
【００６４】
特定の要素を含んだ条件が作業事前条件ＰＲＥＶまたは作業事後条件ＡＦＴＥＲに含まれる場合、処理はステップＳ３２２に進む。
特定の要素を含んだ条件が作業事前条件ＰＲＥＶまたは作業事後条件ＡＦＴＥＲに含まれない場合、変数評価処理（Ｓ３２０）は終了する。
【００６５】
ステップＳ３２２において、詳細解析部１３０は、特定の要素を、対象関数の呼出条件に含まれる値または直前文の詳細事後条件に含まれる値に置き換える。
特定の条件の右辺にある変数または不定値が特定の要素となる。不定値は変数が取り得る全ての値である。簡略条件リスト１９２または詳細条件リスト１９６の図に記されたｕｎｄｅｆｉｎｅｄは不定値を意味している。
対象関数の呼出条件または直前文の詳細事後条件に含まれる値のうちステップＳ３２１で検索された当該条件式の右辺にある値が、特定の要素を置き換える値となる。
【００６６】
図６に示したｆｕｎｃ関数の簡略条件リスト１９２のうちの（１）の実行文を対象文として、変数評価処理（Ｓ３２０）が行われた後の作業事前条件ＰＲＥＶおよび作業事後条件ＡＦＴＥＲを、図１５に示す。図１５の下線部分が置き換えられた部分である。
図４において、ｉｎｖｏｋｅ関数から呼び出されるｆｕｎｃ関数の引数ｘの値は０である。つまり、ｆｕｎｃ関数の呼出条件の１つは「ｘ＝０」である。そのため、図６の（１）において特定の条件に相当する「ｘ＝ｕｎｄｅｆｉｎｅｄ」は、図１５において「ｘ＝０」に置き換えられる。「ｘ＝ｕｎｄｅｆｉｎｅｄ」において、「ｘ」が特定の条件の左辺に含まれる変数に相当し、「ｕｎｄｅｆｉｎｅｄ」が特定の要素に相当する。
【００６７】
図１６に基づいて、再帰評価処理（Ｓ３３０）を説明する。
ステップＳ３３１において、詳細解析部１３０は、対象文が呼び出し文であるか判定する。呼び出し文は、関数を呼び出すための実行文である。
具体的には、詳細解析部１３０は、対象文を構文解析することにより、対象文の構文が呼び出し文の構文であるか判定する。対象文の構文が呼び出し文の構文である場合、詳細解析部１３０は、対象文が呼び出し文であると判定する。
対象文が呼び出し文である場合、処理はステップＳ３３２に進む。
対象文が呼び出し文でない場合、再帰評価処理（Ｓ３３０）は終了する。
【００６８】
ステップＳ３３２において、詳細解析部１３０は、対象文で呼び出される関数である呼び出し先関数を新たな対象関数として、再帰解析処理（Ｓ３００）を行う。
この再帰解析処理（Ｓ３００）により、呼び出し先関数と対象文における呼び出し先関数の引数との組に対応する詳細条件リスト１９６が生成される。
【００６９】
ステップＳ３３３において、詳細解析部１３０は、ステップＳ３３２で生成された詳細条件リスト１９６に基づいて、呼び出し先関数が実行された後に成り立つ条件を特定する。そして、詳細解析部１３０は、対象文の作業事後条件ＡＦＴＥＲに設定されている条件を、特定した条件に置き換える。
【００７０】
具体的には、詳細解析部１３０は以下のような処理を行う。
まず、詳細解析部１３０は、ステップＳ３３２で生成された詳細条件リスト１９６に含まれる最終の実行文がｒｅｔｕｒｎ文であるか判定する。当該最終の実行文がｒｅｔｕｒｎ文である場合、ｒｅｔｕｒｎ文の詳細事後条件から、呼び出し先関数の戻り値を取得する。
次に、詳細解析部１３０は、ステップＳ３３２で生成された詳細条件リスト１９６から、呼び出し先関数の最終の実行文の詳細事後条件を取得する。
そして、詳細解析部１３０は、対象文の作業事後条件ＡＦＴＥＲに設定されている条件を、呼び出し先関数の戻り値と呼び出し先関数の最終の実行文の詳細事後条件との積集合に置き換える。
【００７１】
図５に示したｉｎｖｏｋｅ関数の簡略条件リスト１９２のうちの（１）の実行文を対象文として、再帰評価処理（Ｓ３３０）が行われた後の作業事前条件ＰＲＥＶおよび作業事後条件ＡＦＴＥＲを、図１７に示す。図１７の下線部分が置き換えられた部分である。
図５の（１）において、対象文は「ｃ＝ｆｕｎｃ（ｃ）」であり、対象文の簡略事前条件は「ｃ＝０」である。この場合、呼び出し先関数はｆｕｎｃ関数であり、呼出条件は「ｃ＝０」である。この呼出条件でｆｕｎｃ関数が実行された場合、ｆｕｎｃ関数のｒｅｔｕｒｎ文で得られる戻り値は「ｃ＝１」である。そのため、図１７において、作業事後条件ＡＦＴＥＲは、「ｃ＝１」を含んだ条件に置き換えられている。図１７の作業事後条件ＡＦＴＥＲにおいて、「ｃ＝１∩」の後ろに含まれる条件が、ｆｕｎｃ関数の最終の実行文（ｒｅｔｕｒｎ文）の詳細事後条件である。
【００７２】
図１８に基づいて、矛盾評価処理（Ｓ３４０）を説明する。
ステップＳ３４１において、詳細解析部１３０は、対象文の作業事前条件ＰＲＥＶに矛盾があるか判定する。
具体的には、詳細解析部１３０は、同じ名称の変数が左辺の要素として含まれる条件式が作業事前条件ＰＲＥＶに複数あるか判定する。同じ名称の変数が左辺の要素として含まれる条件式が作業事前条件ＰＲＥＶに複数ある場合、詳細解析部１３０は、当該複数の条件式の演算子および右辺を比較する。そして、演算子および右辺が合致しない場合、詳細解析部１３０は、作業事前条件ＰＲＥＶに矛盾があると判定する。
対象文の作業事前条件ＰＲＥＶに矛盾がある場合、処理はＳ３４２に進む。
対象文の作業事前条件ＰＲＥＶに矛盾がない場合、矛盾評価処理（Ｓ３４０）は終了する。
【００７３】
図１９に、矛盾がある作業事前条件ＰＲＥＶの例を示す。
図１９において、作業事前条件ＰＲＥＶには、変数ｘが左辺の要素として含まれる条件式が２つある。一方の条件式は「ｘ≠０」であり、他方の条件式は「ｘ＝０」であり、両方の条件式は論理積で結合されている。つまり、両方の条件式を結合して得られる条件式は「ｘ＝０∩ｘ≠０」である。一方の条件式の演算子および右辺は「≠０」であり、他方の条件式の演算子および右辺は「＝０」であるため、両者は合致しない。したがって、この作業事前条件ＰＲＥＶには矛盾がある、という判定がなされる。
【００７４】
図１８に戻り、ステップＳ３４２を説明する。
ステップＳ３４２において、詳細解析部１３０は、対象文の作業事前条件ＰＲＥＶに設定されている条件と、対象文の作業事後条件ＡＦＴＥＲに設定されている条件とのそれぞれを、無条件φに更新する。対象文の作業事前条件ＰＲＥＶが矛盾しているということは、対象関数が実行されても対象文には到達しないためである。
【００７５】
上記において、解析処理（Ｓ２００）の詳細について説明した。
解析処理（Ｓ２００）により、ソースコード１０１に含まれる関数と関数の呼出条件との組毎の詳細条件リスト１９６が生成される。
図４に示した変更前のソースコード１０１に対して解析処理（Ｓ２００）を行うことによって得られる詳細条件ファイル１９５の構成を、図２０に示す。
図２０において、詳細条件ファイル１９５は、ｉｎｖｏｋｅ関数と呼出条件（ｖｏｉｄ）との組に対応する詳細条件リスト１９６を含んでいる。また、詳細条件ファイル１９５は、ｆｕｎｃ関数と呼出条件（ｘ＝０）との組に対応する詳細条件リスト１９６を含んでいる。さらに、詳細条件ファイル１９５は、ａｒｒａｙＳｉｚｅ関数と呼出条件（ｘ＝０〜４）との組に対応する詳細条件リスト１９６を含んでいる。「０〜４」は、呼出条件となる引数の値域である。値域は、取り得る値の範囲である。
図２１に、ｉｎｖｏｋｅ関数と呼出条件（ｖｏｉｄ）との組に対応する詳細条件リスト１９６を示す。
図２２に、ｆｕｎｃ関数と呼出条件（ｘ＝０）との組に対応する詳細条件リスト１９６を示す。
図２３に、ａｒｒａｙＳｉｚｅ関数と呼出条件（ｘ＝０）との組に対応する詳細条件リスト１９６を示す。
図２４に、ａｒｒａｙＳｉｚｅ関数と呼出条件（ｘ＝１）との組に対応する詳細条件リスト１９６を示す。
図２５に、ａｒｒａｙＳｉｚｅ関数と呼出条件（ｘ＝２）との組に対応する詳細条件リスト１９６を示す。
図２６に、ａｒｒａｙＳｉｚｅ関数と呼出条件（ｘ＝３）との組に対応する詳細条件リスト１９６を示す。
図２７に、ａｒｒａｙＳｉｚｅ関数と呼出条件（ｘ＝４）との組に対応する詳細条件リスト１９６を示す。
詳細条件リスト１９６の第１列は、実行文を識別する番号を示している。
詳細条件リスト１９６の第２列は、実行文を示している。
詳細条件リスト１９６の第３列は、事前条件と事後条件とを区別している。
詳細条件リスト１９６の第４列は、事前条件または事後条件を示している。詳細条件リスト１９６における事前条件および事後条件は、詳細事前条件および詳細事後条件に相当する。
【００７６】
図２に戻り、ステップＳ１２０から説明を続ける。
ステップＳ１２０は、変更後のソースコード１０１に対する解析処理（Ｓ２００）である。
ステップＳ１２０において、ソースコード比較装置１００は、変更後のソースコード１０１に対して、解析処理（Ｓ２００）を行う。
【００７７】
ステップＳ１３０は比較処理である。
ステップＳ１３０において、比較部１４０は、変更前の詳細条件リスト１９６と、変更後の詳細条件リスト１９６とに基づいて、変動リスト１９９を生成する。
変更前の詳細条件リスト１９６は、変更前のソースコード１０１に対して生成された詳細条件リスト１９６である。
変更後の詳細条件リスト１９６は、変更後のソースコード１０１に対して生成された詳細条件リスト１９６である。
変動リスト１９９は、変更前のソースコード１０１と変更後のソースコード１０１との間で詳細事前条件と詳細事後条件との少なくともいずれかが異なる実行文を特定する情報を含んだリストである。
【００７８】
図２８に基づいて、比較処理（Ｓ１３０）を説明する。
ステップＳ１３１において、比較部１４０は、変更前のソースコード１０１および変更後のソースコード１０１から、未選択の関数を１つ選択する。
【００７９】
ステップＳ１３２において、比較部１４０は、選択した関数の変更前の詳細条件リスト１９６を結合して、選択した関数の変更前の結合条件リスト１９８を生成する。
さらに、比較部１４０は、選択した関数の変更後の詳細条件リスト１９６を結合して、選択した関数の変更後の結合条件リスト１９８を生成する。
結合条件リスト１９８は、ソースコード１０１に含まれる関数毎に、関数に含まれる実行文と、実行文が実行される前に成り立つ結合事前条件と、実行文が実行された後に成り立つ結合事後条件と、が互いに対応付けられたリストである。
【００８０】
具体的には、比較部１４０は、詳細条件リスト１９６に含まれる実行文毎に、詳細事前条件の和集合と詳細事後条件の和集合とを生成する。そして、比較部１４０は、実行文毎の詳細事前条件の和集合を実行文毎の結合事前条件として結合条件リスト１９８に登録し、実行文毎の詳細事後条件の和集合を実行文毎の結合事後条件として結合条件リスト１９８に登録する。
【００８１】
図２１〜図２７の詳細条件リスト１９６から得られる結合条件リスト１９８を含んだ結合条件ファイル１９７を、図２９に示す。
図２９の結合条件ファイル１９７は、ｉｎｖｏｋｅ関数とｆｕｎｃ関数とａｒｒａｙＳｉｚｅ関数とのそれぞれの結合条件リスト１９８を含んでいる。ｆｕｎｃ関数の結合条件リスト１９８の全体は、図３０に示している。ｉｎｖｏｋｅ関数の結合条件リスト１９８の中身は、ｉｎｖｏｋｅ関数と呼出条件（ｖｏｉｄ）との組に対応する詳細条件リスト１９６の中身と同じである。ｆｕｎｃ関数の結合条件リスト１９８の中身は、ｆｕｎｃ関数と呼出条件（ｘ＝０）との組に対応する詳細条件リスト１９６の中身と同じである。
結合条件リスト１９８の第１列は、実行文を識別する番号を示している。
結合条件リスト１９８の第２列は、実行文を示している。
結合条件リスト１９８の第３列は、事前条件と事後条件とを区別している。
結合条件リスト１９８の第４列は、事前条件または事後条件を示している。結合条件リスト１９８における事前条件および事後条件は、結合事前条件および結合事後条件に相当する。
【００８２】
図３１に、変更後のソースコード１０１を示す。図３１のソースコード１０１において、下線が引かれた部分が変更された部分である。
図３１のソースコード１０１を基にして得られる結合条件ファイル１９７を、図３２に示す。
図３２の結合条件ファイル１９７は、ｉｎｖｏｋｅ関数とｆｕｎｃ関数とａｒｒａｙＳｉｚｅ関数とのそれぞれの結合条件リスト１９８を含んでいる。ｆｕｎｃ関数の結合条件リスト１９８の全体は、図３３に示している。
【００８３】
図２８に戻り、ステップＳ１３３から説明を続ける。
ステップＳ１３３において、比較部１４０は、変更前の結合条件リスト１９８または変更後の結合条件リスト１９８から、未選択の実行文を１つ選択する。
【００８４】
ステップＳ１３４において、比較部１４０は、選択した実行文の結合事前条件と結合事後条件とを、変更前の結合条件リスト１９８と変更後の結合条件リスト１９８とのそれぞれから取得する。
そして、比較部１４０は、比較部１４０は、変更前の結合条件リスト１９８から取得した結合事前条件と、変更後の結合条件リスト１９８から取得した結合事前条件とを比較する。さらに、比較部１４０は、変更前の結合条件リスト１９８から取得した結合事後条件と、変更後の結合条件リスト１９８から取得した結合事後条件とを比較する。
【００８５】
ステップＳ１３５において、比較部１４０は、比較した結合事前条件が不一致であるか判定する。さらに、比較部１４０は、比較した結合事後条件が不一致であるか判定する。
比較した結合事前条件と比較した結合事後条件との少なくともいずれかが不一致である場合、処理はステップＳ１３６に進む。
比較した結合事前条件と比較した結合事後条件とのいずれも不一致でない場合、処理はステップＳ１３７に進む。
【００８６】
ステップＳ１３６において、比較部１４０は、選択した実行文に関する情報を変動リスト１９９に追加する。
【００８７】
図２９の結合条件ファイル１９７に含まれる結合条件リスト１９８と図３２の結合条件ファイル１９７に含まれる結合条件リスト１９８とを比較して得られる変動リスト１９９を、図３４に示す。
図３４において、変動リスト１９９は、ファイル名の欄と、行番号の欄と、変更前の事前条件の欄と、変更後の事前条件の欄と、変更前の事後条件の欄と、変更後の事後条件の欄とを備えている。
ファイル名の欄は、当該実行文を含んだ関数のソースコードが記載されたファイルの名称を示す。
行番号の欄は、当該関数の変更後のソースコードにおいて当該実行文が記載されている行の番号を示す。
変更前の事前条件の欄は、当該実行文の変更前の結合事前条件を示す。
変更後の事前条件の欄は、当該実行文の変更後の結合事前条件を示す。
変更前の事後条件の欄は、当該実行文の変更前の結合事後条件を示す。
変更後の事後条件の欄は、当該実行文の変更後の結合事後条件を示す。
【００８８】
図２８に戻り、ステップＳ１３７から説明を続ける。
ステップＳ１３７において、比較部１４０は、未選択の実行文があるか判定する。
未選択の実行文がある場合、処理はステップＳ１３３に戻る。
未選択の実行文がない場合、処理はステップＳ１３８に進む。
【００８９】
ステップＳ１３８において、比較部１４０は、未選択の関数があるか判定する。
未選択の関数がある場合、処理はステップＳ１３１に戻る。
未選択の関数がない場合、比較処理（Ｓ１３０）は終了する。
【００９０】
＊＊＊実施の形態１の効果＊＊＊
ソフトウェアが変更される場合に変更の影響が及ぶ箇所を、関数単位ではなく実行文単位および行単位で、目視ではなく自動で特定することができる。
【００９１】
実施の形態２．
除外の対象となる変数を含んだ条件を詳細事前条件および詳細事後条件から除外する形態について、図３５から図３９に基づいて説明する。但し、実施の形態１と重複する説明は省略または簡略する。
【００９２】
＊＊＊構成の説明＊＊＊
図３５に基づいて、ソースコード比較装置１００の構成について説明する。
ソースコード比較装置１００の構成は、実施の形態１と同じである。
但し、メモリ９０２には、除外リスト１０３が記憶される。
除外リスト１０３は、除外の対象となる変数のリストである。
【００９３】
＊＊＊動作の説明＊＊＊
ソースコード比較方法の処理の流れは、実施の形態１と同じである。
但し、再帰解析処理（Ｓ３００）の一部が、実施の形態１と異なる。
【００９４】
図３６に基づいて、再帰解析処理（Ｓ３００）を説明する。
再帰解析処理（Ｓ３００）は、ステップＳ３０８を含んでいる。他のステップは、実施の形態１と同じである。
【００９５】
ステップＳ３０８において、詳細解析部１３０は、対象関数の詳細条件リスト１９６に含まれる詳細事前条件および詳細事後条件から、除外の対象となる変数を含んだ条件を除外する。
【００９６】
具体的には、詳細解析部１３０は、除外リスト１０３に示される変数毎に以下の処理を行う。除外リスト１０３に示される変数を除外変数という。
詳細解析部１３０は、除外変数を含んだ詳細事前条件および除外変数を含んだ詳細事後条件を、詳細条件リスト１９６から検索する。詳細事前条件と詳細事後条件とを総称して、詳細条件という。詳細条件は、１つ以上の条件式で構成される。複数の条件式は、論理和を意味する結合記号（∪）または論理積を意味する結合記号（∩）を用いて結合される。
除外変数を含んだ詳細条件が見つかった場合、詳細解析部１３０は、当該詳細条件に含まれる条件式を結合記号を区切りにして分離することによって、除外変数を含んだ条件式を特定する。
そして、詳細解析部１３０は、特定した条件式と特定した条件式の前に付されている記号とを、除外変数を含んだ詳細条件から削除する。
【００９７】
図３７に、除外リスト１０３を示す。
図３７の除外リスト１０３において、除外変数は「ａｒｒａｙ」である。
【００９８】
図２１の詳細条件リスト１９６から除外変数（ａｒｒａｙ）を含んだ条件を除外して得られる詳細条件リスト１９６を、図３８に示す。
図２２の詳細条件リスト１９６から除外変数を含んだ条件を除外して得られる詳細条件リスト１９６を、図３９に示す。
図２１および図３８はｉｎｖｏｋｅ関数の詳細条件リスト１９６であり、図２２および図３９はｆｕｎｃ関数の詳細条件リスト１９６である。
ｉｎｖｏｋｅ関数から呼び出されるｆｕｎｃ関数の詳細条件リスト１９６から除外変数を含んだ条件が除外されることに伴って、ｆｕｎｃ関数の呼び出し元であるｉｎｖｏｋｅ関数の詳細条件リスト１９６から除外変数を含んだ条件が除外される。
【００９９】
＊＊＊実施の形態２の効果＊＊＊
詳細条件リスト１９６に含まれる事前条件および事後条件を簡潔にすることができる。これに伴い、変動リスト１９９に含まれる事前条件および事後条件が簡潔になる。その結果、変更の影響が及ぶ箇所を特定する精度が向上する。
【０１００】
グローバル変数の中には、特定の関数からのみ参照される変数、または、値の一時格納場所として利用されるものがある。これらのグローバル変数が事前条件および事後条件に含まれる場合、変動リスト１９９において、事前条件の論理式記述および事後条件の論理式記述が多くなる。そして、不要なグローバル変数の値域の変動が変更影響箇所として表れる可能性がある。
一方、実施の形態２では、特定のグローバル変数が事前条件および事後条件から除外されるため、変動リスト１９９において、事前条件の論理式記述および事後条件の論理式記述が削減される。これにより、特定される変更影響範囲の精度を高めることができる。
【０１０１】
実施の形態３．
追加の対象となる標準関数についての引数の条件を詳細事後条件に追加する形態について、図４０から図４５に基づいて説明する。但し、実施の形態１と重複する説明は省略または簡略する。
【０１０２】
＊＊＊構成の説明＊＊＊
図４０に基づいて、ソースコード比較装置１００の構成について説明する。
ソースコード比較装置１００の構成は、実施の形態１と同じである。
但し、メモリ９０２には、追加リスト１０４が記憶される。
追加リスト１０４は、追加の対象となる標準関数のリストである。
標準関数は、ソースコード１０１に含まれる関数とは別の関数であって、標準で用意されている関数である。具体的な標準関数は、動的にメモリを確保するためのｍａｌｌｏｃ関数である。
【０１０３】
＊＊＊動作の説明＊＊＊
ソースコード比較方法の処理の流れは、実施の形態１と同じである。
但し、再帰解析処理（Ｓ３００）の一部が、実施の形態１と異なる。
【０１０４】
図４１に基づいて、再帰解析処理（Ｓ３００）を説明する。
再帰解析処理（Ｓ３００）は、ステップＳ３５０を含んでいる。他のステップは、実施の形態１と同じである。
【０１０５】
ステップＳ３５０は追加評価処理である。
ステップＳ３５０において、詳細解析部１３０は、対象文が、追加の対象となる標準関数を呼び出すための実行文である場合、標準関数の引数について成り立つ条件を、対象文の作業事後条件ＡＦＴＥＲに追加する。
【０１０６】
図４２に基づいて、追加評価処理（Ｓ３５０）を説明する。
ステップＳ３５１において、詳細解析部１３０は、対象文が追加関数文であるか判定する。追加関数文は、追加の対象となる標準関数である追加関数を呼び出すための実行文である。
具体的には、詳細解析部１３０は、追加リスト１０４に示される標準関数の名称が対象文に含まれるか判定する。追加リスト１０４に示される標準関数の名称が対象文に含まれる場合、詳細解析部１３０は、対象文が追加関数文である、と判定する。
対象文が追加関数文である場合、処理はステップＳ３５２に進む。
対象文が追加関数文でない場合、追加評価処理（Ｓ３５０）は終了する。
【０１０７】
ステップＳ３５２において、詳細解析部１３０は、対象文と対象文の作業事前条件ＰＲＥＶとに基づいて、追加関数の引数について成り立つ条件を特定する。
そして、詳細解析部１３０は、特定した条件を、対象文の作業事後条件ＡＦＴＥＲに追加する。
【０１０８】
具体的には、詳細解析部１３０は以下のような処理を行う。
詳細解析部１３０は、対象文から追加関数の引数を取得する。
追加関数の引数が変数である場合、詳細解析部１３０は、その変数を左辺の要素として含んだ条件式が、対象文の作業事前条件ＰＲＥＶに含まれるか判定する。
当該条件式が対象文の作業事前条件ＰＲＥＶに含まれる場合、詳細解析部１３０は、追加関数の引数である変数を当該条件式の右辺の値に置き換える。
次に、詳細解析部１３０は、追加関数の引数である変数または値が指定された追加条件を生成する。
次に、詳細解析部１３０は、対象文の作業事後条件ＡＦＴＥＲに設定されている条件と追加条件との積集合を生成する。
そして、詳細解析部１３０は、対象文の作業事後条件ＡＦＴＥＲに設定されている条件を、生成した積集合に置き換える。
【０１０９】
図４３に、追加リスト１０４を示す。
図４３の追加リスト１０４において、追加関数は「ｍａｌｌｏｃ」である。
【０１１０】
図２１の詳細条件リスト１９６に追加関数（ｍａｌｌｏｃ）の引数についての条件を追加して得られる詳細条件リスト１９６を、図４４に示す。図４４の詳細条件リスト１９６において、下線の部分が追加された条件を示す部分である。
図２２の詳細条件リスト１９６に追加関数の引数についての条件を追加して得られる詳細条件リスト１９６を、図４５に示す。図４５の詳細条件リスト１９６において、下線の部分が追加された条件を示す部分である。
図２１および図４４はｉｎｖｏｋｅ関数の詳細条件リスト１９６であり、図２２および図４５はｆｕｎｃ関数の詳細条件リスト１９６である。
ｉｎｖｏｋｅ関数から呼び出されるｆｕｎｃ関数の詳細条件リスト１９６に追加関数の引数についての条件が追加されることに伴って、ｆｕｎｃ関数の呼び出し元であるｉｎｖｏｋｅ関数の詳細条件リスト１９６に追加関数の引数についての条件が追加される。
【０１１１】
＊＊＊実施の形態３の効果＊＊＊
詳細条件リスト１９６に含まれる事前条件および事後条件を拡張することができる。これに伴い、変動リスト１９９に含まれる事前条件および事後条件が拡張される。その結果、変更の影響が及ぶ箇所を特定する精度が向上する。
【０１１２】
ドライバまたはＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ  Ｉｎｔｅｒｆａｃｅ）などのように、呼出しパラメータの値域によって振る舞いが異なる関数がある。そのような関数が呼び出されるときの引数の値域が事前条件および事後条件に含まれない場合、関数の値域の変動が変更影響箇所として特定されない可能性がある。
一方、実施の形態３では、特定の関数の引数が事前条件および事後条件に追加されるため、変動リスト１９９において、事前条件の論理式記述および事後条件の論理式記述が拡張される。これにより、特定される変更影響範囲の精度を高めることができる。
【０１１３】
＊＊＊実施の形態の補足＊＊＊
各実施の形態において、ソースコード比較装置１００の機能はハードウェアで実現してもよい。
図４６に、ソースコード比較装置１００の機能がハードウェアで実現される場合の構成を示す。
ソースコード比較装置１００は処理回路９９０を備える。処理回路９９０はプロセッシングサーキットリともいう。
処理回路９９０は、各実施の形態で説明した「部」の機能を実現する専用の電子回路である。この「部」には記憶部も含まれる。
具体的には、処理回路９９０は、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックＩＣ、ＧＡ、ＡＳＩＣ、ＦＰＧＡまたはこれらの組み合わせである。ＧＡはＧａｔｅ  Ａｒｒａｙの略称であり、ＡＳＩＣはＡｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔの略称であり、ＦＰＧＡはＦｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙの略称である。
なお、ソースコード比較装置１００が複数の処理回路９９０を備えて、複数の処理回路９９０が「部」の機能を連携して実現してもよい。
【０１１４】
ソースコード比較装置１００の機能は、ソフトウェアとハードウェアとの組み合わせで実現してもよい。つまり、「部」の一部をソフトウェアで実現し、「部」の残りをハードウェアで実現してもよい。
【０１１５】
各実施の形態は、好ましい形態の例示であり、本発明の技術的範囲を制限することを意図するものではない。各実施の形態は、部分的に実施してもよいし、他の形態と組み合わせて実施してもよい。
フローチャート等を用いて説明した手順は、各実施の形態における方法およびプログラムの手順の一例である。
【符号の説明】
【０１１６】
１００  ソースコード比較装置、１０１  ソースコード、１０２  関数、１０３  除外リスト、１０４  追加リスト、１１０  簡略解析部、１２０  エントリ解析部、１３０  詳細解析部、１４０  比較部、１９１  簡略条件ファイル、１９２  簡略条件リスト、１９３  依存リスト、１９４  エントリ関数リスト、１９５  詳細条件ファイル、１９６  詳細条件リスト、１９７  結合条件ファイル、１９８  結合条件リスト、１９９  変動リスト、９００  コンピュータ、９０１  プロセッサ、９０２  メモリ、９０３  補助記憶装置、９９０  処理回路。
【図１】
2017115449.tif 000003
【図２】
2017115449.tif 000004
【図３】
2017115449.tif 000005
【図４】
2017115449.tif 000006
【図５】
2017115449.tif 000007
【図６】
2017115449.tif 000008
【図７】
2017115449.tif 000009
【図８】
2017115449.tif 000010
【図９】
2017115449.tif 000011
【図１０】
2017115449.tif 000012
【図１１】
2017115449.tif 000013
【図１２】
2017115449.tif 000014
【図１３】
2017115449.tif 000015
【図１４】
2017115449.tif 000016
【図１５】
2017115449.tif 000017
【図１６】
2017115449.tif 000018
【図１７】
2017115449.tif 000019
【図１８】
2017115449.tif 000020
【図１９】
2017115449.tif 000021
【図２０】
2017115449.tif 000022
【図２１】
2017115449.tif 000023
【図２２】
2017115449.tif 000024
【図２３】
2017115449.tif 000025
【図２４】
2017115449.tif 000026
【図２５】
2017115449.tif 000027
【図２６】
2017115449.tif 000028
【図２７】
2017115449.tif 000029
【図２８】
2017115449.tif 000030
【図２９】
2017115449.tif 000031
【図３０】
2017115449.tif 000032
【図３１】
2017115449.tif 000033
【図３２】
2017115449.tif 000034
【図３３】
2017115449.tif 000035
【図３４】
2017115449.tif 000036
【図３５】
2017115449.tif 000037
【図３６】
2017115449.tif 000038
【図３７】
2017115449.tif 000039
【図３８】
2017115449.tif 000040
【図３９】
2017115449.tif 000041
【図４０】
2017115449.tif 000042
【図４１】
2017115449.tif 000043
【図４２】
2017115449.tif 000044
【図４３】
2017115449.tif 000045
【図４４】
2017115449.tif 000046
【図４５】
2017115449.tif 000047
【図４６】
2017115449.tif 000048
【国際調査報告】
2017115449.tif 000049
2017115449.tif 000050