JP6739667B2 - ソースコード分割装置、ソースコード解析装置、ソースコード分割方法及びソースコード分割プログラム - Google Patents
ソースコード分割装置、ソースコード解析装置、ソースコード分割方法及びソースコード分割プログラム Download PDFInfo
- Publication number
- JP6739667B2 JP6739667B2 JP2019556148A JP2019556148A JP6739667B2 JP 6739667 B2 JP6739667 B2 JP 6739667B2 JP 2019556148 A JP2019556148 A JP 2019556148A JP 2019556148 A JP2019556148 A JP 2019556148A JP 6739667 B2 JP6739667 B2 JP 6739667B2
- Authority
- JP
- Japan
- Prior art keywords
- analysis
- source code
- functions
- influence
- divided
- 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
- 238000000034 method Methods 0.000 title claims description 76
- 238000004458 analytical method Methods 0.000 claims description 254
- 230000006870 function Effects 0.000 claims description 182
- 238000004148 unit process Methods 0.000 claims 1
- 238000012986 modification Methods 0.000 description 19
- 230000004048 modification Effects 0.000 description 19
- 238000010586 diagram Methods 0.000 description 16
- 238000004891 communication Methods 0.000 description 14
- 230000000694 effects Effects 0.000 description 8
- 239000000470 constituent Substances 0.000 description 5
- 239000000284 extract Substances 0.000 description 5
- 230000001419 dependent effect Effects 0.000 description 4
- 230000010354 integration Effects 0.000 description 4
- 239000000203 mixture Substances 0.000 description 4
- 230000007423 decrease Effects 0.000 description 3
- 230000011218 segmentation Effects 0.000 description 3
- 239000002131 composite material Substances 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000007781 pre-processing Methods 0.000 description 2
- 238000003672 processing method Methods 0.000 description 2
- 230000001174 ascending effect Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR 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)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Computer Security & Cryptography (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Description
しかし、全てのソースコードを一度に解析すると、解析対象のソフトウェア規模が大きすぎるために解析できない、又は、解析が長時間に及ぶ場合がある。この場合には、解析対象の巨大なソースコードが解析可能なソフトウェア部品に分割され、ソフトウェア部品毎に解析が行われる。
この発明では、ソースコードを分割することによる解析精度が低下する程度を小さくできるようにすることを目的とする。
ソースコードに含まれる2つの関数それぞれを対象として、対象の2つの関数の間で引き渡される情報量により、前記対象の2つの関数を別々の分割コードに分割した場合における前記ソースコードの解析に対する影響度を、前記対象の2つの関数の間の解析影響度として特定する影響特定部と、
前記影響特定部によって特定された前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割する分割部と
を備える。
***構成の説明***
図1を参照して、実施の形態1に係るソースコード分割装置10の構成を説明する。
ソースコード分割装置10は、コンピュータである。
ソースコード分割装置10は、プロセッサ11と、メモリ12と、ストレージ13と、通信インタフェース14とのハードウェアを備える。プロセッサ11は、信号線を介して他のハードウェアと接続され、これら他のハードウェアを制御する。
ストレージ13には、ソースコード分割装置10の各機能構成要素の機能を実現するプログラムが格納されている。このプログラムは、プロセッサ11によりメモリ12に読み込まれ、プロセッサ11によって実行される。これにより、ソースコード分割装置10の各機能構成要素の機能が実現される。
図2から図8を参照して、実施の形態1に係るソースコード分割装置10の動作を説明する。
実施の形態1に係るソースコード分割装置10の動作は、実施の形態1に係るソースコード分割方法に相当する。また、実施の形態1に係るソースコード分割装置10の動作は、実施の形態1に係るソースコード分割プログラムの処理に相当する。
(図2のステップS11:依存特定処理)
依存特定部21は、ソースコード30に含まれる複数の関数31について、関数31間の引数の引き渡しに基づき、関数31間の依存関係を特定する。
ステップS21で、依存特定部21は、通信インタフェース14を介して分析対象のソースコード30の入力を受け付ける。
ステップS22で、依存特定部21は、宣言型ビット数表41をストレージ13から読み出す。宣言型ビット数表41は、変数の型と、その型で使用されるビット数とが対応付けられたデータである。宣言型ビット数表41は、事前にストレージ13に格納されているものとする。
例えば、対象の引数が引数aの場合には、mainが依存元欄に書き込まれ、FuncAが依存先欄に書き込まれ、boolが引数型欄に書き込まれ、1が引数型ビット数欄に書き込まれる。
影響特定部22は、ソースコード30に含まれる依存関係のある2つの関数31それぞれを対象として、対象の2つの関数31の間で引き渡される情報量により、対象の2つの関数31の間の解析影響度を特定する。解析影響度は、対象の2つの関数31を別々の分割コード32に分割した場合におけるソースコード30の解析精度に対する影響度である。
ステップS31で、影響特定部22は、ステップS11で生成された引数情報表42をストレージ13から読み出す。
一方、ステップS36で、影響特定部22は、ステップS33で読み出されたレコードにおける依存元と依存先との組についての、引数影響表43のレコードを特定する。影響特定部22は、特定された引数影響表43のレコードにおける解析影響度に、ステップS33で読み出されたレコードにおけるビット数を加算する。
その結果、例えば、依存元がmainであり、依存先がFuncAである引数影響表43のレコードの解析影響度は、引数情報表42に引数aのレコードのビット数“1”と引数bのレコードのビット数“8”とを合計した9になる。引数は、関数間で引き渡される情報であり、引数のビット数は関数間で引き渡される情報量である。そこで、引き渡される引数のビット数の合計が解析影響度とされている。解析影響度が大きいほど、解析精度に与える影響が大きくなる。
分割部23は、ステップS12で特定された解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。
ステップS41で、分割部23は、ステップS12で生成された引数影響表43をストレージ13から読み出す。引数影響表43を参照して、各関数31をノードとし、依存元のノードから依存先のノードへ矢印を引き、各矢印のコストとして解析影響度を割り当てることにより、グラフ44を描くことが可能である。
なお、分割部23は、ソースコード30をいくつの分割コード32に分割するかを示す分割数は、通信インタフェース14を介して指定される、あるいは、事前に設定されているものとする。分割数が3以上の場合には、最小カット定理を用いた分割を繰り返し行えばよい。
以上のように、実施の形態1に係るソースコード分割装置10は、関数31の間で引き渡される情報量により関数31の間の解析影響度を特定し、特定された解析影響度に基づきソースコード30を複数の分割コード32に分割する。これにより、ソースコード30を分割することによる解析精度が低下する程度を小さくすることが可能である。
z = x;の行のみが解析対象となる。しかし、FuncAとFuncBと間の依存関係が欠落すると、FuncAからFuncBに引数値10が渡されないため、FuncB関数内でxが不確定値となる。この場合にランタイムエラーを解析するためには、引数xの取り得る値の幅(−32768〜32767)分だけパラメータを変更しながら解析を行うことになる。このときに、本来解析対象外であるはずのif else(x==20) z = 0;の行も実行されるために解析対象となり、zに0が代入されることとなる。
このように、ソースコード30を複数の分割コード32に分割する場合に、解析精度が低下する可能性がある。しかし、実施の形態1に係るソースコード分割装置10は、適切な分割を行うことが可能であるため、ソースコード30を分割することによる解析精度が低下する程度を小さくすることが可能である。
<変形例1>
実施の形態1では、2つの関数31の間で引き渡される引数のビット数を、2つの関数の間で引き渡される情報量とした。しかし、依存先の関数31から依存元の関数31へ引き渡される戻り値についても、2つの関数の間で引き渡される情報量としてもよい。つまり、2つの関数の間で引き渡される情報量は、2つの関数の間の引数と戻り値との少なくともいずれかのビット数とすればよい。
実施の形態1では、各機能構成要素がソフトウェアで実現された。しかし、変形例2として、各機能構成要素はハードウェアで実現されてもよい。この変形例2について、実施の形態1と異なる点を説明する。
各機能構成要素がハードウェアで実現される場合には、ソースコード分割装置10は、プロセッサ11とメモリ12とストレージ13とに代えて、電子回路15を備える。電子回路15は、各機能構成要素と、メモリ12と、ストレージ13との機能とを実現する専用の回路である。
各機能構成要素を1つの電子回路15で実現してもよいし、各機能構成要素を複数の電子回路15に分散させて実現してもよい。
変形例3として、一部の各機能構成要素がハードウェアで実現され、他の各機能構成要素がソフトウェアで実現されてもよい。
実施の形態2は、グローバル変数を考慮して解析影響度を特定する点が実施の形態1と異なる。実施の形態2では、この異なる点を説明し、同一の点については説明を省略する。
図11を参照して、実施の形態2に係るソースコード分割装置10の構成を説明する。
ソースコード分割装置10は、依存特定部21に代えて、グローバル変数特定部24を備える点が図1に示すソースコード分割装置10と異なる。
図12から図16を参照して、実施の形態2に係るソースコード分割装置10の動作を説明する。
(図12のステップS51:グローバル変数特定処理)
グローバル変数特定部24は、ソースコード30に含まれる複数のグローバル変数について、参照する関数31を特定する。
ステップS61で、グローバル変数特定部24は、通信インタフェース14を介して分析対象のソースコード30の入力を受け付ける。ステップS22で、依存特定部21は、宣言型ビット数表41をストレージ13から読み出す。
影響特定部22は、対象の2つの関数31が共通して参照するグローバル変数の情報量により、対象の2つの関数31の間の解析影響度を特定する。
ステップS71で、影響特定部22は、ステップS51で生成されたグローバル変数表46をストレージ13から読み出す。
ステップS75で、影響特定部22は、対象の組がグローバル変数影響表47に存在するか否かを判定する。影響特定部22は、依存元と依存先との組がグローバル変数影響表47に存在しない場合には、処理をステップS76に進める。一方、影響特定部22は、依存元と依存先との組がグローバル変数影響表47に存在する場合には、処理をステップS77に進める。
一方、ステップS77で、影響特定部22は、対象の組についての、グローバル変数影響表47のレコードを特定する。影響特定部22は、特定されたグローバル変数影響表47のレコードにおける解析影響度に、ステップS73で読み出されたレコードにおける型ビット数を加算する。
FuncAとFuncBとでは、int型のグローバル変数であるglobalAを共通して参照している。そのため、FuncAとFuncBとでは、globalAを介して情報が引き渡されていることになる。したがって、FuncAとFuncBとの組の解析影響度は、int型のビット数である16になる。つまり、FuncAとFuncBとが別々の分割コード32に分割された場合には、16ビット分の情報量が失われ、その分解析精度が低下する。
分割部23は、ステップS52で特定された解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。つまり、分割部23は、グローバル変数影響表47における解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。分割の方法は、図2のステップS13の処理と同じである。
以上のように、実施の形態2に係るソースコード分割装置10は、2つの関数31が共通して参照するグローバル変数の情報量により、2つの関数31の間で引き渡される情報量を特定した。そして、特定された情報量にから解析影響度を特定し、特定された解析影響度に基づきソースコード30を複数の分割コード32に分割する。これにより、ソースコード30を分割することによる解析精度が低下する程度を小さくすることが可能である。
<変形例4>
実施の形態2では、2つの関数31が共通して参照するグローバル変数の情報量により、対象の2つの関数31の間の解析影響度を特定した。変形例4として、2つの関数31が共通して参照するグローバル変数の情報量だけでなく、実施の形態1で説明した、対象の2つの関数31の間で引き渡される情報量も考慮して、解析影響度を特定してもよい。これにより、より適切に解析影響度を特定することができる。その結果、より適切にソースコード30を分割することができる。
ソースコード分割装置10は、図1に示す依存特定部21と、図11に示すグローバル変数特定部24との両方を備える。
ステップS81からステップS82の処理は、図2のステップS11からステップS12の処理と同じである。また、ステップS83からステップS84の処理は、図12のステップS51からステップS52の処理と同じである。
影響特定部22は、ステップS82で特定された解析影響度と、ステップS84で特定された解析影響度とを統合する。
ステップS91では、影響特定部22は、ステップS82の処理で生成された引数影響表43と、ステップS84の処理で生成されたグローバル変数影響表47とを、ストレージ13から読み出す。
ステップS92では、影響特定部22は、引数影響表43における全てのレコードを統合影響表48に追加する。
一方、ステップS97で、影響特定部22は、ステップS94で読み出されたレコードにおける参照関数の組についての、統合影響表48のレコードを特定する。影響特定部22は、特定された統合影響表48のレコードにおける解析影響度に、ステップS94で読み出されたレコードにおける解析影響度を加算する。
分割部23は、ステップS85で特定された解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。つまり、分割部23は、統合影響表48における解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。分割の方法は、図2のステップS13の処理と同じである。
実施の形態3は、階層的な依存関係を考慮して解析影響度を特定する点が実施の形態1,2と異なる。実施の形態3では、この異なる点を説明し、同一の点については説明を省略する。
実施の形態3では、実施の形態1に機能を追加した場合を説明する。しかし、実施の形態2又は変形例4に機能を追加することも可能である。
この場合、FuncAとFuncBとが別々の分割コード32に分割されると、FuncBだけでなく、FuncCにも影響が及ぶ可能性がある。そこで、影響特定部22は、階層的な依存関係を考慮して、2つの関数の間の解析影響度を特定する。
図22及び図23を参照して、実施の形態3に係るソースコード分割装置10の動作を説明する。
ステップS101からステップS102の処理は、図2のステップS11からステップS12の処理と同じである。
影響特定部22は、対象の2つの関数31のうち呼び出される関数31と、他の関数31との間の解析影響度に基づき、対象の2つの関数31の間の解析影響度を特定する。
具体的には、影響特定部22は、階層の下位の関数31の間から順に、下位の関数31の解析影響度を合計した階層影響度を特定する。図21の例であれば、影響特定部22は、初めにFuncBとFuncDとの間と、FuncBとFuncFとの間と、FuncCとFuncGとの間とについて階層影響度を特定する。影響特定部22は、次に、FuncAとFuncBとの間と、FuncAとFuncCとの間とについて階層影響度を特定する。
すると、図23に示すように各関数31の間の階層影響度が特定される。つまり、FuncBとFuncDとの間と、FuncBとFuncFとの間と、FuncCとFuncGとの間とについては、下位の関数31がないので、階層影響度は0になる。FuncAとFuncBとの間については、FuncBとFuncDとの間と、FuncBとFuncFとの間との解析影響度及び階層影響度の合計である16が階層影響度になる。FuncAとFuncCとの間は、FuncCとFuncGとの間の解析影響度及び階層影響度の合計である1が階層影響度になる。
そして、影響特定部22は、各関数31の間について、解析影響度と階層影響度とを合計して、新たな解析影響度とする。
なお、階層影響度に1未満の係数を乗じた上で、解析影響度と階層影響度とを合計して新たな解析影響度してもよい。
分割部23は、ステップS103で特定された新たな解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。分割の方法は、図2のステップS13の処理と同じである。
以上のように、実施の形態3に係るソースコード分割装置10は、階層的な依存関係を考慮して解析影響度を特定する。これにより、より適切に解析影響度を特定することができる。その結果、より適切にソースコード30を分割することができる。
実施の形態4は、引数の引き渡し先の関数31の処理における引数の利用状況を考慮して解析影響度を特定する点が実施の形態1と異なる。実施の形態4では、この異なる点を説明し、同一の点は説明を省略する。
図24及び図25を参照して、実施の形態4に係るソースコード分割装置10の動作を説明する。
ステップ111からステップS112の処理は、図2のステップS11からステップS12の処理と同じである。
影響特定部22は、対象の2つの関数31の間で引き渡された情報の参照回数と、対象の2つの関数31の間で引き渡された情報を用いた処理内容との少なくともいずれかに基づき、対象の2つの関数31の間の解析影響度として特定する。
具体的には、参照回数を考慮して解析影響度を特定する場合には、影響特定部22は、引数の引き渡し先の関数31における引数の参照回数を特定する。そして、影響特定部22は、ステップS112で特定された解析影響度に参照回数を乗じて、新たな解析影響度とする。
また、処理内容を考慮して解析影響度を特定する場合には、影響特定部22は、引数の引き渡し先の関数31における引数を用いた処理内容を特定する。そして、影響特定部22は、ステップS112で特定された解析影響度に、処理内容毎に事前に定められた係数を乗じて、新たな解析影響度とする。図25では、値代入の場合には係数1、分岐条件の場合には係数2と定義した処理方法表49を用いている。
参照回数と処理内容との両方を考慮して解析影響度を特定する場合には、影響特定部22は、ステップS112で特定された解析影響度に参照回数と処理内容毎に事前に定められた係数とを乗じて、新たな解析影響度とする。
以上のように、実施の形態4に係るソースコード分割装置10は、引数の引き渡し先の関数31の処理における引数の利用状況を考慮して解析影響度を特定する。これにより、より適切に解析影響度を特定することができる。その結果、より適切にソースコード30を分割することができる。
実施の形態5では、実施の形態1〜4のいずれかで説明したソースコード分割装置10により生成された複数の分割コード32を解析するソースコード解析装置50について説明する。
図26を参照して、実施の形態5に係るソースコード解析装置50の構成を説明する。
ソースコード解析装置50は、コンピュータである。
ソースコード解析装置50は、プロセッサ51と、メモリ52と、ストレージ53と、通信インタフェース54とのハードウェアを備える。プロセッサ51は、信号線を介して他のハードウェアと接続され、これら他のハードウェアを制御する。
ストレージ53には、ソースコード解析装置50の各機能構成要素の機能を実現するプログラムが格納されている。このプログラムは、プロセッサ51によりメモリ52に読み込まれ、プロセッサ51によって実行される。これにより、ソースコード解析装置50の各機能構成要素の機能が実現される。
参照関係テーブル531は、関数名又はグローバル変数名が設定される名称をkeyとし、参照関数と被参照関数とをバリューとして持つテーブルである。
解析情報テーブル532は、関数名又はグローバル変数名が設定される名称をkeyとし、引数の値範囲と、戻り値又はグローバル変数の値範囲と、解析結果とをバリューとして持つテーブルである。引数の値範囲には、引数名と、最小値minと、最大値MAXとが含まれる。戻り値又はグローバル変数の値範囲には、最小値minと、最大値MAXとが含まれる。解析結果には、行数と、結果とが含まれる。
解析結果に含まれる結果としては、安全と、危険と、未証明とがある。安全は、どのような値に対しても該当の行の処理が不具合を起こさないことを意味する。危険は、どのような値に対しても該当の行の処理が不具合を起こすことを意味する。未証明は、値によって該当の行の処理が不具合を起こすことを意味する。
図29から図38を参照して、実施の形態5に係るソースコード解析装置50の動作を説明する。
実施の形態5に係るソースコード解析装置50の動作は、実施の形態5に係るソースコード解析方法に相当する。また、実施の形態5に係るソースコード解析装置50の動作は、実施の形態5に係るソースコード解析プログラムの処理に相当する。
前処理は、以下で説明するソースコード解析装置50の全体的な動作の前に実行される処理である。
前処理では、参照特定部61は、ソースコード30で定義されている関数とグローバル変数とについて、参照関数及び被参照関数を特定して、参照関係テーブル531に書き込む。
ステップS121で、参照特定部61は、通信インタフェース54を介して分析対象のソースコード30の入力を受け付ける。参照特定部61は、ソースコード30に定義されている全ての関数名とグローバル変数名とを抽出する。参照特定部61は、抽出された関数名及びグローバル変数名を、参照関係テーブル531の名称の欄に書き込む。
ステップS122で、参照特定部61は、参照関係テーブル531から対象とする関数名を読み出す。ここでは、読み出された関数名を関数名Aとする。
ステップS123で、参照特定部61は、ソースコード30において、関数名Aが示す関数が参照している関数を特定する。ここでは、特定された関数の関数名を関数名Bとする。ステップS124で、参照特定部61は、関数名Aをkeyとするレコードのバリューの参照関数に関数名Bを書き込む。ステップS125では、参照特定部61は、関数名Bをkeyとするレコードのバリューの被参照関数に関数名Aを書き込む。
ステップS126では、参照特定部61は、ソースコード30において、関数名Aが示す関数が参照しているグローバル変数名を特定する。ここでは、特定されたグローバル変数名を変数名Cとする。ステップS127では、参照特定部61は、変数名Cをkeyとするレコードのバリューの被参照関数に関数名Aを書き込む。
(図32のステップS131:コード取得処理)
構造特定部62は、ソースコード30を分割して生成された複数の分割コード32のうち、解析の処理対象とする分割コード32を取得する。
構造特定部62は、参照関係テーブル531を参照して、ステップS131で取得された処理対象の分割コード32についての参照関係を特定する。構造特定部62は、特定された参照関係を示す部分参照関係テーブル533を生成して、メモリ52に書き込む。部分参照関係テーブル533の構成は、参照関係テーブル531の構成と同じである。
ステップS141で、構造特定部62は、処理対象の分割コード32に定義されている全ての関数名とグローバル変数名とを抽出する。構造特定部62は、抽出された関数名及びグローバル変数名を、部分参照関係テーブル533の名称の欄に書き込む。
ステップS142で、構造特定部62は、部分参照関係テーブル533から対象とする要素を読み出す。ここでは、読み出された要素を要素Aとする。ステップS143で、構造特定部62は、参照関係テーブル531から要素Aをkeyとする全てのバリューを読み出す。ここでは、読み出されたバリューをバリューBとする。ステップS144で、構造特定部62は、部分参照関係テーブル533における要素AをkeyとするレコードのバリューにバリューBを書き込む。
情報取得部63は、解析情報テーブル532を参照して、ステップS131で取得された処理対象の分割コード32に関連する変数の取り得る範囲を示す値範囲情報を取得する。情報取得部63は、取得された解析情報を示す部分解析情報テーブル534を生成して、メモリ52に書き込む。部分解析情報テーブル534の構成は、解析情報テーブル532の構成と同じである。
ステップS151で、情報取得部63は、ステップS132で生成された部分参照関係テーブル533に含まれる全ての関数名及びグローバル変数名を抽出する。情報取得部63は、抽出された関数名及びグローバル変数名を、部分解析情報テーブル534の名称の欄に書き込む。
ステップS152で、情報取得部63は、部分解析情報テーブル534から対象とする要素を読み出す。ここでは、読み出された要素を要素Aとする。ステップS153で、情報取得部63は、解析情報テーブル532から要素Aをkeyとする全てのバリューを読み出す。ここでは、読み出されたバリューをバリューBとする。ステップS154で、情報取得部63は、部分解析情報テーブル534における要素AをkeyとするレコードのバリューにバリューBを書き込む。
ここでは、上述した通り分割コード32Bに対する解析が実行済の状態であるため、funcAの引数の値の範囲と、funcC及びfuncDの戻り値の範囲とが特定されている。つまり、処理対象の分割コード32Aではない他の分割コード32を解析することにより、処理対象の分割コード32Aだけでは得られない変数の値範囲情報が特定されている。
解析部64は、ステップS132で生成された部分参照関係テーブル533と、ステップS133で生成された部分解析情報テーブル534とを参照して、処理対象の分割コード32を解析する。言い換えると、解析部64は、処理対象の分割コード32を除く複数の分割コードのうちの少なくともいずれかの分割コード32を解析して得られた、ソースコード30における変数の値の取り得る範囲を示す値範囲情報を参照して、処理対象の分割コード32を解析する。
解析部64は、ステップS161からステップS169の処理を、部分参照関係テーブル533の名称の欄に設定された各関数名を対象として実行する。
ステップS161で、解析部64は、部分参照関係テーブル533から対象とする関数名を読み出す。ここでは、読み出された関数名を関数名Aとする。ステップS162で、解析部64は、関数名Aが示す関数と、部分解析情報テーブル534とから、関数名Aが示す関数に関連する引数と戻り値とグローバル変数との各変数の値範囲情報を特定する。
ステップS163で、解析部64は、ステップS162で特定された値範囲情報が示す最小値から最大値まで引数と戻り値とグローバル変数との各変数の値を変化させながら、処理対象の行が安全であるか、危険であるかを判定する。ステップS164で、解析部64は、各変数をどの値とした場合であっても、全て安全と判定された場合には、処理をステップS165に進める。一方、解析部64は、それ以外の場合には、処理をステップS166に進める。ステップS165で、解析部64は、処理対象の行を安全と判定する。
ステップS166で、解析部64は、各変数をどの値とした場合であっても、全て危険と判定された場合には、処理をステップS167に進める。一方、解析部64は、それ以外の場合には、処理をステップS168に進める。ステップS167で、解析部64は、処理対象の行を危険と判定する。ステップS168で、解析部64は、処理対象の行を未証明と判定する。
なお、処理対象の分割コード32Aだけでは知り得ないfuncAの引数の値範囲と、funcCの戻り値の範囲とを利用して解析がされているため、解析精度の高い、つまり未証明個所の少ない解析結果が得られる。
情報格納部65は、ステップS134で得られた部分解析情報テーブル534により、解析情報テーブル532を更新する。これにより、次に、図32に示す処理が実行される際、今回の処理で特定された値範囲情報を利用して解析を行うことが可能になる。
以上のように、実施の形態5に係るソースコード解析装置50は、ソースコード分割装置10によって分割され生成された分割コード32を解析する。そのため、ソースコード30を解析する場合と比較して高速に解析することが可能である。また、実施の形態5に係るソースコード解析装置50は、他の分割コード32を解析することにより得られた値範囲情報を利用して解析を行う。そのため、解析精度の高い解析を行うことが可能である。
<変形例5>
実施の形態5では、各機能構成要素がソフトウェアで実現された。しかし、変形例5として、各機能構成要素はハードウェアで実現されてもよい。この変形例5について、実施の形態5と異なる点を説明する。
各機能構成要素がハードウェアで実現される場合には、ソースコード解析装置50は、プロセッサ51とメモリ52とストレージ53とに代えて、電子回路55を備える。電子回路55は、各機能構成要素と、メモリ52と、ストレージ53との機能とを実現する専用の回路である。
各機能構成要素を1つの電子回路55で実現してもよいし、各機能構成要素を複数の電子回路55に分散させて実現してもよい。
変形例6として、一部の各機能構成要素がハードウェアで実現され、他の各機能構成要素がソフトウェアで実現されてもよい。
実施の形態6は、未証明の行だけを解析する点が実施の形態5と異なる。実施の形態6では、この異なる点を説明し、同一の点については説明を省略する。
図40を参照して、実施の形態6に係る解析処理を説明する。
ステップS171からステップS172の処理は、図37のステップS161からステップS162の処理と同じである。ステップS173で、解析部64は、処理対象の行について、判定済か否かを判定する。つまり、解析部64は、安全又は危険との判定結果が得られているか否かを判定する。解析部64は、安全又は危険との判定結果が得られている場合には、既に判定済であるとして、行をインクリメントして次の行を処理対象にする。一方、解析部64は、安全又は危険との判定結果が得られていない場合には、判定済でないとして、処理をステップS174に進める。
ステップS174からステップS180の処理は、図37のステップS163からステップS169の処理と同じである。
実施の形態7は、ソースコード30全体の解析精度が指定された精度に達するまで、処理を繰り返し実行する点が実施の形態5,6と異なる。実施の形態7では、この異なる点を説明し、同一の点については説明を省略する。
実施の形態7では、実施の形態5に機能を追加した場合を説明する。しかし、実施の形態6に機能を追加することも可能である。
図41を参照して、実施の形態7に係るソースコード解析装置50の構成を説明する。
ソースコード解析装置50は、精度指定部66を備える点が図26に示すソースコード解析装置50と異なる。
解析情報テーブル532は、バリューとして解析精度を含む点が図27に示す解析情報テーブル532と異なる。解析精度は、関数毎に計算される。解析精度(%)は、(安全又は危険と判定された行数)/(関数の全ての行数)×100によって計算される。
図43を参照して、実施の形態7に係るソースコード解析装置50の全体的な動作を説明する。
(図43のステップS181:精度指定処理)
精度指定部66は、基準精度の指定を受け付ける。
具体的には、精度指定部66は、通信インタフェース54を介して接続された入力装置を利用者が操作することによって入力された精度を基準精度として受け付ける。
精度指定部66は、ソースコード30の全体の解析精度がステップS181で受け付けられた基準精度以上であるか否かを判定する。精度指定部66は、解析精度が基準精度以上である場合には、処理を終了する。一方、精度指定部66は、解析精度が基準精度未満である場合には、処理をステップS183に進める。
ソースコード30の全体の解析精度は、ソースコード30の全ての関数の解析精度の平均値であってもよいし、安全又は危険と判定されたソースコード30の行数/ソースコード30の全ての行数×100によって計算されてもよい。
つまり、解析精度が基準精度未満である場合には、ステップS183で新たな分割コード32が解析の処理対象として受け付けられ、解析が継続される。
実施の形態8は、指定されたモジュールの解析精度が指定された精度に達するまで、処理を繰り返し実行する点が実施の形態7と異なる。実施の形態8では、この異なる点を説明し、同一の点については説明を省略する。
図44を参照して、実施の形態8に係るソースコード解析装置50の全体的な動作を説明する。
(図44のステップS191:精度指定処理)
精度指定部66は、モジュールの指定及び基準精度の指定を受け付ける。
具体的には、精度指定部66は、通信インタフェース54を介して接続された入力装置を利用者が操作することによって入力されたモジュールを指定モジュールとし、精度を基準精度として受け付ける。
精度指定部66は、ステップS191で受け付けられた指定モジュールの解析精度がステップS191で受け付けられた基準精度以上であるか否かを判定する。精度指定部66は、解析精度が基準精度以上である場合には、処理を終了する。一方、精度指定部66は、解析精度が基準精度未満である場合には、処理をステップS193に進める。
モジュールは、1つ以上の関数である。指定モジュールが複数の関数を含む場合には、指定モジュールの解析精度は、指定モジュールに含まれる全ての関数の解析精度の平均値であってもよいし、安全又は危険と判定された指定モジュールの行数/指定モジュールの全ての行数×100によって計算されてもよい。
つまり、指定モジュールの解析精度が基準精度未満である場合には、ステップS193で新たな分割コード32が解析の処理対象として受け付けられ、解析が継続される。
Claims (15)
- ソースコードに含まれる2つの関数それぞれを対象として、対象の2つの関数の間で引き渡される情報量により、前記対象の2つの関数を別々の分割コードに分割した場合における前記ソースコードの解析精度に対する影響度を、前記対象の2つの関数の間の解析影響度として特定する影響特定部と、
前記影響特定部によって特定された前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割する分割部と
を備えるソースコード分割装置。 - 前記2つの関数の間で引き渡される情報量は、2つの関数の間の引数と戻り値との少なくともいずれかのビット数である
請求項1に記載のソースコード分割装置。 - 前記分割部は、別々の分割コードになった関数の間の前記解析影響度の合計値が小さくなるように、前記ソースコードを指定された数の分割コードに分割する
請求項1又は2に記載のソースコード分割装置。 - 前記2つの関数の間で引き渡される情報量は、前記対象の2つの関数が共通して参照するグローバル変数のビット数である
請求項1から3までのいずれか1項に記載のソースコード分割装置。 - 前記影響特定部は、前記対象の2つの関数のうち呼び出される関数と、前記呼び出される関数が呼び出す他の関数との間の前記解析精度に対する影響度である階層影響度と、前記解析影響度とに基づき、前記対象の2つの関数の間の新たな解析影響度を特定する
請求項1から4までのいずれか1項に記載のソースコード分割装置。 - 前記影響特定部は、前記対象の2つの関数の間で引き渡された情報の参照回数と、前記解析影響度とに基づき、前記対象の2つの関数の間の新たな解析影響度を特定する
請求項1から5までのいずれか1項に記載のソースコード分割装置。 - 前記影響特定部は、前記対象の2つの関数の間で引き渡された情報を用いた処理内容と、前記解析影響度とに基づき、前記対象の2つの関数の間の新たな解析影響度を特定する請求項1から6までのいずれか1項に記載のソースコード分割装置。
- 請求項1から7までのいずれか1項に記載のソースコード分割装置における前記分割部によって分割された前記複数の分割コードのうちのいずれかの分割コードを処理対象の分割コードとして、前記処理対象の分割コードを除く前記複数の分割コードのうちの少なくともいずれかの分割コードを解析して得られた、前記ソースコードにおける変数の取り得る範囲を示す値範囲情報を参照して、前記処理対象の分割コードを解析する解析部
を備えるソースコード解析装置。 - 前記値範囲情報は、前記ソースコードに含まれる関数の引数及び戻り値と、前記ソースコードに含まれるグローバル変数との値の取り得る範囲を示す
請求項8に記載のソースコード解析装置。 - 前記解析部は、前記処理対象の分割コードの各行について安全か危険かの解析を行う
請求項8又は9に記載のソースコード解析装置。 - 前記解析部は、前記処理対象の分割コードのうち、安全か危険かの解析結果が得られていない行についてのみ安全か危険かの解析を行う
請求項10に記載のソースコード解析装置。 - 前記解析部は、前記ソースコードの全ての行に対する前記解析の結果が得られている行の割合が基準精度以上になるまで、前記複数の分割コードのうちのいずれかの分割コードを処理対象の分割コードとして解析する処理を繰り返す
請求項10又は11に記載のソースコード解析装置。 - 前記解析部は、前記ソースコードに含まれる対象の関数の全ての行に対する前記解析の結果が得られている行の割合が基準精度以上になるまで、前記複数の分割コードのうちのいずれかの分割コードを処理対象の分割コードとして解析する処理を繰り返す
請求項10又は11に記載のソースコード解析装置。 - コンピュータが、ソースコードに含まれる2つの関数それぞれを対象として、対象の2つの関数の間で引き渡される情報量により、前記対象の2つの関数を別々の分割コードに分割した場合における前記ソースコードの解析に対する影響度を、前記対象の2つの関数の間の解析影響度として特定し、
コンピュータが、前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割するソースコード分割方法。 - ソースコードに含まれる2つの関数それぞれを対象として、対象の2つの関数の間で引き渡される情報量により、前記対象の2つの関数を別々の分割コードに分割した場合における前記ソースコードの解析に対する影響度を、前記対象の2つの関数の間の解析影響度として特定する影響特定処理と、
前記影響特定処理によって特定された前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割する分割処理と
をコンピュータの実行させるソースコード分割プログラム。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2017223514 | 2017-11-21 | ||
JP2017223514 | 2017-11-21 | ||
PCT/JP2018/039754 WO2019102786A1 (ja) | 2017-11-21 | 2018-10-25 | ソースコード分割装置、ソースコード解析装置、ソースコード分割方法及びソースコード分割プログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JPWO2019102786A1 JPWO2019102786A1 (ja) | 2020-04-02 |
JP6739667B2 true JP6739667B2 (ja) | 2020-08-12 |
Family
ID=66631505
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2019556148A Active JP6739667B2 (ja) | 2017-11-21 | 2018-10-25 | ソースコード分割装置、ソースコード解析装置、ソースコード分割方法及びソースコード分割プログラム |
Country Status (4)
Country | Link |
---|---|
US (1) | US11086604B2 (ja) |
JP (1) | JP6739667B2 (ja) |
GB (1) | GB2581057A (ja) |
WO (1) | WO2019102786A1 (ja) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2021084735A1 (ja) * | 2019-11-01 | 2021-05-06 | 三菱電機株式会社 | ソースコード解析装置 |
CN112860262B (zh) * | 2021-02-09 | 2024-06-07 | 上海商汤智能科技有限公司 | 一种代码解析的方法、装置、电子设备及存储介质 |
US11645056B2 (en) * | 2021-07-15 | 2023-05-09 | Intuit Inc. | Capturing variable dependencies using a variable agnostic object |
Family Cites Families (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2000298586A (ja) | 1999-04-12 | 2000-10-24 | Fujitsu Ltd | オブジェクト指向プログラム品質改善方法およびシステム |
JP2001325100A (ja) | 2000-05-15 | 2001-11-22 | Mitsubishi Electric Corp | プログラム解析装置 |
JP2006302135A (ja) | 2005-04-22 | 2006-11-02 | Fujitsu Ltd | アプリケーション資産分析プログラム、アプリケーション資産分析方法およびアプリケーション資産分析装置 |
JP5170408B2 (ja) | 2008-03-31 | 2013-03-27 | 日本電気株式会社 | 自動分散化システム及び自動分散化方法 |
JP2010049489A (ja) | 2008-08-21 | 2010-03-04 | Toshiba Corp | デバッグ支援装置およびデバッグ支援プログラム |
JP5188421B2 (ja) | 2009-02-27 | 2013-04-24 | 株式会社日立製作所 | ソースコード解析方法およびソースコード解析支援システム |
US9170805B2 (en) | 2010-07-20 | 2015-10-27 | Hitachi, Ltd. | Software maintenance supporting device for analyzing relationships between variables |
JP2012164024A (ja) | 2011-02-03 | 2012-08-30 | Toyota Motor Corp | データフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラム |
JP5762857B2 (ja) | 2011-07-01 | 2015-08-12 | 株式会社日立製作所 | ソフトウェア開発成果物間の依存関係評価装置及び評価方法 |
JP5899946B2 (ja) * | 2012-01-17 | 2016-04-06 | 富士通株式会社 | 分割装置、分割方法、および分割プログラム |
JP5869465B2 (ja) | 2012-12-05 | 2016-02-24 | トヨタ自動車株式会社 | ソフトウェア複雑度測定装置及び方法並びにプログラム |
US9195458B2 (en) | 2013-07-31 | 2015-11-24 | International Business Machines Corporation | System and/or method for computing interprocedural dominators |
JP6175306B2 (ja) | 2013-08-09 | 2017-08-02 | 株式会社東芝 | 制御プログラム分割装置、制御プログラム分割方法及びその記録媒体 |
JP6253521B2 (ja) | 2014-06-05 | 2017-12-27 | 株式会社日立製作所 | プログラム可視化装置、プログラム可視化方法、及びプログラム可視化プログラム |
JP6503750B2 (ja) | 2015-01-16 | 2019-04-24 | 横河電機株式会社 | エンジニアリング支援装置、方法、及びプログラム |
US10083025B2 (en) * | 2015-11-20 | 2018-09-25 | Google Llc | Dynamic update of an application in compilation and deployment with warm-swapping |
US10019342B2 (en) * | 2015-12-24 | 2018-07-10 | Intel Corporation | Data flow programming of computing apparatus with vector estimation-based graph partitioning |
-
2018
- 2018-10-25 US US16/648,937 patent/US11086604B2/en active Active
- 2018-10-25 WO PCT/JP2018/039754 patent/WO2019102786A1/ja active Application Filing
- 2018-10-25 GB GB2005264.3A patent/GB2581057A/en not_active Withdrawn
- 2018-10-25 JP JP2019556148A patent/JP6739667B2/ja active Active
Also Published As
Publication number | Publication date |
---|---|
WO2019102786A1 (ja) | 2019-05-31 |
GB2581057A (en) | 2020-08-05 |
US20200285452A1 (en) | 2020-09-10 |
GB202005264D0 (en) | 2020-05-27 |
JPWO2019102786A1 (ja) | 2020-04-02 |
US11086604B2 (en) | 2021-08-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5933762B2 (ja) | コード網羅率決定方法およびシステム | |
JP6739667B2 (ja) | ソースコード分割装置、ソースコード解析装置、ソースコード分割方法及びソースコード分割プログラム | |
US9632916B2 (en) | Method and apparatus to semantically connect independent build and test processes | |
US8769504B2 (en) | Method and apparatus for dynamically instrumenting a program | |
US20160378639A1 (en) | Debugging using program state definitions | |
JP6925433B2 (ja) | データ検証装置、データ検証方法及びデータ検証プログラム | |
JP6789844B2 (ja) | 類似関数抽出装置および類似関数抽出プログラム | |
JP6945768B2 (ja) | 検知装置、検知方法、及び、検知プログラム | |
CN108804308B (zh) | 新版本程序缺陷检测方法及装置 | |
US8554522B2 (en) | Detection of design redundancy | |
US20080052587A1 (en) | Unit Test Extender | |
US20210326130A1 (en) | Scale calculation apparatus and computer readable medium | |
WO2020136880A1 (ja) | テスト実行装置、テスト実行方法及びテスト実行プログラム | |
JP7468649B2 (ja) | 矛盾検知装置、矛盾検知方法およびコンピュータ読み取り可能な記録媒体 | |
JP5409039B2 (ja) | 情報処理装置及び情報処理方法及びプログラム | |
JP2021096685A (ja) | テスト実行プログラム、テスト実行方法、およびテスト実行装置 | |
WO2020070817A1 (ja) | ソフトウェア解析装置、ソフトウェア解析方法およびソフトウェア解析プログラム | |
KR101624264B1 (ko) | 공유 라이브러리 파일의 악성 진단 장치 및 방법 | |
JP5342508B2 (ja) | 情報処理装置及び情報処理方法及びプログラム | |
JP6971835B2 (ja) | 要素類似判定装置、要素類似判定方法及び要素類似判定プログラム | |
KR102380437B1 (ko) | 정밀도 스케일링을 이용한 알고리즘 성능 최적화 방법 | |
CN114115763B (zh) | 打印机平台化产品的配置装置及配置方法 | |
JP5343840B2 (ja) | プログラムの解析装置及び解析方法 | |
JP7274063B2 (ja) | テストケース生成装置、テストケース生成方法及びテストケース生成プログラム | |
WO2024214262A1 (ja) | 解析機能付与装置、解析機能付与方法及び解析機能付与プログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20191023 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20200428 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20200609 |
|
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: 20200623 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20200721 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 6739667 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 |