JP6739667B2 - ソースコード分割装置、ソースコード解析装置、ソースコード分割方法及びソースコード分割プログラム - Google Patents

ソースコード分割装置、ソースコード解析装置、ソースコード分割方法及びソースコード分割プログラム Download PDF

Info

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
Application number
JP2019556148A
Other languages
English (en)
Other versions
JPWO2019102786A1 (ja
Inventor
泰史 東
泰史 東
利大 小林
利大 小林
将輝 藤田
将輝 藤田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Mitsubishi Electric Corp
Original Assignee
Mitsubishi Electric Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Mitsubishi Electric Corp filed Critical Mitsubishi Electric Corp
Publication of JPWO2019102786A1 publication Critical patent/JPWO2019102786A1/ja
Application granted granted Critical
Publication of JP6739667B2 publication Critical patent/JP6739667B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/72Code 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

この発明は、コンピュータシステムにおけるソースコードの分割技術に関する。
開発するソフトウェア規模の増大に伴い、ソフトウェアの構成が理解しづらくなっている。そのため、ソフトウェアにおける変更箇所の影響範囲を把握しきれないといった危険度が大きくなっている。この危険度を小さくするため、ソースコード解析ツールを用いてエラー箇所を検出し、効率的に不具合を検出することが行われている。
ソースコード解析ツールとしては、関数の引数及びグローバル変数といったパラメータを指定することで、ランタイムエラーを検出することができる動的解析ツールが知られている。
しかし、全てのソースコードを一度に解析すると、解析対象のソフトウェア規模が大きすぎるために解析できない、又は、解析が長時間に及ぶ場合がある。この場合には、解析対象の巨大なソースコードが解析可能なソフトウェア部品に分割され、ソフトウェア部品毎に解析が行われる。
特許文献1には、ソフトウェア部品のメトリクス情報と、ソフトウェア部品間の依存関係の数とを用いてソースコードを分割する箇所を判断する技術が開示されている。これにより、特許文献1では、解析対象とするソースコードの複雑度を低減し、解析可能なソフトウェア部品に分割している。
特開2017−117449号公報
ソースコードを分割した場合には、分割後のソフトウェア部品間の依存関係が欠落するために、解析精度が低下してしまう。
この発明では、ソースコードを分割することによる解析精度が低下する程度を小さくできるようにすることを目的とする。
この発明に係るソースコード分割装置は、
ソースコードに含まれる2つの関数それぞれを対象として、対象の2つの関数の間で引き渡される情報量により、前記対象の2つの関数を別々の分割コードに分割した場合における前記ソースコードの解析に対する影響度を、前記対象の2つの関数の間の解析影響度として特定する影響特定部と、
前記影響特定部によって特定された前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割する分割部と
を備える。
この発明は、関数の間で引き渡される情報量により関数の間の解析影響度を特定し、特定された解析影響度に基づきソースコードを複数の分割コードに分割する。これにより、ソースコードを分割することによる解析精度が低下する程度を小さくすることが可能である。
実施の形態1に係るソースコード分割装置10の構成図。 実施の形態1に係るソースコード分割装置10の全体的な動作を示すフローチャート。 実施の形態1に係る依存特定処理のフローチャート。 実施の形態1に係る依存特定処理の説明図。 実施の形態1に係る影響特定処理のフローチャート。 実施の形態1に係る影響特定処理の説明図。 実施の形態1に係る分割処理のフローチャート。 実施の形態1に係る分割処理の説明図。 実施の形態1の効果の説明図。 変形例2に係るソースコード分割装置10の構成図。 実施の形態2に係るソースコード分割装置10の構成図。 実施の形態2に係るソースコード分割装置10の全体的な動作を示すフローチャート。 実施の形態2に係るグローバル変数特定処理のフローチャート。 実施の形態2に係るグローバル変数特定処理の説明図。 実施の形態2に係る影響特定処理のフローチャート。 実施の形態2に係る影響特定処理の説明図。 変形例4に係るソースコード分割装置10の構成図。 変形例4に係るソースコード分割装置10の全体的な動作を示すフローチャート。 変形例4に係る影響統合処理のフローチャート。 変形例4に係る影響統合処理の説明図。 実施の形態3に係る関数31の間の依存関係が階層的になっている場合の説明図。 実施の形態3に係るソースコード分割装置10の全体的な動作を示すフローチャート。 実施の形態3に係る引数影響表43を示す図。 実施の形態4に係るソースコード分割装置10の全体的な動作を示すフローチャート。 実施の形態4に係る利用影響度特定処理の説明図。 実施の形態5に係るソースコード解析装置50の構成図。 実施の形態5に係る参照関係テーブル531の構成図。 実施の形態5に係る解析情報テーブル532の構成図。 実施の形態5に係るソースコード30及び分割コード32の例を示す図。 実施の形態5に係る参照特定処理のフローチャート。 実施の形態5に係る参照特定処理の説明図。 実施の形態5に係るソースコード解析装置50の全体的な動作を示すフローチャート。 実施の形態5に係る構造特定処理のフローチャート。 実施の形態5に係る構造特定処理の説明図。 実施の形態5に係る情報取得処理のフローチャート。 実施の形態5に係る情報取得処理の説明図。 実施の形態5に係る解析処理のフローチャート。 実施の形態5に係る解析処理の説明図。 変形例5に係るソースコード解析装置50の構成図。 実施の形態6に係る解析処理のフローチャート。 実施の形態7に係るソースコード解析装置50の構成図。 実施の形態7に係る解析情報テーブル532の構成図。 実施の形態7に係るソースコード解析装置50の全体的な動作を示すフローチャート。 実施の形態8に係るソースコード解析装置50の全体的な動作を示すフローチャート。
実施の形態1.
***構成の説明***
図1を参照して、実施の形態1に係るソースコード分割装置10の構成を説明する。
ソースコード分割装置10は、コンピュータである。
ソースコード分割装置10は、プロセッサ11と、メモリ12と、ストレージ13と、通信インタフェース14とのハードウェアを備える。プロセッサ11は、信号線を介して他のハードウェアと接続され、これら他のハードウェアを制御する。
プロセッサ11は、プロセッシングを行うIC(Integrated Circuit)である。プロセッサ11は、具体例としては、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、GPU(Graphics Processing Unit)である。
メモリ12は、データを一時的に記憶する記憶装置である。メモリ12は、具体例としては、SRAM(Static Random Access Memory)、DRAM(Dynamic Random Access Memory)である。
ストレージ13は、データを保管する記憶装置である。ストレージ13は、具体例としては、HDD(Hard Disk Drive)である。また、ストレージ13は、SD(登録商標,Secure Digital)メモリカード、CF(CompactFlash,登録商標)、NANDフラッシュ、フレキシブルディスク、光ディスク、コンパクトディスク、ブルーレイ(登録商標)ディスク、DVD(Digital Versatile Disk)といった可搬記録媒体であってもよい。
通信インタフェース14は、外部の装置と通信するためのインタフェースである。通信インタフェース14は、具体例としては、Ethernet(登録商標)、USB(Universal Serial Bus)、HDMI(登録商標,High−Definition Multimedia Interface)のポートである。
ソースコード分割装置10は、機能構成要素として、依存特定部21と、影響特定部22と、分割部23とを備える。ソースコード分割装置10の各機能構成要素の機能はソフトウェアにより実現される。
ストレージ13には、ソースコード分割装置10の各機能構成要素の機能を実現するプログラムが格納されている。このプログラムは、プロセッサ11によりメモリ12に読み込まれ、プロセッサ11によって実行される。これにより、ソースコード分割装置10の各機能構成要素の機能が実現される。
図1では、プロセッサ11は、1つだけ示されていた。しかし、プロセッサ11は、複数であってもよく、複数のプロセッサ11が、各機能を実現するプログラムを連携して実行してもよい。
***動作の説明***
図2から図8を参照して、実施の形態1に係るソースコード分割装置10の動作を説明する。
実施の形態1に係るソースコード分割装置10の動作は、実施の形態1に係るソースコード分割方法に相当する。また、実施の形態1に係るソースコード分割装置10の動作は、実施の形態1に係るソースコード分割プログラムの処理に相当する。
図2を参照して、実施の形態1に係るソースコード分割装置10の全体的な動作を説明する。
(図2のステップS11:依存特定処理)
依存特定部21は、ソースコード30に含まれる複数の関数31について、関数31間の引数の引き渡しに基づき、関数31間の依存関係を特定する。
図3及び図4を参照して、実施の形態1に係る依存特定処理を説明する。
ステップS21で、依存特定部21は、通信インタフェース14を介して分析対象のソースコード30の入力を受け付ける。
ステップS22で、依存特定部21は、宣言型ビット数表41をストレージ13から読み出す。宣言型ビット数表41は、変数の型と、その型で使用されるビット数とが対応付けられたデータである。宣言型ビット数表41は、事前にストレージ13に格納されているものとする。
ステップS23で、依存特定部21は、ステップS21で受け付けられたソースコード30に含まれる全ての引数について処理が済んでいるか否かを判定する。依存特定部21は、処理を行っていない引数がある場合には、処理をステップS24に進める。一方、依存特定部21は、全ての引数について処理が済んでいる場合には処理をステップS29に進める。
ステップS24で、依存特定部21は、ソースコード30から処理を行っていない引数を1つ抽出して対象の引数とし、対象の引数を引数情報表42の引数欄に書き込む。ステップS25で、依存特定部21は、対象の引数の引き渡し元の関数31を引数情報表42の依存元欄に書き込む。ステップS26で、依存特定部21は、対象の引数の引き渡し先の関数31を引数情報表42の依存先欄に書き込む。ステップS27で、依存特定部21は、対象の引数の引き渡し元の関数31で定義された、対象の引数の型を引数情報表42の引数型欄に書き込む。ステップS28で、依存特定部21は、宣言型ビット数表41を参照して、対象の引数の型で使用されるビット数を特定し、特定されたビット数を引数情報表42の引数型ビット数欄に書き込む。
例えば、対象の引数が引数aの場合には、mainが依存元欄に書き込まれ、FuncAが依存先欄に書き込まれ、boolが引数型欄に書き込まれ、1が引数型ビット数欄に書き込まれる。
ステップS29で、依存特定部21は、ステップS24からステップS28の処理により生成された引数情報表42をストレージ13に格納する。
(図2のステップS12:影響特定処理)
影響特定部22は、ソースコード30に含まれる依存関係のある2つの関数31それぞれを対象として、対象の2つの関数31の間で引き渡される情報量により、対象の2つの関数31の間の解析影響度を特定する。解析影響度は、対象の2つの関数31を別々の分割コード32に分割した場合におけるソースコード30の解析精度に対する影響度である。
図5及び図6を参照して、実施の形態1に係る影響特定処理を説明する。
ステップS31で、影響特定部22は、ステップS11で生成された引数情報表42をストレージ13から読み出す。
ステップS32で、影響特定部22は、引数情報表42に含まれる全ての引数について処理が済んでいるか否かを判定する。影響特定部22は、処理を行っていない引数がある場合には、処理をステップS33に進める。一方、影響特定部22は、全ての引数について処理が済んでいる場合には処理をステップS37に進める。
ステップS33で、影響特定部22は、引数情報表42から処理が済んでいない引数についてのレコードを読み出す。ステップS34で、影響特定部22は、ステップS33で読み出されたレコードにおける依存元と依存先との組が、引数影響表43に存在するか否かを判定する。影響特定部22は、依存元と依存先との組が引数影響表43に存在しない場合には、処理をステップS35に進める。一方、影響特定部22は、依存元と依存先との組が引数影響表43に存在する場合には、処理をステップS36に進める。
ステップS35で、影響特定部22は、ステップS33で読み出されたレコードにおける依存元と依存先とをそれぞれ、引数影響表43における依存元と依存先とに書き込む。また、影響特定部22は、ステップS33で読み出されたレコードにおけるビット数を、引数影響表43における解析影響度に書き込む。
一方、ステップS36で、影響特定部22は、ステップS33で読み出されたレコードにおける依存元と依存先との組についての、引数影響表43のレコードを特定する。影響特定部22は、特定された引数影響表43のレコードにおける解析影響度に、ステップS33で読み出されたレコードにおけるビット数を加算する。
その結果、例えば、依存元がmainであり、依存先がFuncAである引数影響表43のレコードの解析影響度は、引数情報表42に引数aのレコードのビット数“1”と引数bのレコードのビット数“8”とを合計した9になる。引数は、関数間で引き渡される情報であり、引数のビット数は関数間で引き渡される情報量である。そこで、引き渡される引数のビット数の合計が解析影響度とされている。解析影響度が大きいほど、解析精度に与える影響が大きくなる。
ステップS37で、影響特定部22は、ステップS34からステップS36の処理により生成された引数影響表43をストレージ13に格納する。
(図2のステップS13:分割処理)
分割部23は、ステップS12で特定された解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。
図7及び図8を参照して、実施の形態1に係る分割処理を説明する。
ステップS41で、分割部23は、ステップS12で生成された引数影響表43をストレージ13から読み出す。引数影響表43を参照して、各関数31をノードとし、依存元のノードから依存先のノードへ矢印を引き、各矢印のコストとして解析影響度を割り当てることにより、グラフ44を描くことが可能である。
ステップS42で、分割部23は、最小カット定理を用いて、ソースコード30を複数の分割コード32に分割する。これにより、解析影響度の合計が最小となるように、ソースコード30を複数の分割コード32に分割することが可能である。
なお、分割部23は、ソースコード30をいくつの分割コード32に分割するかを示す分割数は、通信インタフェース14を介して指定される、あるいは、事前に設定されているものとする。分割数が3以上の場合には、最小カット定理を用いた分割を繰り返し行えばよい。
ステップS43で、分割部23は、引数影響表43に含まれる関数31を分割表45に書き込む。そして、分割部23は、関数31毎に、属する分割コード32のグループ書き込む。ステップS44で、分割部23は、ステップS43で生成された分割表45を通信インタフェース14を介して出力する。
***実施の形態1の効果***
以上のように、実施の形態1に係るソースコード分割装置10は、関数31の間で引き渡される情報量により関数31の間の解析影響度を特定し、特定された解析影響度に基づきソースコード30を複数の分割コード32に分割する。これにより、ソースコード30を分割することによる解析精度が低下する程度を小さくすることが可能である。
図9に示すように、FuncAとFuncBとの間に依存関係がある場合、FuncAからFuncBに引数値10が渡され、FuncB内では実行されるif(x==10)
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つの関数の間の引数と戻り値との少なくともいずれかのビット数とすればよい。
<変形例2>
実施の形態1では、各機能構成要素がソフトウェアで実現された。しかし、変形例2として、各機能構成要素はハードウェアで実現されてもよい。この変形例2について、実施の形態1と異なる点を説明する。
図10を参照して、変形例2に係るソースコード分割装置10の構成を説明する。
各機能構成要素がハードウェアで実現される場合には、ソースコード分割装置10は、プロセッサ11とメモリ12とストレージ13とに代えて、電子回路15を備える。電子回路15は、各機能構成要素と、メモリ12と、ストレージ13との機能とを実現する専用の回路である。
電子回路15としては、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックIC、GA(Gate Array)、ASIC(Application Specific Integrated Circuit)、FPGA(Field−Programmable Gate Array)が想定される。
各機能構成要素を1つの電子回路15で実現してもよいし、各機能構成要素を複数の電子回路15に分散させて実現してもよい。
<変形例3>
変形例3として、一部の各機能構成要素がハードウェアで実現され、他の各機能構成要素がソフトウェアで実現されてもよい。
プロセッサ11とメモリ12とストレージ13と電子回路15とを処理回路という。つまり、各機能構成要素の機能は、処理回路により実現される。
実施の形態2.
実施の形態2は、グローバル変数を考慮して解析影響度を特定する点が実施の形態1と異なる。実施の形態2では、この異なる点を説明し、同一の点については説明を省略する。
***構成の説明***
図11を参照して、実施の形態2に係るソースコード分割装置10の構成を説明する。
ソースコード分割装置10は、依存特定部21に代えて、グローバル変数特定部24を備える点が図1に示すソースコード分割装置10と異なる。
***動作の説明***
図12から図16を参照して、実施の形態2に係るソースコード分割装置10の動作を説明する。
図12を参照して、実施の形態2に係るソースコード分割装置10の全体的な動作を説明する。
(図12のステップS51:グローバル変数特定処理)
グローバル変数特定部24は、ソースコード30に含まれる複数のグローバル変数について、参照する関数31を特定する。
図13及び図14を参照して、実施の形態2に係るグローバル変数特定処理を説明する。
ステップS61で、グローバル変数特定部24は、通信インタフェース14を介して分析対象のソースコード30の入力を受け付ける。ステップS22で、依存特定部21は、宣言型ビット数表41をストレージ13から読み出す。
ステップS63で、グローバル変数特定部24は、ステップS61で受け付けられたソースコード30に含まれる全てのグローバル変数について処理が済んでいるか否かを判定する。グローバル変数特定部24は、処理を行っていないグローバル変数がある場合には、処理をステップS64に進める。一方、グローバル変数特定部24は、全てのグローバル変数について処理が済んでいる場合には処理をステップS68に進める。
ステップS64で、グローバル変数特定部24は、ソースコード30から処理を行っていないグローバル変数を1つ抽出して対象のグローバル変数とし、対象のグローバル変数をグローバル変数表46のグローバル変数欄に書き込む。ステップS65で、グローバル変数特定部24は、対象のグローバル変数を参照する関数31を特定して、グローバル変数表46の参照関数欄に書き込む。ステップS66で、グローバル変数特定部24は、対象のグローバル変数の型をグローバル変数表46の宣言型欄に書き込む。ステップS67で、グローバル変数特定部24は、宣言型ビット数表41を参照して、対象のグローバル変数の型で使用されるビット数を特定し、特定されたビット数をグローバル変数表46の型ビット数欄に書き込む。
ステップS68で、グローバル変数特定部24は、ステップS64からステップS67の処理により生成されたグローバル変数表46をストレージ13に格納する。
(図12のステップS52:影響特定処理)
影響特定部22は、対象の2つの関数31が共通して参照するグローバル変数の情報量により、対象の2つの関数31の間の解析影響度を特定する。
図15及び図16を参照して、実施の形態2に係る影響特定処理を説明する。
ステップS71で、影響特定部22は、ステップS51で生成されたグローバル変数表46をストレージ13から読み出す。
ステップS72で、影響特定部22は、グローバル変数表46に含まれる全てのグローバル変数について処理が済んでいるか否かを判定する。影響特定部22は、処理を行っていないグローバル変数がある場合には、処理をステップS73に進める。一方、影響特定部22は、全てのグローバル変数について処理が済んでいる場合には処理をステップS78に進める。
ステップS73で、影響特定部22は、グローバル変数表46から処理が済んでいないグローバル変数についてのレコードを読み出す。ステップS74で、影響特定部22は、ステップS73で読み出されたレコードにおいて参照関数に登録されている2つの関数の組を特定する。なお、影響特定部22は、参照関数に3つ以上の関数が登録されている場合には、2つの関数の各組を特定する。
影響特定部22は、ステップS74で特定された各組を対象として、ステップS75からステップS77の処理を実行する。
ステップS75で、影響特定部22は、対象の組がグローバル変数影響表47に存在するか否かを判定する。影響特定部22は、依存元と依存先との組がグローバル変数影響表47に存在しない場合には、処理をステップS76に進める。一方、影響特定部22は、依存元と依存先との組がグローバル変数影響表47に存在する場合には、処理をステップS77に進める。
ステップS76で、影響特定部22は、対象の組の関数31をそれぞれ、グローバル変数影響表47における参照関数欄に書き込む。また、影響特定部22は、ステップS73で読み出されたレコードにおける型ビット数を、グローバル変数影響表47における解析影響度に書き込む。
一方、ステップS77で、影響特定部22は、対象の組についての、グローバル変数影響表47のレコードを特定する。影響特定部22は、特定されたグローバル変数影響表47のレコードにおける解析影響度に、ステップS73で読み出されたレコードにおける型ビット数を加算する。
FuncAとFuncBとでは、int型のグローバル変数であるglobalAを共通して参照している。そのため、FuncAとFuncBとでは、globalAを介して情報が引き渡されていることになる。したがって、FuncAとFuncBとの組の解析影響度は、int型のビット数である16になる。つまり、FuncAとFuncBとが別々の分割コード32に分割された場合には、16ビット分の情報量が失われ、その分解析精度が低下する。
ステップS78で、影響特定部22は、ステップS74からステップS77の処理により生成されたグローバル変数影響表47をストレージ13に格納する。
(図12のステップS53:分割処理)
分割部23は、ステップS52で特定された解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。つまり、分割部23は、グローバル変数影響表47における解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。分割の方法は、図2のステップS13の処理と同じである。
***実施の形態2の効果***
以上のように、実施の形態2に係るソースコード分割装置10は、2つの関数31が共通して参照するグローバル変数の情報量により、2つの関数31の間で引き渡される情報量を特定した。そして、特定された情報量にから解析影響度を特定し、特定された解析影響度に基づきソースコード30を複数の分割コード32に分割する。これにより、ソースコード30を分割することによる解析精度が低下する程度を小さくすることが可能である。
***他の構成***
<変形例4>
実施の形態2では、2つの関数31が共通して参照するグローバル変数の情報量により、対象の2つの関数31の間の解析影響度を特定した。変形例4として、2つの関数31が共通して参照するグローバル変数の情報量だけでなく、実施の形態1で説明した、対象の2つの関数31の間で引き渡される情報量も考慮して、解析影響度を特定してもよい。これにより、より適切に解析影響度を特定することができる。その結果、より適切にソースコード30を分割することができる。
図17を参照して、変形例4に係るソースコード分割装置10の構成を説明する。
ソースコード分割装置10は、図1に示す依存特定部21と、図11に示すグローバル変数特定部24との両方を備える。
図18を参照して、変形例4に係るソースコード分割装置10の動作を説明する。
ステップS81からステップS82の処理は、図2のステップS11からステップS12の処理と同じである。また、ステップS83からステップS84の処理は、図12のステップS51からステップS52の処理と同じである。
(図18のステップS85:影響統合処理)
影響特定部22は、ステップS82で特定された解析影響度と、ステップS84で特定された解析影響度とを統合する。
図19及び図20を参照して、変形例4に係る影響統合処理を説明する。
ステップS91では、影響特定部22は、ステップS82の処理で生成された引数影響表43と、ステップS84の処理で生成されたグローバル変数影響表47とを、ストレージ13から読み出す。
ステップS92では、影響特定部22は、引数影響表43における全てのレコードを統合影響表48に追加する。
ステップS93では、影響特定部22は、グローバル変数影響表47に含まれる全てのレコードについて処理が済んでいるか否かを判定する。影響特定部22は、処理を行っていないレコードがある場合には、処理をステップS94に進める。一方、影響特定部22は、全てのレコードについて処理が済んでいる場合には処理をステップS98に進める。
ステップS94では、影響特定部22は、グローバル変数影響表47から処理が済んでいないレコードを1つ読み出す。ステップS95では、影響特定部22は、ステップS94で読み出されたレコードにおける参照関数の組が、統合影響表48に存在するか否かを判定する。影響特定部22は、参照関数の組が統合影響表48に存在しない場合には、処理をステップS96に進める。一方、影響特定部22は、参照関数の組が統合影響表48に存在する場合には、処理をステップS97に進める。
ステップS96で、影響特定部22は、ステップS94で読み出されたレコードを統合影響表48に追加する。
一方、ステップS97で、影響特定部22は、ステップS94で読み出されたレコードにおける参照関数の組についての、統合影響表48のレコードを特定する。影響特定部22は、特定された統合影響表48のレコードにおける解析影響度に、ステップS94で読み出されたレコードにおける解析影響度を加算する。
ステップS98で、影響特定部22は、ステップS95からステップS97の処理により生成された統合影響表48をストレージ13に格納する。
(図18のステップS86:分割処理)
分割部23は、ステップS85で特定された解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。つまり、分割部23は、統合影響表48における解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。分割の方法は、図2のステップS13の処理と同じである。
実施の形態3.
実施の形態3は、階層的な依存関係を考慮して解析影響度を特定する点が実施の形態1,2と異なる。実施の形態3では、この異なる点を説明し、同一の点については説明を省略する。
実施の形態3では、実施の形態1に機能を追加した場合を説明する。しかし、実施の形態2又は変形例4に機能を追加することも可能である。
図21に示すように、関数31の間の依存関係が階層的になっている場合がある。例えば、図21では、FuncAとFuncBとは、FuncAが依存元であり、FuncBが依存先である。また、FuncBとFuncCとは、FuncBが依存元であり、FuncCが依存先である。つまり、FuncAの依存先であるFuncBは、FuncCの依存元である。
この場合、FuncAとFuncBとが別々の分割コード32に分割されると、FuncBだけでなく、FuncCにも影響が及ぶ可能性がある。そこで、影響特定部22は、階層的な依存関係を考慮して、2つの関数の間の解析影響度を特定する。
***動作の説明***
図22及び図23を参照して、実施の形態3に係るソースコード分割装置10の動作を説明する。
ステップS101からステップS102の処理は、図2のステップS11からステップS12の処理と同じである。
(図22のステップS103:階層影響度特定処理)
影響特定部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未満の係数を乗じた上で、解析影響度と階層影響度とを合計して新たな解析影響度してもよい。
図21の例では、実施の形態1で説明した方法であれば、FuncAとFuncBとの間の解析影響度と、FuncAとFuncCとの間の解析影響度とは、同じ16であった。しかし、階層的な依存関係を考慮した結果、FuncAとFuncBとの間の解析影響度は32になり、FuncAとFuncCとの間の解析影響度は17になる。
(図22のステップS104:分割処理)
分割部23は、ステップS103で特定された新たな解析影響度に基づき、ソースコード30を複数の分割コード32に分割する。分割の方法は、図2のステップS13の処理と同じである。
***実施の形態3の効果***
以上のように、実施の形態3に係るソースコード分割装置10は、階層的な依存関係を考慮して解析影響度を特定する。これにより、より適切に解析影響度を特定することができる。その結果、より適切にソースコード30を分割することができる。
実施の形態4.
実施の形態4は、引数の引き渡し先の関数31の処理における引数の利用状況を考慮して解析影響度を特定する点が実施の形態1と異なる。実施の形態4では、この異なる点を説明し、同一の点は説明を省略する。
引数の引き渡し先の関数31では、引数を利用して様々な処理が行われる。引数が1度だけ参照される場合もあれば、引数が複数回参照される場合もある。また、引数が代入されるだけの場合もあれば、引数が処理の分岐条件に利用される場合もある。このような引数の利用状況の違いにより、同じ情報量の引数が引き渡されていたとしても、解析影響度は異なる。そこで、影響特定部22は、引数の引き渡し先の関数31における引数の利用状況を考慮して解析影響度を特定する。
***動作の説明***
図24及び図25を参照して、実施の形態4に係るソースコード分割装置10の動作を説明する。
ステップ111からステップS112の処理は、図2のステップS11からステップS12の処理と同じである。
(図24のステップS113:利用影響度特定処理)
影響特定部22は、対象の2つの関数31の間で引き渡された情報の参照回数と、対象の2つの関数31の間で引き渡された情報を用いた処理内容との少なくともいずれかに基づき、対象の2つの関数31の間の解析影響度として特定する。
具体的には、参照回数を考慮して解析影響度を特定する場合には、影響特定部22は、引数の引き渡し先の関数31における引数の参照回数を特定する。そして、影響特定部22は、ステップS112で特定された解析影響度に参照回数を乗じて、新たな解析影響度とする。
また、処理内容を考慮して解析影響度を特定する場合には、影響特定部22は、引数の引き渡し先の関数31における引数を用いた処理内容を特定する。そして、影響特定部22は、ステップS112で特定された解析影響度に、処理内容毎に事前に定められた係数を乗じて、新たな解析影響度とする。図25では、値代入の場合には係数1、分岐条件の場合には係数2と定義した処理方法表49を用いている。
参照回数と処理内容との両方を考慮して解析影響度を特定する場合には、影響特定部22は、ステップS112で特定された解析影響度に参照回数と処理内容毎に事前に定められた係数とを乗じて、新たな解析影響度とする。
***実施の形態4の効果***
以上のように、実施の形態4に係るソースコード分割装置10は、引数の引き渡し先の関数31の処理における引数の利用状況を考慮して解析影響度を特定する。これにより、より適切に解析影響度を特定することができる。その結果、より適切にソースコード30を分割することができる。
実施の形態5.
実施の形態5では、実施の形態1〜4のいずれかで説明したソースコード分割装置10により生成された複数の分割コード32を解析するソースコード解析装置50について説明する。
***構成の説明***
図26を参照して、実施の形態5に係るソースコード解析装置50の構成を説明する。
ソースコード解析装置50は、コンピュータである。
ソースコード解析装置50は、プロセッサ51と、メモリ52と、ストレージ53と、通信インタフェース54とのハードウェアを備える。プロセッサ51は、信号線を介して他のハードウェアと接続され、これら他のハードウェアを制御する。
プロセッサ51は、プロセッシングを行うICである。プロセッサ51は、具体例としては、CPU、DSP、GPUである。
メモリ52は、データを一時的に記憶する記憶装置である。メモリ52は、具体例としては、SRAM、DRAMである。
ストレージ53は、データを保管する記憶装置である。ストレージ53は、具体例としては、HDDである。また、ストレージ53は、SD(登録商標)メモリカード、CF(登録商標)、NANDフラッシュ、フレキシブルディスク、光ディスク、コンパクトディスク、ブルーレイ(登録商標)ディスク、DVDといった可搬記録媒体であってもよい。
通信インタフェース54は、外部の装置と通信するためのインタフェースである。通信インタフェース54は、具体例としては、Ethernet(登録商標)、USB、HDMI(登録商標)のポートである。
ソースコード解析装置50は、機能構成要素として、参照特定部61と、構造特定部62と、情報取得部63と、解析部64と、情報格納部65とを備える。ソースコード解析装置50の各機能構成要素の機能はソフトウェアにより実現される。
ストレージ53には、ソースコード解析装置50の各機能構成要素の機能を実現するプログラムが格納されている。このプログラムは、プロセッサ51によりメモリ52に読み込まれ、プロセッサ51によって実行される。これにより、ソースコード解析装置50の各機能構成要素の機能が実現される。
また、ストレージ53には、参照関係テーブル531と、解析情報テーブル532とが記憶される。
図26では、プロセッサ51は、1つだけ示されていた。しかし、プロセッサ51は、複数であってもよく、複数のプロセッサ51が、各機能を実現するプログラムを連携して実行してもよい。
図27を参照して、実施の形態5に係る参照関係テーブル531の構成を説明する。
参照関係テーブル531は、関数名又はグローバル変数名が設定される名称をkeyとし、参照関数と被参照関数とをバリューとして持つテーブルである。
図28を参照して、実施の形態5に係る解析情報テーブル532の構成を説明する。
解析情報テーブル532は、関数名又はグローバル変数名が設定される名称をkeyとし、引数の値範囲と、戻り値又はグローバル変数の値範囲と、解析結果とをバリューとして持つテーブルである。引数の値範囲には、引数名と、最小値minと、最大値MAXとが含まれる。戻り値又はグローバル変数の値範囲には、最小値minと、最大値MAXとが含まれる。解析結果には、行数と、結果とが含まれる。
解析結果に含まれる結果としては、安全と、危険と、未証明とがある。安全は、どのような値に対しても該当の行の処理が不具合を起こさないことを意味する。危険は、どのような値に対しても該当の行の処理が不具合を起こすことを意味する。未証明は、値によって該当の行の処理が不具合を起こすことを意味する。
ソースコード30を分割すると、参照する関数と参照される関数との情報が抜けてしまう可能性がある。この場合、関数の引数と戻り値との値の範囲が不明になってしまう。値の範囲が不明の場合には、型によって特定される最小値から最大値までの値により解析を行う。その結果、解析結果に含まれる結果として未証明となる行が増えてしまう。ここでは、未証明となる行が増えてしまうことを、解析精度の低下と呼ぶ。
実施の形態1〜4のいずれかで説明したソースコード分割装置10と、ソースコード解析装置50とを備えるシステムを、ソースコード解析システムと呼ぶ。なお、実施の形態1〜4のいずれかで説明したソースコード分割装置10と、ソースコード解析装置50とは、1つのコンピュータによって実現されてもよい。つまり、ソースコード解析システムは、1つのコンピュータによって実現されてもよい。
***動作の説明***
図29から図38を参照して、実施の形態5に係るソースコード解析装置50の動作を説明する。
実施の形態5に係るソースコード解析装置50の動作は、実施の形態5に係るソースコード解析方法に相当する。また、実施の形態5に係るソースコード解析装置50の動作は、実施の形態5に係るソースコード解析プログラムの処理に相当する。
以下の説明では、図29に示すように、ソースコード分割装置10によってソースコード30が分割コード32Aと分割コード32Bとに分割された場合を想定する。そして、分割コード32Bに対する解析が実行済の状態を想定する。
実施の形態5に係るソースコード解析装置50の前処理を説明する。
前処理は、以下で説明するソースコード解析装置50の全体的な動作の前に実行される処理である。
前処理では、参照特定部61は、ソースコード30で定義されている関数とグローバル変数とについて、参照関数及び被参照関数を特定して、参照関係テーブル531に書き込む。
図30及び図31を参照して、実施の形態5に係る参照特定処理を説明する。
ステップS121で、参照特定部61は、通信インタフェース54を介して分析対象のソースコード30の入力を受け付ける。参照特定部61は、ソースコード30に定義されている全ての関数名とグローバル変数名とを抽出する。参照特定部61は、抽出された関数名及びグローバル変数名を、参照関係テーブル531の名称の欄に書き込む。
参照特定部61は、ステップS122からステップS127の処理を、参照関係テーブル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を書き込む。
図29に示すソースコード30を入力として参照特定処理が実行されると、図31に示すように参照関係テーブル531が生成される。図31に示す参照関係テーブル531は、ソースコード30で定義されている関数であるfuncAと、funcBと、funcCと、funcDと、グローバル変数であるg_valAとがkeyとなっている。また、これらの関数及びグローバル変数についての、参照関数及び被参照関数が特定され、バリューとなっている。
図32を参照して、実施の形態5に係るソースコード解析装置50の全体的な動作を説明する。
(図32のステップS131:コード取得処理)
構造特定部62は、ソースコード30を分割して生成された複数の分割コード32のうち、解析の処理対象とする分割コード32を取得する。
(図32のステップS132:構造特定処理)
構造特定部62は、参照関係テーブル531を参照して、ステップS131で取得された処理対象の分割コード32についての参照関係を特定する。構造特定部62は、特定された参照関係を示す部分参照関係テーブル533を生成して、メモリ52に書き込む。部分参照関係テーブル533の構成は、参照関係テーブル531の構成と同じである。
図33及び図34を参照して、実施の形態5に係る構造特定処理を説明する。
ステップS141で、構造特定部62は、処理対象の分割コード32に定義されている全ての関数名とグローバル変数名とを抽出する。構造特定部62は、抽出された関数名及びグローバル変数名を、部分参照関係テーブル533の名称の欄に書き込む。
構造特定部62は、ステップS142からステップS144の処理を、部分参照関係テーブル533の名称の欄に設定された各要素(関数名及びグローバル変数名)を対象として実行する。
ステップS142で、構造特定部62は、部分参照関係テーブル533から対象とする要素を読み出す。ここでは、読み出された要素を要素Aとする。ステップS143で、構造特定部62は、参照関係テーブル531から要素Aをkeyとする全てのバリューを読み出す。ここでは、読み出されたバリューをバリューBとする。ステップS144で、構造特定部62は、部分参照関係テーブル533における要素AをkeyとするレコードのバリューにバリューBを書き込む。
図29に示す分割コード32Aを入力として構造特定処理が実行されると、図34に示すように部分参照関係テーブル533が生成される。図34に示す部分参照関係テーブル533は、分割コード32Aで定義されている関数であるfuncAと、funcBと、グローバル変数であるg_valAとがkeyとなっている。また、これらの関数及びグローバル変数についての、参照関数及び被参照関数が特定され、バリューとなっている。なお、参照関係テーブル531を参照して部分参照関係テーブル533が生成されるため、分割コード32Aに現れないfuncDの情報を部分参照関係テーブル533に含めることが可能である。
(図32のステップS133:情報取得処理)
情報取得部63は、解析情報テーブル532を参照して、ステップS131で取得された処理対象の分割コード32に関連する変数の取り得る範囲を示す値範囲情報を取得する。情報取得部63は、取得された解析情報を示す部分解析情報テーブル534を生成して、メモリ52に書き込む。部分解析情報テーブル534の構成は、解析情報テーブル532の構成と同じである。
図35及び図36を参照して、実施の形態5に係る情報取得処理を説明する。
ステップS151で、情報取得部63は、ステップS132で生成された部分参照関係テーブル533に含まれる全ての関数名及びグローバル変数名を抽出する。情報取得部63は、抽出された関数名及びグローバル変数名を、部分解析情報テーブル534の名称の欄に書き込む。
情報取得部63は、ステップS152からステップS154の処理を、部分解析情報テーブル534の名称の欄に設定された各要素(関数名及びグローバル変数名)を対象として実行する。
ステップS152で、情報取得部63は、部分解析情報テーブル534から対象とする要素を読み出す。ここでは、読み出された要素を要素Aとする。ステップS153で、情報取得部63は、解析情報テーブル532から要素Aをkeyとする全てのバリューを読み出す。ここでは、読み出されたバリューをバリューBとする。ステップS154で、情報取得部63は、部分解析情報テーブル534における要素AをkeyとするレコードのバリューにバリューBを書き込む。
図29に示す分割コード32Aを入力として情報取得処理が実行されると、図36に示すように部分解析情報テーブル534が生成される。図36に示す部分解析情報テーブル534は、分割コード32Aに関連する関数であるfuncAと、funcBと、funcCと、funcDと、グローバル変数であるg_valAとがkeyとなっている。また、これらの関数及びグローバル変数についての、引数の値範囲及び戻り値又はグローバル変数の値範囲が特定され、バリューとなっている。
ここでは、上述した通り分割コード32Bに対する解析が実行済の状態であるため、funcAの引数の値の範囲と、funcC及びfuncDの戻り値の範囲とが特定されている。つまり、処理対象の分割コード32Aではない他の分割コード32を解析することにより、処理対象の分割コード32Aだけでは得られない変数の値範囲情報が特定されている。
(図32のステップS134:解析処理)
解析部64は、ステップS132で生成された部分参照関係テーブル533と、ステップS133で生成された部分解析情報テーブル534とを参照して、処理対象の分割コード32を解析する。言い換えると、解析部64は、処理対象の分割コード32を除く複数の分割コードのうちの少なくともいずれかの分割コード32を解析して得られた、ソースコード30における変数の値の取り得る範囲を示す値範囲情報を参照して、処理対象の分割コード32を解析する。
図37及び図38を参照して、実施の形態5に係る解析処理を説明する。
解析部64は、ステップS161からステップS169の処理を、部分参照関係テーブル533の名称の欄に設定された各関数名を対象として実行する。
ステップS161で、解析部64は、部分参照関係テーブル533から対象とする関数名を読み出す。ここでは、読み出された関数名を関数名Aとする。ステップS162で、解析部64は、関数名Aが示す関数と、部分解析情報テーブル534とから、関数名Aが示す関数に関連する引数と戻り値とグローバル変数との各変数の値範囲情報を特定する。
解析部64は、ステップS163からステップS168の処理を関数名Aが示す関数の各行を対象として実行する。解析部64は、関数の1行目から昇順に、処理対象とする行を選択する。
ステップS163で、解析部64は、ステップS162で特定された値範囲情報が示す最小値から最大値まで引数と戻り値とグローバル変数との各変数の値を変化させながら、処理対象の行が安全であるか、危険であるかを判定する。ステップS164で、解析部64は、各変数をどの値とした場合であっても、全て安全と判定された場合には、処理をステップS165に進める。一方、解析部64は、それ以外の場合には、処理をステップS166に進める。ステップS165で、解析部64は、処理対象の行を安全と判定する。
ステップS166で、解析部64は、各変数をどの値とした場合であっても、全て危険と判定された場合には、処理をステップS167に進める。一方、解析部64は、それ以外の場合には、処理をステップS168に進める。ステップS167で、解析部64は、処理対象の行を危険と判定する。ステップS168で、解析部64は、処理対象の行を未証明と判定する。
ステップS169で、解析部64は、ステップS163からステップS168で判定された結果により、部分解析情報テーブル534の解析結果を更新する。また、解析部64は、ステップS162で特定された値範囲情報により、部分解析情報テーブル534の引数の値範囲と、戻り値又はグローバル変数の値範囲とを更新する。
図29に示す分割コード32Aを入力として解析処理が実行されると、図38に示すように部分解析情報テーブル534が更新される。つまり、図36に示す部分解析情報テーブル534では特定されていなかった、funcB及びfuncCの引数の値の範囲と、funcA及びfuncBの戻り値の範囲と、funcA及びfuncBの解析結果とが明らかになる。
なお、処理対象の分割コード32Aだけでは知り得ないfuncAの引数の値範囲と、funcCの戻り値の範囲とを利用して解析がされているため、解析精度の高い、つまり未証明個所の少ない解析結果が得られる。
(図32のステップS135:情報格納処理)
情報格納部65は、ステップS134で得られた部分解析情報テーブル534により、解析情報テーブル532を更新する。これにより、次に、図32に示す処理が実行される際、今回の処理で特定された値範囲情報を利用して解析を行うことが可能になる。
***実施の形態5の効果***
以上のように、実施の形態5に係るソースコード解析装置50は、ソースコード分割装置10によって分割され生成された分割コード32を解析する。そのため、ソースコード30を解析する場合と比較して高速に解析することが可能である。また、実施の形態5に係るソースコード解析装置50は、他の分割コード32を解析することにより得られた値範囲情報を利用して解析を行う。そのため、解析精度の高い解析を行うことが可能である。
***他の構成***
<変形例5>
実施の形態5では、各機能構成要素がソフトウェアで実現された。しかし、変形例5として、各機能構成要素はハードウェアで実現されてもよい。この変形例5について、実施の形態5と異なる点を説明する。
図39を参照して、変形例5に係るソースコード解析装置50の構成を説明する。
各機能構成要素がハードウェアで実現される場合には、ソースコード解析装置50は、プロセッサ51とメモリ52とストレージ53とに代えて、電子回路55を備える。電子回路55は、各機能構成要素と、メモリ52と、ストレージ53との機能とを実現する専用の回路である。
電子回路55としては、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックIC、GA(Gate Array)、ASIC(Application Specific Integrated Circuit)、FPGA(Field−Programmable Gate Array)が想定される。
各機能構成要素を1つの電子回路55で実現してもよいし、各機能構成要素を複数の電子回路55に分散させて実現してもよい。
<変形例6>
変形例6として、一部の各機能構成要素がハードウェアで実現され、他の各機能構成要素がソフトウェアで実現されてもよい。
プロセッサ51とメモリ52とストレージ53と電子回路55とを処理回路という。つまり、各機能構成要素の機能は、処理回路により実現される。
実施の形態6.
実施の形態6は、未証明の行だけを解析する点が実施の形態5と異なる。実施の形態6では、この異なる点を説明し、同一の点については説明を省略する。
***動作の説明***
図40を参照して、実施の形態6に係る解析処理を説明する。
ステップS171からステップS172の処理は、図37のステップS161からステップS162の処理と同じである。ステップS173で、解析部64は、処理対象の行について、判定済か否かを判定する。つまり、解析部64は、安全又は危険との判定結果が得られているか否かを判定する。解析部64は、安全又は危険との判定結果が得られている場合には、既に判定済であるとして、行をインクリメントして次の行を処理対象にする。一方、解析部64は、安全又は危険との判定結果が得られていない場合には、判定済でないとして、処理をステップS174に進める。
ステップS174からステップS180の処理は、図37のステップS163からステップS169の処理と同じである。
以上のように、実施の形態6に係るソースコード解析装置50は、未証明の行だけを解析する。そのため、実施の形態5に係るソースコード解析装置50に比べ、高速に解析を行うことが可能である。
実施の形態7.
実施の形態7は、ソースコード30全体の解析精度が指定された精度に達するまで、処理を繰り返し実行する点が実施の形態5,6と異なる。実施の形態7では、この異なる点を説明し、同一の点については説明を省略する。
実施の形態7では、実施の形態5に機能を追加した場合を説明する。しかし、実施の形態6に機能を追加することも可能である。
***構成の説明***
図41を参照して、実施の形態7に係るソースコード解析装置50の構成を説明する。
ソースコード解析装置50は、精度指定部66を備える点が図26に示すソースコード解析装置50と異なる。
図42を参照して、実施の形態7に係る解析情報テーブル532の構成を説明する。
解析情報テーブル532は、バリューとして解析精度を含む点が図27に示す解析情報テーブル532と異なる。解析精度は、関数毎に計算される。解析精度(%)は、(安全又は危険と判定された行数)/(関数の全ての行数)×100によって計算される。
***動作の説明***
図43を参照して、実施の形態7に係るソースコード解析装置50の全体的な動作を説明する。
(図43のステップS181:精度指定処理)
精度指定部66は、基準精度の指定を受け付ける。
具体的には、精度指定部66は、通信インタフェース54を介して接続された入力装置を利用者が操作することによって入力された精度を基準精度として受け付ける。
(図43のステップS182:精度判定処理)
精度指定部66は、ソースコード30の全体の解析精度がステップS181で受け付けられた基準精度以上であるか否かを判定する。精度指定部66は、解析精度が基準精度以上である場合には、処理を終了する。一方、精度指定部66は、解析精度が基準精度未満である場合には、処理をステップS183に進める。
ソースコード30の全体の解析精度は、ソースコード30の全ての関数の解析精度の平均値であってもよいし、安全又は危険と判定されたソースコード30の行数/ソースコード30の全ての行数×100によって計算されてもよい。
ステップS183からステップS187の処理は、図32のステップS131からステップS135の処理と同じである。
つまり、解析精度が基準精度未満である場合には、ステップS183で新たな分割コード32が解析の処理対象として受け付けられ、解析が継続される。
以上のように、実施の形態7に係るソースコード解析装置50は、ソースコード30全体の解析精度が指定された精度に達するまで、新たな分割コード32を対象として処理を繰り返し実行する。そのため、手動で解析を繰り返す手間を削減することが可能である。
実施の形態8.
実施の形態8は、指定されたモジュールの解析精度が指定された精度に達するまで、処理を繰り返し実行する点が実施の形態7と異なる。実施の形態8では、この異なる点を説明し、同一の点については説明を省略する。
***動作の説明***
図44を参照して、実施の形態8に係るソースコード解析装置50の全体的な動作を説明する。
(図44のステップS191:精度指定処理)
精度指定部66は、モジュールの指定及び基準精度の指定を受け付ける。
具体的には、精度指定部66は、通信インタフェース54を介して接続された入力装置を利用者が操作することによって入力されたモジュールを指定モジュールとし、精度を基準精度として受け付ける。
(図44のステップS192:精度判定処理)
精度指定部66は、ステップS191で受け付けられた指定モジュールの解析精度がステップS191で受け付けられた基準精度以上であるか否かを判定する。精度指定部66は、解析精度が基準精度以上である場合には、処理を終了する。一方、精度指定部66は、解析精度が基準精度未満である場合には、処理をステップS193に進める。
モジュールは、1つ以上の関数である。指定モジュールが複数の関数を含む場合には、指定モジュールの解析精度は、指定モジュールに含まれる全ての関数の解析精度の平均値であってもよいし、安全又は危険と判定された指定モジュールの行数/指定モジュールの全ての行数×100によって計算されてもよい。
ステップS193からステップS197の処理は、図43のステップS183からステップS187の処理と同じである。
つまり、指定モジュールの解析精度が基準精度未満である場合には、ステップS193で新たな分割コード32が解析の処理対象として受け付けられ、解析が継続される。
以上のように、実施の形態8に係るソースコード解析装置50は、指定モジュールの解析精度が指定された精度に達するまで、新たな分割コード32を対象として処理を繰り返し実行する。そのため、手動で解析を繰り返す手間を削減することが可能である。
10 ソースコード分割装置、11 プロセッサ、12 メモリ、13 ストレージ、14 通信インタフェース、15 電子回路、21 依存特定部、22 影響特定部、23 分割部、24 グローバル変数特定部、30 ソースコード、31 関数、32 分割コード、41 宣言型ビット数表、42 引数情報表、43 引数影響表、44 グラフ、45 分割表、46 グローバル変数表、47 グローバル変数影響表、48 統合影響表、49 処理方法表。

Claims (15)

  1. ソースコードに含まれる2つの関数それぞれを対象として、対象の2つの関数の間で引き渡される情報量により、前記対象の2つの関数を別々の分割コードに分割した場合における前記ソースコードの解析精度に対する影響度を、前記対象の2つの関数の間の解析影響度として特定する影響特定部と、
    前記影響特定部によって特定された前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割する分割部と
    を備えるソースコード分割装置。
  2. 前記2つの関数の間で引き渡される情報量は、2つの関数の間の引数と戻り値との少なくともいずれかのビット数である
    請求項1に記載のソースコード分割装置。
  3. 前記分割部は、別々の分割コードになった関数の間の前記解析影響度の合計値が小さくなるように、前記ソースコードを指定された数の分割コードに分割する
    請求項1又は2に記載のソースコード分割装置。
  4. 前記2つの関数の間で引き渡される情報量は、前記対象の2つの関数が共通して参照するグローバル変数のビット数である
    請求項1から3までのいずれか1項に記載のソースコード分割装置。
  5. 前記影響特定部は、前記対象の2つの関数のうち呼び出される関数と、前記呼び出される関数が呼び出す他の関数との間の前記解析精度に対する影響度である階層影響度と、前記解析影響度とに基づき、前記対象の2つの関数の間の新たな解析影響度を特定する
    請求項1から4までのいずれか1項に記載のソースコード分割装置。
  6. 前記影響特定部は、前記対象の2つの関数の間で引き渡された情報の参照回数と、前記解析影響度とに基づき、前記対象の2つの関数の間の新たな解析影響度特定する
    請求項1から5までのいずれか1項に記載のソースコード分割装置。
  7. 前記影響特定部は、前記対象の2つの関数の間で引き渡された情報を用いた処理内容と、前記解析影響度とに基づき、前記対象の2つの関数の間の新たな解析影響度特定する請求項1から6までのいずれか1項に記載のソースコード分割装置。
  8. 請求項1から7までのいずれか1項に記載のソースコード分割装置における前記分割部によって分割された前記複数の分割コードのうちのいずれかの分割コードを処理対象の分割コードとして、前記処理対象の分割コードを除く前記複数の分割コードのうちの少なくともいずれかの分割コードを解析して得られた、前記ソースコードにおける変数の取り得る範囲を示す値範囲情報を参照して、前記処理対象の分割コードを解析する解析部
    を備えるソースコード解析装置。
  9. 前記値範囲情報は、前記ソースコードに含まれる関数の引数及び戻り値と、前記ソースコードに含まれるグローバル変数との値の取り得る範囲を示す
    請求項8に記載のソースコード解析装置。
  10. 前記解析部は、前記処理対象の分割コードの各行について安全か危険かの解析を行う
    請求項8又は9に記載のソースコード解析装置。
  11. 前記解析部は、前記処理対象の分割コードのうち、安全か危険かの解析結果が得られていない行についてのみ安全か危険かの解析を行う
    請求項10に記載のソースコード解析装置。
  12. 前記解析部は、前記ソースコードの全ての行に対する前記解析の結果が得られている行の割合が基準精度以上になるまで、前記複数の分割コードのうちのいずれかの分割コードを処理対象の分割コードとして解析する処理を繰り返す
    請求項10又は11に記載のソースコード解析装置。
  13. 前記解析部は、前記ソースコードに含まれる対象の関数の全ての行に対する前記解析の結果が得られている行の割合が基準精度以上になるまで、前記複数の分割コードのうちのいずれかの分割コードを処理対象の分割コードとして解析する処理を繰り返す
    請求項10又は11に記載のソースコード解析装置。
  14. コンピュータが、ソースコードに含まれる2つの関数それぞれを対象として、対象の2つの関数の間で引き渡される情報量により、前記対象の2つの関数を別々の分割コードに分割した場合における前記ソースコードの解析に対する影響度を、前記対象の2つの関数の間の解析影響度として特定し、
    コンピュータが、前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割するソースコード分割方法。
  15. ソースコードに含まれる2つの関数それぞれを対象として、対象の2つの関数の間で引き渡される情報量により、前記対象の2つの関数を別々の分割コードに分割した場合における前記ソースコードの解析に対する影響度を、前記対象の2つの関数の間の解析影響度として特定する影響特定処理と、
    前記影響特定処理によって特定された前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割する分割処理と
    をコンピュータの実行させるソースコード分割プログラム。
JP2019556148A 2017-11-21 2018-10-25 ソースコード分割装置、ソースコード解析装置、ソースコード分割方法及びソースコード分割プログラム Active JP6739667B2 (ja)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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

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