JP6419357B2 - ソースコード比較装置およびソースコード比較プログラム - Google Patents
ソースコード比較装置およびソースコード比較プログラム Download PDFInfo
- Publication number
- JP6419357B2 JP6419357B2 JP2017558840A JP2017558840A JP6419357B2 JP 6419357 B2 JP6419357 B2 JP 6419357B2 JP 2017558840 A JP2017558840 A JP 2017558840A JP 2017558840 A JP2017558840 A JP 2017558840A JP 6419357 B2 JP6419357 B2 JP 6419357B2
- Authority
- JP
- Japan
- Prior art keywords
- detailed
- condition
- function
- source code
- list
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/73—Program documentation
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Prevention of errors by analysis, debugging or testing of software
- G06F11/3604—Analysis of software for verifying properties of programs
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/33—Intelligent editors
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/72—Code refactoring
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Library & Information Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Stored Programmes (AREA)
Description
しかし、特許文献1に記載の手法では、依存関係がある関数のうちの変更の影響を受ける関数については、関数内の記述を目視で確認する必要がある。
具体的には、特許文献2には、各実行経路における出力項目の値域の変化を用いて、変更の影響を受けるテストケースを検出する手法が記載されている。
また、特許文献3には、各実行経路における入力項目の値域の変化を用いて、変更の影響を受けるテストケースを検出する手法が記載されている。
しかし、特許文献2または特許文献3に記載の手法では、変更影響箇所を関数粒度で特定することはできても、変更影響箇所を行単位で抽出することはできない。
変更前のソースコードと変更後のソースコードとに対して、ソースコードに含まれる関数と関数が呼び出されたときに成り立つ呼出条件との組毎に、関数に含まれる実行文と、呼出条件の下で実行文が実行される前に成り立つ詳細事前条件と、呼出条件の下で実行文が実行された後に成り立つ詳細事後条件と、が互いに対応付けられた詳細条件リストを生成する詳細解析部と、
変更前のソースコードに対して生成された詳細条件リストである変更前の詳細条件リストと、変更後のソースコードに対して生成された詳細条件リストである変更後の詳細条件リストとに基づいて、変更前のソースコードと変更後のソースコードとの間で詳細事前条件と詳細事後条件との少なくともいずれかが異なる実行文を特定する情報を含んだ変動リストを生成する比較部とを備える。
変更前のソースコードと変更後のソースコードとを比較するソースコード比較装置100について、図1から図34に基づいて説明する。
図1に基づいて、ソースコード比較装置100の構成について説明する。
ソースコード比較装置100は、プロセッサ901とメモリ902と補助記憶装置903といったハードウェアを備えるコンピュータである。プロセッサ901は、信号線を介して他のハードウェアと接続されている。
メモリ902は揮発性の記憶装置である。メモリ902は、主記憶装置またはメインメモリとも呼ばれる。具体的には、メモリ902はRAM(Random Access Memory)である。
補助記憶装置903は不揮発性の記憶装置である。具体的には、補助記憶装置903は、ROM、HDDまたはフラッシュメモリである。ROMはRead Only Memoryの略称であり、HDDはHard Disk Driveの略称である。
さらに、補助記憶装置903にはOS(Operating System)が記憶されている。OSの少なくとも一部は、メモリ902にロードされて、プロセッサ901によって実行される。
つまり、プロセッサ901は、OSを実行しながら、「部」の機能を実現するプログラムを実行する。
「部」の機能を実現するプログラムを実行して得られるデータは、メモリ902、補助記憶装置903、プロセッサ901内のレジスタまたはプロセッサ901内のキャッシュメモリといった記憶装置に記憶される。これらの記憶装置は、データを記憶する記憶部として機能する。
なお、ソースコード比較装置100が複数のプロセッサ901を備えて、複数のプロセッサ901が「部」の機能を実現するプログラムを連携して実行してもよい。
具体的には、メモリ902には次のようなデータが記憶される。メモリ902には、変更前のソースコード101および変更後のソースコード101が記憶される。メモリ902には、変更前のソースコード101に対応する簡略条件ファイル191と依存リスト193とエントリ関数リスト194と詳細条件ファイル195と結合条件ファイル197が記憶される。メモリ902には、変更後のソースコード101に対応する簡略条件ファイル191と依存リスト193とエントリ関数リスト194と詳細条件ファイル195と結合条件ファイル197が記憶される。メモリ902には変動リスト199が記憶される。メモリ902に記憶されるデータの内容については後述する。
「部」は「処理」または「工程」に読み替えてもよい。「部」の機能はファームウェアで実現してもよい。
「部」の機能を実現するプログラムは、磁気ディスク、光ディスクまたはフラッシュメモリ等の不揮発性の記憶媒体に記憶することができる。
ソースコード比較装置100の動作はソースコード比較方法に相当する。また、ソースコード比較方法の手順はソースコード比較プログラムの手順に相当する。
ステップS110は、変更前のソースコード101に対する解析処理(S200)である。
ステップS110において、ソースコード比較装置100は、変更前のソースコード101に対して、解析処理(S200)を行う。
ソースコード101は関数102毎のソースコードを含んでいる。つまり、ソースコード101は複数の関数102を含んでいる。関数102は1つ以上の命令文を含んでいる。
ステップS210は簡略解析処理である。
ステップS210において、簡略解析部110は、ソースコード101に基づいて、簡略条件ファイル191を生成する。
簡略条件ファイル191は、ソースコード101に含まれる関数102毎の簡略条件リスト192を含んだファイルである。
簡略条件リスト192は、関数102に含まれる実行文と、実行文が実行される前に成り立つ簡略事前条件と、実行文が実行された後に成り立つ簡略事後条件と、が互いに対応付けられたリストである。
実行文は、関数102に含まれる命令文のうちの処理の内容が指定された命令文である。具体的には、演算式が指定された演算文、変数に値を代入するための代入文および関数を呼び出すための呼び出し文といった命令文が実行文である。一方、変数を定義するための定義文および処理の流れを制御するための制御文といった命令文は実行文ではない。但し、制御文の中で指定された演算文、代入文および呼び出し文は実行文である。具体的な制御文はFOR文およびIF文などである。FOR文は、同じ内容の処理を繰り返すためのループ文の1つである。IF文は、条件に応じて処理を分岐するための条件分岐文の1つある。
図4のソースコード101は、invoke関数とfunc関数とarraySize関数とのそれぞれの変更前のソースコードを含んでいる。
図5の簡略条件ファイル191は、invoke関数とfunc関数とarraySize関数とのそれぞれの簡略条件リスト192を含んでいる。func関数の簡略条件リスト192の全体は、図6に示している。
簡略条件リスト192の第1列は、実行文を識別する番号を示している。ソースコード101の図には、この番号を付している。
簡略条件リスト192の第2列は、実行文を示している。
簡略条件リスト192の第3列は、事前条件と事後条件とを区別している。
簡略条件リスト192の第4列は、事前条件または事後条件を示している。事前条件および事後条件は、1つの条件式または複数の条件式の結合で表される。事前条件および事後条件を表す1つの条件式または複数の条件式の結合は、論理式ともいう。
簡略条件リスト192における事前条件および事後条件は、簡略事前条件および簡略事後条件に相当する。
ステップS220はエントリ解析処理である。
ステップS220において、エントリ解析部120は、ソースコード101からエントリ関数を特定してエントリ関数リスト194を生成する。
エントリ関数リスト194は、エントリ関数を示すファイルである。エントリ関数は、少なくともいずれかの関数を呼び出すがいずれの関数からも呼び出されない関数である。
ステップS221において、エントリ解析部120は、依存リスト193を生成する。
依存リスト193は、関数を呼び出す関数である依存元関数と依存元関数から呼び出される関数である依存先関数とを互いに対応付けたリストである。
まず、エントリ解析部120は、関数102のソースコードに対して構文解析および文字解析を行うことによって、関数102のソースコードから呼び出し文を抽出する。
次に、エントリ解析部120は、抽出した呼び出し文に対して構文解析および文字解析を行うことによって、抽出した呼び出し文によって呼び出される関数を特定する。
そして、エントリ解析部120は、関数102を依存元関数として依存リスト193に登録し、特定した関数を依存先関数として依存リスト193に登録する。
ステップS222において、エントリ解析部120は、依存リスト193を複製する。複製された依存リスト193はエントリ関数リスト194の元になる。
具体的には、エントリ解析部120は、複製された依存リスト193の先頭から順番に依存元関数を1つずつ選択する。
選択された依存元関数と同じ名称の依存先関数が複製された依存リスト193に含まれている場合、処理はステップS225に進む。
選択された依存元関数と同じ名称の依存先関数が複製された依存リスト193に含まれていない場合、処理はステップS226に進む。
未選択の依存元関数がある場合、処理はステップS223に戻る。
未選択の依存元関数がない場合、処理はステップS227に進む。
ステップS230は詳細解析処理である。
ステップS230において、詳細解析部130は、ソースコード101と簡略条件ファイル191とエントリ関数リスト194とに基づいて、詳細条件ファイル195を生成する。
詳細条件ファイル195は、ソースコード101に含まれる関数102と関数102が呼び出されるときに成り立つ呼出条件との組毎の詳細条件リスト196を含んだファイルである。
詳細条件リスト196は、関数102に含まれる実行文と、呼出条件の下で実行文が実行される前に成り立つ詳細事前条件と、呼出条件の下で実行文が実行された後に成り立つ詳細事後条件と、が互いに対応付けられたリストである。
ステップS231において、詳細解析部130は、エントリ関数リスト194から、未選択のエントリ関数を1つ選択する。
具体的には、詳細解析部130は、エントリ関数リスト194の先頭から順番にエントリ関数を1つずつ選択する。
ステップS300において、詳細解析部130は、エントリ関数を最初の対象関数にして、エントリ関数の詳細条件リスト196と、エントリ関数の実行に伴って呼び出される関数の詳細条件リスト196とを生成する。
再帰解析処理(S300)については別途説明する。
未選択のエントリ関数がある場合、処理はステップS231に戻る。
未選択のエントリ関数がない場合、詳細解析処理(S230)は終了する。
ステップS301において、詳細解析部130は、対象関数が呼び出されたときに成り立つ呼出条件を特定する。対象関数は、詳細条件リスト196が生成される対象となる関数102である。
具体的な呼出条件は、当該関数に引数として渡される値および当該関数で使用されるグローバル変数に設定される値である。
対象関数がエントリ関数である場合、詳細解析部130は、エントリ関数のソースコードを構文解析および文字解析することによって、エントリ関数の呼出条件を特定する。
対象関数がエントリ関数以外の関数である場合、詳細解析部130は、当該関数を呼び出す呼び出し文を構文解析および文字解析することによって、当該関数に引数として渡される値を、当該関数の呼出条件として特定する。さらに、詳細解析部130は、当該関数および当該呼び出し文を含んだ関数を構文解析および文字解析することによって、当該関数で使用されるグローバル変数に設定される値を、当該関数の呼出条件として特定する。
当該組に対応する詳細条件リスト196が生成済みである場合、再帰解析処理(S300)は終了する。
当該組に対応する詳細条件リスト196が生成済みでない場合、処理はステップS303に進む。
具体的には、詳細解析部130は、対象関数の名称と対象関数に引数として渡される値との組に対応付けて、空の詳細条件リスト196を生成する。
具体的には、詳細解析部130は、対象関数の簡略条件リスト192の先頭から順に、実行文を1つずつ対象文として選択する。
そして、詳細解析部130は、対象文の簡略事前条件を作業事前条件PREVに設定し、対象文の簡略事後条件を作業事後条件AFTERに設定する。
作業事前条件PREVは、対象関数と当該呼出条件との組に対応する詳細条件リスト196に登録される対象文の詳細事前条件が設定される変数である。
作業事後条件AFTERは、対象関数と当該呼出条件との組に対応する詳細条件リスト196に登録される対象文の詳細事後条件が設定される変数である。
ステップS310において、詳細解析部130は、対象文の前に実行される実行文である直前文が対象関数に含まれる場合、直前文の詳細事後条件を、対象関数と当該呼出条件との組に対応する詳細条件リスト196から取得する。そして、詳細解析部130は、直前文の詳細事後条件を作業事前条件PREVに追加する。
直前評価処理(S310)の詳細については別途説明する。
ステップS320において、詳細解析部130は、特定の要素を含んだ条件が作業事前条件PREVまたは作業事後条件AFTERに含まれる場合、当該要素を、対象関数の呼出条件に含まれる値または直前文の詳細事後条件に含まれる値に置き換える。特定の要素とは、対象関数の呼出条件に含まれる値または直前文の詳細事後条件に含まれる値に置き換えられる要素である。
変数評価処理(S320)の詳細については別途説明する。
ステップS330において、詳細解析部130は、対象文が関数を呼び出すための実行文である場合、対象文によって呼び出される関数である呼び出し先関数について詳細条件リスト196を生成する。そして、詳細解析部130は、呼び出し先関数の詳細条件リスト196に基づいて呼び出し先関数が実行された後に成り立つ条件を特定し、特定した条件に作業事後条件AFTERに設定されている条件を置き換える。
再帰評価処理(S330)の詳細については別途説明する。
ステップS340において、詳細解析部130は、作業事前条件PREVに矛盾があるか判定する。作業事前条件PREVに矛盾があると判定した場合、詳細解析部130は、作業事前条件PREVに設定された条件と作業事後条件AFTERに設定された条件とを削除する。
矛盾評価処理(S340)の詳細については別途説明する。
さらに、詳細解析部130は、作業事後条件AFTERに設定されている条件を、対象文の詳細事後条件として、ステップS303で生成された詳細条件リスト196に登録する。
対象文として選択されていない実行文がある場合、処理はステップS304に戻る。
対象文として選択されていない実行文がない場合、再帰解析処理(S300)は終了する。
ステップS311において、詳細解析部130は、対象関数に対象文に対する直前文があるか判定する。
具体的には、詳細解析部130は、対象関数のソースコードに対して構文解析および文字解析を行うことにより、対象関数に対象文に対する直前文があるか判定する。
対象文の直前が条件分岐文のブロックである場合、複数の直前文が存在する。具体的には、対象文の直前がIF文のブロックである場合、TRUE経路の最終の実行文と、ELSE経路の最終の実行文とが、直前文になる。TRUE経路とは、IF文で指定された条件が成り立つ場合に実行される処理である。ELSE経路とは、IF文で指定された条件が成り立たない場合に実行される処理である。
対象関数に対象文に対する直前文がある場合、処理はステップS312に進む。
対象関数に対象文に対する直前文がない場合、処理はステップS316に進む。
直前条件PAFTERは、直前文の詳細事後条件が設定される変数である。
無条件φは、成り立つ特定の条件がないことを意味する。
そして、詳細解析部130は、取得された詳細事後条件を直前条件PAFTERに追加する。具体的には、詳細解析部130は、直前条件PAFTERに設定されている条件に、和集合を意味する記号と、取得された詳細事後条件とを付けたす。
取得された詳細事後条件が追加された後の直前条件PAFTERは、直前条件PAFTERに設定されていた条件と取得された詳細事後条件との和集合である。
未選択の直前文がある場合、処理はステップS313に戻る。
未選択の直前文がない場合、処理はステップS317に進む。
直前条件PAFTERが無条件φでない場合、処理はステップS318に進む。
直前条件PAFTERが無条件φである場合、処理はステップS319に進む。
直前条件PAFTERが追加された後の作業事前条件PREVは、作業事前条件PREVに設定されていた条件と直前条件PAFTERに設定されていた条件との積集合である。
ステップS321において、詳細解析部130は、特定の条件が対象文の作業事前条件PREVまたは作業事後条件AFTERに含まれるか判定する。
特定の条件とは、特定の要素を含んだ条件である。
特定の要素とは、対象関数の呼出条件に含まれる値または直前文の詳細事後条件に含まれる値に置き換えられる要素である。
詳細解析部130は、対象関数と当該呼出条件との組に対応する詳細条件リスト196から、直前文の詳細事後条件を取得する。
そして、詳細解析部130は、対象文の作業事前条件PREVまたは作業事後条件AFTERに含まれる条件毎に次のような処理を行う。
詳細解析部130は、条件を表す条件式の左辺に含まれる変数を取得し、取得した変数と同じ名称の変数が左辺に含まれる条件式を、対象関数の呼出条件および直前文の詳細事後条件から検索する。
当該条件式が対象関数の呼出条件または直前文の詳細事後条件に含まれる場合、詳細解析部130は、特定の条件が対象文の作業事前条件PREVまたは作業事後条件AFTERに含まれる、と判定する。
特定の要素を含んだ条件が作業事前条件PREVまたは作業事後条件AFTERに含まれない場合、変数評価処理(S320)は終了する。
特定の条件の右辺にある変数または不定値が特定の要素となる。不定値は変数が取り得る全ての値である。簡略条件リスト192または詳細条件リスト196の図に記されたundefinedは不定値を意味している。
対象関数の呼出条件または直前文の詳細事後条件に含まれる値のうちステップS321で検索された当該条件式の右辺にある値が、特定の要素を置き換える値となる。
図4において、invoke関数から呼び出されるfunc関数の引数xの値は0である。つまり、func関数の呼出条件の1つは「x=0」である。そのため、図6の(1)において特定の条件に相当する「x=undefined」は、図15において「x=0」に置き換えられる。「x=undefined」において、「x」が特定の条件の左辺に含まれる変数に相当し、「undefined」が特定の要素に相当する。
ステップS331において、詳細解析部130は、対象文が呼び出し文であるか判定する。呼び出し文は、関数を呼び出すための実行文である。
具体的には、詳細解析部130は、対象文を構文解析することにより、対象文の構文が呼び出し文の構文であるか判定する。対象文の構文が呼び出し文の構文である場合、詳細解析部130は、対象文が呼び出し文であると判定する。
対象文が呼び出し文である場合、処理はステップS332に進む。
対象文が呼び出し文でない場合、再帰評価処理(S330)は終了する。
この再帰解析処理(S300)により、呼び出し先関数と対象文における呼び出し先関数の引数との組に対応する詳細条件リスト196が生成される。
まず、詳細解析部130は、ステップS332で生成された詳細条件リスト196に含まれる最終の実行文がreturn文であるか判定する。当該最終の実行文がreturn文である場合、return文の詳細事後条件から、呼び出し先関数の戻り値を取得する。
次に、詳細解析部130は、ステップS332で生成された詳細条件リスト196から、呼び出し先関数の最終の実行文の詳細事後条件を取得する。
そして、詳細解析部130は、対象文の作業事後条件AFTERに設定されている条件を、呼び出し先関数の戻り値と呼び出し先関数の最終の実行文の詳細事後条件との積集合に置き換える。
図5の(1)において、対象文は「c=func(c)」であり、対象文の簡略事前条件は「c=0」である。この場合、呼び出し先関数はfunc関数であり、呼出条件は「c=0」である。この呼出条件でfunc関数が実行された場合、func関数のreturn文で得られる戻り値は「c=1」である。そのため、図17において、作業事後条件AFTERは、「c=1」を含んだ条件に置き換えられている。図17の作業事後条件AFTERにおいて、「c=1∩」の後ろに含まれる条件が、func関数の最終の実行文(return文)の詳細事後条件である。
ステップS341において、詳細解析部130は、対象文の作業事前条件PREVに矛盾があるか判定する。
具体的には、詳細解析部130は、同じ名称の変数が左辺の要素として含まれる条件式が作業事前条件PREVに複数あるか判定する。同じ名称の変数が左辺の要素として含まれる条件式が作業事前条件PREVに複数ある場合、詳細解析部130は、当該複数の条件式の演算子および右辺を比較する。そして、演算子および右辺が合致しない場合、詳細解析部130は、作業事前条件PREVに矛盾があると判定する。
対象文の作業事前条件PREVに矛盾がある場合、処理はS342に進む。
対象文の作業事前条件PREVに矛盾がない場合、矛盾評価処理(S340)は終了する。
図19において、作業事前条件PREVには、変数xが左辺の要素として含まれる条件式が2つある。一方の条件式は「x≠0」であり、他方の条件式は「x=0」であり、両方の条件式は論理積で結合されている。つまり、両方の条件式を結合して得られる条件式は「x=0∩x≠0」である。一方の条件式の演算子および右辺は「≠0」であり、他方の条件式の演算子および右辺は「=0」であるため、両者は合致しない。したがって、この作業事前条件PREVには矛盾がある、という判定がなされる。
ステップS342において、詳細解析部130は、対象文の作業事前条件PREVに設定されている条件と、対象文の作業事後条件AFTERに設定されている条件とのそれぞれを、無条件φに更新する。対象文の作業事前条件PREVが矛盾しているということは、対象関数が実行されても対象文には到達しないためである。
解析処理(S200)により、ソースコード101に含まれる関数と関数の呼出条件との組毎の詳細条件リスト196が生成される。
図4に示した変更前のソースコード101に対して解析処理(S200)を行うことによって得られる詳細条件ファイル195の構成を、図20に示す。
図20において、詳細条件ファイル195は、invoke関数と呼出条件(void)との組に対応する詳細条件リスト196を含んでいる。また、詳細条件ファイル195は、func関数と呼出条件(x=0)との組に対応する詳細条件リスト196を含んでいる。さらに、詳細条件ファイル195は、arraySize関数と呼出条件(x=0〜4)との組に対応する詳細条件リスト196を含んでいる。「0〜4」は、呼出条件となる引数の値域である。値域は、取り得る値の範囲である。
図21に、invoke関数と呼出条件(void)との組に対応する詳細条件リスト196を示す。
図22に、func関数と呼出条件(x=0)との組に対応する詳細条件リスト196を示す。
図23に、arraySize関数と呼出条件(x=0)との組に対応する詳細条件リスト196を示す。
図24に、arraySize関数と呼出条件(x=1)との組に対応する詳細条件リスト196を示す。
図25に、arraySize関数と呼出条件(x=2)との組に対応する詳細条件リスト196を示す。
図26に、arraySize関数と呼出条件(x=3)との組に対応する詳細条件リスト196を示す。
図27に、arraySize関数と呼出条件(x=4)との組に対応する詳細条件リスト196を示す。
詳細条件リスト196の第1列は、実行文を識別する番号を示している。
詳細条件リスト196の第2列は、実行文を示している。
詳細条件リスト196の第3列は、事前条件と事後条件とを区別している。
詳細条件リスト196の第4列は、事前条件または事後条件を示している。詳細条件リスト196における事前条件および事後条件は、詳細事前条件および詳細事後条件に相当する。
ステップS120は、変更後のソースコード101に対する解析処理(S200)である。
ステップS120において、ソースコード比較装置100は、変更後のソースコード101に対して、解析処理(S200)を行う。
ステップS130において、比較部140は、変更前の詳細条件リスト196と、変更後の詳細条件リスト196とに基づいて、変動リスト199を生成する。
変更前の詳細条件リスト196は、変更前のソースコード101に対して生成された詳細条件リスト196である。
変更後の詳細条件リスト196は、変更後のソースコード101に対して生成された詳細条件リスト196である。
変動リスト199は、変更前のソースコード101と変更後のソースコード101との間で詳細事前条件と詳細事後条件との少なくともいずれかが異なる実行文を特定する情報を含んだリストである。
ステップS131において、比較部140は、変更前のソースコード101および変更後のソースコード101から、未選択の関数を1つ選択する。
さらに、比較部140は、選択した関数の変更後の詳細条件リスト196を結合して、選択した関数の変更後の結合条件リスト198を生成する。
結合条件リスト198は、ソースコード101に含まれる関数毎に、関数に含まれる実行文と、実行文が実行される前に成り立つ結合事前条件と、実行文が実行された後に成り立つ結合事後条件と、が互いに対応付けられたリストである。
図29の結合条件ファイル197は、invoke関数とfunc関数とarraySize関数とのそれぞれの結合条件リスト198を含んでいる。func関数の結合条件リスト198の全体は、図30に示している。invoke関数の結合条件リスト198の中身は、invoke関数と呼出条件(void)との組に対応する詳細条件リスト196の中身と同じである。func関数の結合条件リスト198の中身は、func関数と呼出条件(x=0)との組に対応する詳細条件リスト196の中身と同じである。
結合条件リスト198の第1列は、実行文を識別する番号を示している。
結合条件リスト198の第2列は、実行文を示している。
結合条件リスト198の第3列は、事前条件と事後条件とを区別している。
結合条件リスト198の第4列は、事前条件または事後条件を示している。結合条件リスト198における事前条件および事後条件は、結合事前条件および結合事後条件に相当する。
図31のソースコード101を基にして得られる結合条件ファイル197を、図32に示す。
図32の結合条件ファイル197は、invoke関数とfunc関数とarraySize関数とのそれぞれの結合条件リスト198を含んでいる。func関数の結合条件リスト198の全体は、図33に示している。
ステップS133において、比較部140は、変更前の結合条件リスト198または変更後の結合条件リスト198から、未選択の実行文を1つ選択する。
そして、比較部140は、比較部140は、変更前の結合条件リスト198から取得した結合事前条件と、変更後の結合条件リスト198から取得した結合事前条件とを比較する。さらに、比較部140は、変更前の結合条件リスト198から取得した結合事後条件と、変更後の結合条件リスト198から取得した結合事後条件とを比較する。
比較した結合事前条件と比較した結合事後条件との少なくともいずれかが不一致である場合、処理はステップS136に進む。
比較した結合事前条件と比較した結合事後条件とのいずれも不一致でない場合、処理はステップS137に進む。
図34において、変動リスト199は、ファイル名の欄と、行番号の欄と、変更前の事前条件の欄と、変更後の事前条件の欄と、変更前の事後条件の欄と、変更後の事後条件の欄とを備えている。
ファイル名の欄は、当該実行文を含んだ関数のソースコードが記載されたファイルの名称を示す。
行番号の欄は、当該関数の変更後のソースコードにおいて当該実行文が記載されている行の番号を示す。
変更前の事前条件の欄は、当該実行文の変更前の結合事前条件を示す。
変更後の事前条件の欄は、当該実行文の変更後の結合事前条件を示す。
変更前の事後条件の欄は、当該実行文の変更前の結合事後条件を示す。
変更後の事後条件の欄は、当該実行文の変更後の結合事後条件を示す。
ステップS137において、比較部140は、未選択の実行文があるか判定する。
未選択の実行文がある場合、処理はステップS133に戻る。
未選択の実行文がない場合、処理はステップS138に進む。
未選択の関数がある場合、処理はステップS131に戻る。
未選択の関数がない場合、比較処理(S130)は終了する。
ソフトウェアが変更される場合に変更の影響が及ぶ箇所を、関数単位ではなく実行文単位および行単位で、目視ではなく自動で特定することができる。
除外の対象となる変数を含んだ条件を詳細事前条件および詳細事後条件から除外する形態について、図35から図39に基づいて説明する。但し、実施の形態1と重複する説明は省略または簡略する。
図35に基づいて、ソースコード比較装置100の構成について説明する。
ソースコード比較装置100の構成は、実施の形態1と同じである。
但し、メモリ902には、除外リスト103が記憶される。
除外リスト103は、除外の対象となる変数のリストである。
ソースコード比較方法の処理の流れは、実施の形態1と同じである。
但し、再帰解析処理(S300)の一部が、実施の形態1と異なる。
再帰解析処理(S300)は、ステップS308を含んでいる。他のステップは、実施の形態1と同じである。
詳細解析部130は、除外変数を含んだ詳細事前条件および除外変数を含んだ詳細事後条件を、詳細条件リスト196から検索する。詳細事前条件と詳細事後条件とを総称して、詳細条件という。詳細条件は、1つ以上の条件式で構成される。複数の条件式は、論理和を意味する結合記号(∪)または論理積を意味する結合記号(∩)を用いて結合される。
除外変数を含んだ詳細条件が見つかった場合、詳細解析部130は、当該詳細条件に含まれる条件式を結合記号を区切りにして分離することによって、除外変数を含んだ条件式を特定する。
そして、詳細解析部130は、特定した条件式と特定した条件式の前に付されている記号とを、除外変数を含んだ詳細条件から削除する。
図37の除外リスト103において、除外変数は「array」である。
図22の詳細条件リスト196から除外変数を含んだ条件を除外して得られる詳細条件リスト196を、図39に示す。
図21および図38はinvoke関数の詳細条件リスト196であり、図22および図39はfunc関数の詳細条件リスト196である。
invoke関数から呼び出されるfunc関数の詳細条件リスト196から除外変数を含んだ条件が除外されることに伴って、func関数の呼び出し元であるinvoke関数の詳細条件リスト196から除外変数を含んだ条件が除外される。
詳細条件リスト196に含まれる事前条件および事後条件を簡潔にすることができる。これに伴い、変動リスト199に含まれる事前条件および事後条件が簡潔になる。その結果、変更の影響が及ぶ箇所を特定する精度が向上する。
一方、実施の形態2では、特定のグローバル変数が事前条件および事後条件から除外されるため、変動リスト199において、事前条件の論理式記述および事後条件の論理式記述が削減される。これにより、特定される変更影響範囲の精度を高めることができる。
追加の対象となる標準関数についての引数の条件を詳細事後条件に追加する形態について、図40から図45に基づいて説明する。但し、実施の形態1と重複する説明は省略または簡略する。
図40に基づいて、ソースコード比較装置100の構成について説明する。
ソースコード比較装置100の構成は、実施の形態1と同じである。
但し、メモリ902には、追加リスト104が記憶される。
追加リスト104は、追加の対象となる標準関数のリストである。
標準関数は、ソースコード101に含まれる関数とは別の関数であって、標準で用意されている関数である。具体的な標準関数は、動的にメモリを確保するためのmalloc関数である。
ソースコード比較方法の処理の流れは、実施の形態1と同じである。
但し、再帰解析処理(S300)の一部が、実施の形態1と異なる。
再帰解析処理(S300)は、ステップS350を含んでいる。他のステップは、実施の形態1と同じである。
ステップS350において、詳細解析部130は、対象文が、追加の対象となる標準関数を呼び出すための実行文である場合、標準関数の引数について成り立つ条件を、対象文の作業事後条件AFTERに追加する。
ステップS351において、詳細解析部130は、対象文が追加関数文であるか判定する。追加関数文は、追加の対象となる標準関数である追加関数を呼び出すための実行文である。
具体的には、詳細解析部130は、追加リスト104に示される標準関数の名称が対象文に含まれるか判定する。追加リスト104に示される標準関数の名称が対象文に含まれる場合、詳細解析部130は、対象文が追加関数文である、と判定する。
対象文が追加関数文である場合、処理はステップS352に進む。
対象文が追加関数文でない場合、追加評価処理(S350)は終了する。
そして、詳細解析部130は、特定した条件を、対象文の作業事後条件AFTERに追加する。
詳細解析部130は、対象文から追加関数の引数を取得する。
追加関数の引数が変数である場合、詳細解析部130は、その変数を左辺の要素として含んだ条件式が、対象文の作業事前条件PREVに含まれるか判定する。
当該条件式が対象文の作業事前条件PREVに含まれる場合、詳細解析部130は、追加関数の引数である変数を当該条件式の右辺の値に置き換える。
次に、詳細解析部130は、追加関数の引数である変数または値が指定された追加条件を生成する。
次に、詳細解析部130は、対象文の作業事後条件AFTERに設定されている条件と追加条件との積集合を生成する。
そして、詳細解析部130は、対象文の作業事後条件AFTERに設定されている条件を、生成した積集合に置き換える。
図43の追加リスト104において、追加関数は「malloc」である。
図22の詳細条件リスト196に追加関数の引数についての条件を追加して得られる詳細条件リスト196を、図45に示す。図45の詳細条件リスト196において、下線の部分が追加された条件を示す部分である。
図21および図44はinvoke関数の詳細条件リスト196であり、図22および図45はfunc関数の詳細条件リスト196である。
invoke関数から呼び出されるfunc関数の詳細条件リスト196に追加関数の引数についての条件が追加されることに伴って、func関数の呼び出し元であるinvoke関数の詳細条件リスト196に追加関数の引数についての条件が追加される。
詳細条件リスト196に含まれる事前条件および事後条件を拡張することができる。これに伴い、変動リスト199に含まれる事前条件および事後条件が拡張される。その結果、変更の影響が及ぶ箇所を特定する精度が向上する。
一方、実施の形態3では、特定の関数の引数が事前条件および事後条件に追加されるため、変動リスト199において、事前条件の論理式記述および事後条件の論理式記述が拡張される。これにより、特定される変更影響範囲の精度を高めることができる。
各実施の形態において、ソースコード比較装置100の機能はハードウェアで実現してもよい。
図46に、ソースコード比較装置100の機能がハードウェアで実現される場合の構成を示す。
ソースコード比較装置100は処理回路990を備える。処理回路990はプロセッシングサーキットリともいう。
処理回路990は、各実施の形態で説明した「部」の機能を実現する専用の電子回路である。この「部」には記憶部も含まれる。
具体的には、処理回路990は、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックIC、GA、ASIC、FPGAまたはこれらの組み合わせである。GAはGate Arrayの略称であり、ASICはApplication Specific Integrated Circuitの略称であり、FPGAはField Programmable Gate Arrayの略称である。
なお、ソースコード比較装置100が複数の処理回路990を備えて、複数の処理回路990が「部」の機能を連携して実現してもよい。
フローチャート等を用いて説明した手順は、各実施の形態における方法およびプログラムの手順の一例である。
Claims (10)
- 変更前のソースコードと変更後のソースコードとに対して、ソースコードに含まれる関数と関数が呼び出されたときに成り立つ呼出条件との組毎に、関数に含まれる実行文と、呼出条件の下で実行文が実行される前に成り立つ詳細事前条件と、呼出条件の下で実行文が実行された後に成り立つ詳細事後条件と、が互いに対応付けられた詳細条件リストを生成する詳細解析部と、
変更前のソースコードに対して生成された詳細条件リストである変更前の詳細条件リストと、変更後のソースコードに対して生成された詳細条件リストである変更後の詳細条件リストとに基づいて、変更前のソースコードと変更後のソースコードとの間で詳細事前条件と詳細事後条件との少なくともいずれかが異なる実行文を特定する情報を含んだ変動リストを生成する比較部と
を備えるソースコード比較装置。 - 前記ソースコード比較装置は、
変更前のソースコードと変更後のソースコードとに対して、ソースコードに含まれる関数毎に、関数に含まれる実行文と、実行文が実行される前に成り立つ簡略事前条件と、実行文が実行された後に成り立つ簡略事後条件と、が互いに対応付けられた簡略条件リストを生成する簡略解析部を備え、
前記詳細解析部は、
変更前のソースコードと、変更前のソースコードに対して生成された簡略条件リストである変更前の簡略条件リストとに基づいて、変更前の詳細条件リストを生成し、
変更後のソースコードと、変更後のソースコードに対して生成された簡略条件リストである変更後の簡略条件リストとに基づいて、変更後の詳細条件リストを生成する
請求項1に記載のソースコード比較装置。 - 前記詳細解析部は、
詳細条件リストが生成される対象となる関数である対象関数が呼び出されるときに成り立つ呼出条件を特定し、
対象関数の簡略条件リストから、実行文を、実行される順に対象文として選択し、
対象関数の簡略条件リストから、対象文の簡略事前条件と対象文の簡略事後条件とを、対象関数と当該呼出条件との組に対応する詳細条件リストに登録される対象文の詳細事前条件と対象文の詳細事後条件として取得し、
対象文の前に実行される実行文である直前文が対象関数に含まれる場合、直前文の詳細事後条件を対象関数と当該呼出条件との組に対応する詳細条件リストから取得して、直前文の詳細事後条件を対象文の詳細事前条件に追加する
請求項2に記載のソースコード比較装置。 - 前記詳細解析部は、
対象関数の呼出条件に含まれる値または直前文の詳細事後条件に含まれる値に置き換えられる要素を含んだ条件が対象文の詳細事前条件または対象文の詳細事後条件に含まれる場合、当該要素を対象関数の呼出条件に含まれる値または直前文の詳細事後条件に含まれる値に置き換える
請求項3に記載のソースコード比較装置。 - 前記詳細解析部は、
対象文が関数を呼び出すための実行文である場合、対象文によって呼び出される関数である呼び出し先関数について詳細条件リストを生成し、呼び出し先関数の詳細条件リストに基づいて呼び出し先関数が実行された後に成り立つ条件を特定し、特定した条件に対象文の詳細事後条件を置き換える
請求項3に記載のソースコード比較装置。 - 前記詳細解析部は、
対象文が、追加の対象となる標準関数を呼び出すための実行文である場合、前記標準関数の引数について成り立つ条件を、対象文の詳細事後条件に追加する
請求項3に記載のソースコード比較装置。 - 前記詳細解析部は、
対象文の詳細事前条件に矛盾があるか判定し、対象文の詳細事前条件に矛盾があると判定した場合、対象文の詳細事前条件として求められた条件と対象文の詳細事後条件として求められた条件とを削除する
請求項3に記載のソースコード比較装置。 - 前記ソースコード比較装置は、
少なくともいずれかの関数を呼び出すがいずれの関数からも呼び出されない関数であるエントリ関数を特定するエントリ解析部を備え、
前記詳細解析部は、
前記エントリ関数を最初の対象関数にして、前記エントリ関数の詳細条件リストと、前記エントリ関数の実行に伴って呼び出される関数の詳細条件リストとを生成する
請求項3に記載のソースコード比較装置。 - 前記詳細解析部は、除外の対象となる変数を含んだ条件を、詳細事前条件および詳細事後条件から除外する
請求項1に記載のソースコード比較装置。 - 変更前のソースコードと変更後のソースコードとに対して、ソースコードに含まれる関数と関数が呼び出されたときに成り立つ呼出条件との組毎に、関数に含まれる実行文と、呼出条件の下で実行文が実行される前に成り立つ詳細事前条件と、呼出条件の下で実行文が実行された後に成り立つ詳細事後条件と、が互いに対応付けられた詳細条件リストを生成する詳細解析処理と、
変更前のソースコードに対して生成された詳細条件リストである変更前の詳細条件リストと、変更後のソースコードに対して生成された詳細条件リストである変更後の詳細条件リストとに基づいて、変更前のソースコードと変更後のソースコードとの間で詳細事前条件と詳細事後条件との少なくともいずれかが異なる実行文を特定する情報を含んだ変動リストを生成する比較処理と
をコンピュータに実行させるためのソースコード比較プログラム。
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| PCT/JP2015/086586 WO2017115449A1 (ja) | 2015-12-30 | 2015-12-30 | ソースコード比較装置およびソースコード比較プログラム |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| JPWO2017115449A1 JPWO2017115449A1 (ja) | 2018-03-15 |
| JP6419357B2 true JP6419357B2 (ja) | 2018-11-07 |
Family
ID=59224895
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP2017558840A Active JP6419357B2 (ja) | 2015-12-30 | 2015-12-30 | ソースコード比較装置およびソースコード比較プログラム |
Country Status (4)
| Country | Link |
|---|---|
| US (1) | US20190026107A1 (ja) |
| JP (1) | JP6419357B2 (ja) |
| GB (1) | GB2561742A (ja) |
| WO (1) | WO2017115449A1 (ja) |
Families Citing this family (1)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US12386615B2 (en) * | 2022-12-20 | 2025-08-12 | Red Hat, Inc. | Executing a continuous integration pipeline based on a type of change to source code |
Family Cites Families (9)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| EP0686916A1 (en) * | 1994-06-07 | 1995-12-13 | Digital Equipment Corporation | Method and apparatus for testing software |
| US7275239B2 (en) * | 2003-02-10 | 2007-09-25 | International Business Machines Corporation | Run-time wait tracing using byte code insertion |
| US7526755B2 (en) * | 2003-10-08 | 2009-04-28 | Microsoft Corporation | Plug-in pre- and postconditions for static program analysis |
| JP2008191963A (ja) * | 2007-02-06 | 2008-08-21 | Nec Corp | ソースコード検証システム、ソースコード検証方法、およびソースコード検証用プログラム |
| JP5072889B2 (ja) * | 2009-03-16 | 2012-11-14 | 株式会社東芝 | 事前条件生成装置および事後条件生成装置、ならびにこれらの方法 |
| US20160062876A1 (en) * | 2014-09-03 | 2016-03-03 | Ajit Kumar Narayanan | Automated software change monitoring and regression analysis |
| US9335979B1 (en) * | 2014-09-15 | 2016-05-10 | The Mathworks, Inc. | Data type visualization |
| US9378115B2 (en) * | 2014-09-18 | 2016-06-28 | Sap Se | Base line for code analysis |
| US9703552B2 (en) * | 2014-12-18 | 2017-07-11 | International Business Machines Corporation | Assertions based on recently changed code |
-
2015
- 2015-12-30 GB GB1808455.8A patent/GB2561742A/en not_active Withdrawn
- 2015-12-30 WO PCT/JP2015/086586 patent/WO2017115449A1/ja not_active Ceased
- 2015-12-30 JP JP2017558840A patent/JP6419357B2/ja active Active
- 2015-12-30 US US16/066,019 patent/US20190026107A1/en not_active Abandoned
Also Published As
| Publication number | Publication date |
|---|---|
| GB201808455D0 (en) | 2018-07-11 |
| US20190026107A1 (en) | 2019-01-24 |
| JPWO2017115449A1 (ja) | 2018-03-15 |
| GB2561742A (en) | 2018-10-24 |
| WO2017115449A1 (ja) | 2017-07-06 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US9389849B2 (en) | Test case pattern matching | |
| US11740876B2 (en) | Method and system for arbitrary-granularity execution clone detection | |
| US12229040B2 (en) | Generative artificial intelligence driven software fixing | |
| US10423522B2 (en) | System and method for detecting an error in software | |
| US20210049091A1 (en) | Software visualization apparatus, software visualization method, and computer readable medium | |
| US9483384B2 (en) | Generation of software test code | |
| JP2008191963A (ja) | ソースコード検証システム、ソースコード検証方法、およびソースコード検証用プログラム | |
| US10628140B2 (en) | Program code generation apparatus | |
| JP2019029015A (ja) | インタラクティブなソフトウェアプログラムの修復 | |
| US20160246709A1 (en) | Source code unit testing using an indexing tool | |
| US20220237057A1 (en) | Code consolidation system | |
| JP6419357B2 (ja) | ソースコード比較装置およびソースコード比較プログラム | |
| US11656869B2 (en) | Using big code to construct code conditional truth tables | |
| US10474443B2 (en) | Code lineage tool | |
| US9489284B2 (en) | Debugging method and computer program product | |
| US20150220425A1 (en) | Test context generation | |
| US20190377667A1 (en) | Test case selection apparatus and computer readable medium | |
| WO2019142266A1 (ja) | テストケース生成装置、テストケース生成方法およびテストケース生成プログラム | |
| US12386615B2 (en) | Executing a continuous integration pipeline based on a type of change to source code | |
| US12399805B2 (en) | Method and system for providing delta code coverage information for work items | |
| US11740895B2 (en) | Generation of software program repair explanations | |
| CN120447958B (zh) | 一种基于低代码平台的逻辑检查方法、装置及计算机设备 | |
| JP7469999B2 (ja) | 検索装置、検索方法、および検索プログラム | |
| US10481880B2 (en) | Code lineage tool | |
| JP2018049492A (ja) | 解析装置、解析プログラムおよび解析方法 |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20171127 |
|
| TRDD | Decision of grant or rejection written | ||
| A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20180911 |
|
| A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20181009 |
|
| R150 | Certificate of patent or registration of utility model |
Ref document number: 6419357 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
| R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
| R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
| R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
| R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
| R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |