(57)【要約】  ソースコードを分割することによる解析精度が低下する程度を小さくできるようにする。影響特定部（２２）は、ソースコードに含まれる２つの関数それぞれを対象として、対象の２つの関数の間で引き渡される情報量により、対象の２つの関数を別々の分割コードに分割した場合におけるソースコードの解析に対する影響度を、対象の２つの関数の間の解析影響度として特定する。分割部（２３）は、別々の分割コードになった関数の間の解析影響度の合計が小さくなるように、ソースコードを複数の分割コードに分割する。
2019102786.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードに含まれる２つの関数それぞれを対象として、対象の２つの関数の間で引き渡される情報量により、前記対象の２つの関数を別々の分割コードに分割した場合における前記ソースコードの解析精度に対する影響度を、前記対象の２つの関数の間の解析影響度として特定する影響特定部と、
前記影響特定部によって特定された前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割する分割部と
を備えるソースコード分割装置。
【請求項２】
前記２つの関数の間で引き渡される情報量は、２つの関数の間の引数と戻り値との少なくともいずれかのビット数である
請求項１に記載のソースコード分割装置。
【請求項３】
前記分割部は、別々の分割コードになった関数の間の前記解析影響度の合計値が小さくなるように、前記ソースコードを指定された数の分割コードに分割する
請求項１又は２に記載のソースコード分割装置。
【請求項４】
前記２つの関数の間で引き渡される情報量は、前記対象の２つの関数が共通して参照するグローバル変数のビット数である
請求項１から３までのいずれか１項に記載のソースコード分割装置。
【請求項５】
前記影響特定部は、前記対象の２つの関数のうち呼び出される関数と、他の関数との間の解析影響度に基づき、前記対象の２つの関数の間の前記解析影響度を特定する
請求項１から４までのいずれか１項に記載のソースコード分割装置。
【請求項６】
前記影響特定部は、前記対象の２つの関数の間で引き渡された情報の参照回数に基づき、前記対象の２つの関数の間の解析影響度として特定する
請求項１から５までのいずれか１項に記載のソースコード分割装置。
【請求項７】
前記影響特定部は、前記対象の２つの関数の間で引き渡された情報を用いた処理内容に基づき、前記対象の２つの関数の間の解析影響度として特定する
請求項１から６までのいずれか１項に記載のソースコード分割装置。
【請求項８】
請求項１から７までのいずれか１項に記載のソースコード分割装置における前記分割部によって分割された前記複数の分割コードのうちのいずれかの分割コードを処理対象の分割コードとして、前記処理対象の分割コードを除く前記複数の分割コードのうちの少なくともいずれかの分割コードを解析して得られた、前記ソースコードにおける変数の取り得る範囲を示す値範囲情報を参照して、前記処理対象の分割コードを解析する解析部
を備えるソースコード解析装置。
【請求項９】
前記値範囲情報は、前記ソースコードに含まれる関数の引数及び戻り値と、前記ソースコードに含まれるグローバル変数との値の取り得る範囲を示す
請求項８に記載のソースコード解析装置。
【請求項１０】
前記解析部は、前記処理対象の分割コードの各行について安全か危険かの解析を行う
請求項８又は９に記載のソースコード解析装置。
【請求項１１】
前記解析部は、前記処理対象の分割コードのうち、安全か危険かの解析結果が得られていない行についてのみ安全か危険かの解析を行う
請求項１０に記載のソースコード解析装置。
【請求項１２】
前記解析部は、前記ソースコードの全ての行に対する前記解析の結果が得られている行の割合が基準精度以上になるまで、前記複数の分割コードのうちのいずれかの分割コードを処理対象の分割コードとして解析する処理を繰り返す
請求項１０又は１１に記載のソースコード解析装置。
【請求項１３】
前記解析部は、前記ソースコードに含まれる対象の関数の全ての行に対する前記解析の結果が得られている行の割合が基準精度以上になるまで、前記複数の分割コードのうちのいずれかの分割コードを処理対象の分割コードとして解析する処理を繰り返す
請求項１０又は１１に記載のソースコード解析装置。
【請求項１４】
コンピュータが、ソースコードに含まれる２つの関数それぞれを対象として、対象の２つの関数の間で引き渡される情報量により、前記対象の２つの関数を別々の分割コードに分割した場合における前記ソースコードの解析に対する影響度を、前記対象の２つの関数の間の解析影響度として特定し、
コンピュータが、前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割するソースコード分割方法。
【請求項１５】
ソースコードに含まれる２つの関数それぞれを対象として、対象の２つの関数の間で引き渡される情報量により、前記対象の２つの関数を別々の分割コードに分割した場合における前記ソースコードの解析に対する影響度を、前記対象の２つの関数の間の解析影響度として特定する影響特定処理と、
前記影響特定処理によって特定された前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割する分割処理と
をコンピュータの実行させるソースコード分割プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、コンピュータシステムにおけるソースコードの分割技術に関する。
【背景技術】
【０００２】
開発するソフトウェア規模の増大に伴い、ソフトウェアの構成が理解しづらくなっている。そのため、ソフトウェアにおける変更箇所の影響範囲を把握しきれないといった危険度が大きくなっている。この危険度を小さくするため、ソースコード解析ツールを用いてエラー箇所を検出し、効率的に不具合を検出することが行われている。【０００３】
ソースコード解析ツールとしては、関数の引数及びグローバル変数といったパラメータを指定することで、ランタイムエラーを検出することができる動的解析ツールが知られている。
しかし、全てのソースコードを一度に解析すると、解析対象のソフトウェア規模が大きすぎるために解析できない、又は、解析が長時間に及ぶ場合がある。この場合には、解析対象の巨大なソースコードが解析可能なソフトウェア部品に分割され、ソフトウェア部品毎に解析が行われる。【０００４】
特許文献１には、ソフトウェア部品のメトリクス情報と、ソフトウェア部品間の依存関係の数とを用いてソースコードを分割する箇所を判断する技術が開示されている。これにより、特許文献１では、解析対象とするソースコードの複雑度を低減し、解析可能なソフトウェア部品に分割している。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１７−１１７４４９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ソースコードを分割した場合には、分割後のソフトウェア部品間の依存関係が欠落するために、解析精度が低下してしまう。
この発明では、ソースコードを分割することによる解析精度が低下する程度を小さくできるようにすることを目的とする。
【課題を解決するための手段】
【０００７】
この発明に係るソースコード分割装置は、
ソースコードに含まれる２つの関数それぞれを対象として、対象の２つの関数の間で引き渡される情報量により、前記対象の２つの関数を別々の分割コードに分割した場合における前記ソースコードの解析に対する影響度を、前記対象の２つの関数の間の解析影響度として特定する影響特定部と、
前記影響特定部によって特定された前記解析影響度に基づき、前記ソースコードを複数の分割コードに分割する分割部と
を備える。
【発明の効果】
【０００８】
この発明は、関数の間で引き渡される情報量により関数の間の解析影響度を特定し、特定された解析影響度に基づきソースコードを複数の分割コードに分割する。これにより、ソースコードを分割することによる解析精度が低下する程度を小さくすることが可能である。
【図面の簡単な説明】
【０００９】
【図１】実施の形態１に係るソースコード分割装置１０の構成図。
【図２】実施の形態１に係るソースコード分割装置１０の全体的な動作を示すフローチャート。
【図３】実施の形態１に係る依存特定処理のフローチャート。
【図４】実施の形態１に係る依存特定処理の説明図。
【図５】実施の形態１に係る影響特定処理のフローチャート。
【図６】実施の形態１に係る影響特定処理の説明図。
【図７】実施の形態１に係る分割処理のフローチャート。
【図８】実施の形態１に係る分割処理の説明図。
【図９】実施の形態１の効果の説明図。
【図１０】変形例２に係るソースコード分割装置１０の構成図。
【図１１】実施の形態２に係るソースコード分割装置１０の構成図。
【図１２】実施の形態２に係るソースコード分割装置１０の全体的な動作を示すフローチャート。
【図１３】実施の形態２に係るグローバル変数特定処理のフローチャート。
【図１４】実施の形態２に係るグローバル変数特定処理の説明図。
【図１５】実施の形態２に係る影響特定処理のフローチャート。
【図１６】実施の形態２に係る影響特定処理の説明図。
【図１７】変形例４に係るソースコード分割装置１０の構成図。
【図１８】変形例４に係るソースコード分割装置１０の全体的な動作を示すフローチャート。
【図１９】変形例４に係る影響統合処理のフローチャート。
【図２０】変形例４に係る影響統合処理の説明図。
【図２１】実施の形態３に係る関数３１の間の依存関係が階層的になっている場合の説明図。
【図２２】実施の形態３に係るソースコード分割装置１０の全体的な動作を示すフローチャート。
【図２３】実施の形態３に係る引数影響表４３を示す図。
【図２４】実施の形態４に係るソースコード分割装置１０の全体的な動作を示すフローチャート。
【図２５】実施の形態４に係る利用影響度特定処理の説明図。
【図２６】実施の形態５に係るソースコード解析装置５０の構成図。
【図２７】実施の形態５に係る参照関係テーブル５３１の構成図。
【図２８】実施の形態５に係る解析情報テーブル５３２の構成図。
【図２９】実施の形態５に係るソースコード３０及び分割コード３２の例を示す図。
【図３０】実施の形態５に係る参照特定処理のフローチャート。
【図３１】実施の形態５に係る参照特定処理の説明図。
【図３２】実施の形態５に係るソースコード解析装置５０の全体的な動作を示すフローチャート。
【図３３】実施の形態５に係る構造特定処理のフローチャート。
【図３４】実施の形態５に係る構造特定処理の説明図。
【図３５】実施の形態５に係る情報取得処理のフローチャート。
【図３６】実施の形態５に係る情報取得処理の説明図。
【図３７】実施の形態５に係る解析処理のフローチャート。
【図３８】実施の形態５に係る解析処理の説明図。
【図３９】変形例５に係るソースコード解析装置５０の構成図。
【図４０】実施の形態６に係る解析処理のフローチャート。
【図４１】実施の形態７に係るソースコード解析装置５０の構成図。
【図４２】実施の形態７に係る解析情報テーブル５３２の構成図。
【図４３】実施の形態７に係るソースコード解析装置５０の全体的な動作を示すフローチャート。
【図４４】実施の形態８に係るソースコード解析装置５０の全体的な動作を示すフローチャート。
【発明を実施するための形態】
【００１０】
実施の形態１．
＊＊＊構成の説明＊＊＊
図１を参照して、実施の形態１に係るソースコード分割装置１０の構成を説明する。
ソースコード分割装置１０は、コンピュータである。
ソースコード分割装置１０は、プロセッサ１１と、メモリ１２と、ストレージ１３と、通信インタフェース１４とのハードウェアを備える。プロセッサ１１は、信号線を介して他のハードウェアと接続され、これら他のハードウェアを制御する。
【００１１】
プロセッサ１１は、プロセッシングを行うＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）である。プロセッサ１１は、具体例としては、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）、ＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。
【００１２】
メモリ１２は、データを一時的に記憶する記憶装置である。メモリ１２は、具体例としては、ＳＲＡＭ（Ｓｔａｔｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。
【００１３】
ストレージ１３は、データを保管する記憶装置である。ストレージ１３は、具体例としては、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）である。また、ストレージ１３は、ＳＤ（登録商標，Ｓｅｃｕｒｅ  Ｄｉｇｉｔａｌ）メモリカード、ＣＦ（ＣｏｍｐａｃｔＦｌａｓｈ，登録商標）、ＮＡＮＤフラッシュ、フレキシブルディスク、光ディスク、コンパクトディスク、ブルーレイ（登録商標）ディスク、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋ）といった可搬記録媒体であってもよい。
【００１４】
通信インタフェース１４は、外部の装置と通信するためのインタフェースである。通信インタフェース１４は、具体例としては、Ｅｔｈｅｒｎｅｔ（登録商標）、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）、ＨＤＭＩ（登録商標，Ｈｉｇｈ−Ｄｅｆｉｎｉｔｉｏｎ  Ｍｕｌｔｉｍｅｄｉａ  Ｉｎｔｅｒｆａｃｅ）のポートである。
【００１５】
ソースコード分割装置１０は、機能構成要素として、依存特定部２１と、影響特定部２２と、分割部２３とを備える。ソースコード分割装置１０の各機能構成要素の機能はソフトウェアにより実現される。
ストレージ１３には、ソースコード分割装置１０の各機能構成要素の機能を実現するプログラムが格納されている。このプログラムは、プロセッサ１１によりメモリ１２に読み込まれ、プロセッサ１１によって実行される。これにより、ソースコード分割装置１０の各機能構成要素の機能が実現される。
【００１６】
図１では、プロセッサ１１は、１つだけ示されていた。しかし、プロセッサ１１は、複数であってもよく、複数のプロセッサ１１が、各機能を実現するプログラムを連携して実行してもよい。
【００１７】
＊＊＊動作の説明＊＊＊
図２から図８を参照して、実施の形態１に係るソースコード分割装置１０の動作を説明する。
実施の形態１に係るソースコード分割装置１０の動作は、実施の形態１に係るソースコード分割方法に相当する。また、実施の形態１に係るソースコード分割装置１０の動作は、実施の形態１に係るソースコード分割プログラムの処理に相当する。
【００１８】
図２を参照して、実施の形態１に係るソースコード分割装置１０の全体的な動作を説明する。
（図２のステップＳ１１：依存特定処理）
依存特定部２１は、ソースコード３０に含まれる複数の関数３１について、関数３１間の引数の引き渡しに基づき、関数３１間の依存関係を特定する。
【００１９】
図３及び図４を参照して、実施の形態１に係る依存特定処理を説明する。
ステップＳ２１で、依存特定部２１は、通信インタフェース１４を介して分析対象のソースコード３０の入力を受け付ける。
ステップＳ２２で、依存特定部２１は、宣言型ビット数表４１をストレージ１３から読み出す。宣言型ビット数表４１は、変数の型と、その型で使用されるビット数とが対応付けられたデータである。宣言型ビット数表４１は、事前にストレージ１３に格納されているものとする。
【００２０】
ステップＳ２３で、依存特定部２１は、ステップＳ２１で受け付けられたソースコード３０に含まれる全ての引数について処理が済んでいるか否かを判定する。依存特定部２１は、処理を行っていない引数がある場合には、処理をステップＳ２４に進める。一方、依存特定部２１は、全ての引数について処理が済んでいる場合には処理をステップＳ２９に進める。
【００２１】
ステップＳ２４で、依存特定部２１は、ソースコード３０から処理を行っていない引数を１つ抽出して対象の引数とし、対象の引数を引数情報表４２の引数欄に書き込む。ステップＳ２５で、依存特定部２１は、対象の引数の引き渡し元の関数３１を引数情報表４２の依存元欄に書き込む。ステップＳ２６で、依存特定部２１は、対象の引数の引き渡し先の関数３１を引数情報表４２の依存先欄に書き込む。ステップＳ２７で、依存特定部２１は、対象の引数の引き渡し元の関数３１で定義された、対象の引数の型を引数情報表４２の引数型欄に書き込む。ステップＳ２８で、依存特定部２１は、宣言型ビット数表４１を参照して、対象の引数の型で使用されるビット数を特定し、特定されたビット数を引数情報表４２の引数型ビット数欄に書き込む。
例えば、対象の引数が引数ａの場合には、ｍａｉｎが依存元欄に書き込まれ、ＦｕｎｃＡが依存先欄に書き込まれ、ｂｏｏｌが引数型欄に書き込まれ、１が引数型ビット数欄に書き込まれる。
【００２２】
ステップＳ２９で、依存特定部２１は、ステップＳ２４からステップＳ２８の処理により生成された引数情報表４２をストレージ１３に格納する。
【００２３】
（図２のステップＳ１２：影響特定処理）
影響特定部２２は、ソースコード３０に含まれる依存関係のある２つの関数３１それぞれを対象として、対象の２つの関数３１の間で引き渡される情報量により、対象の２つの関数３１の間の解析影響度を特定する。解析影響度は、対象の２つの関数３１を別々の分割コード３２に分割した場合におけるソースコード３０の解析精度に対する影響度である。
【００２４】
図５及び図６を参照して、実施の形態１に係る影響特定処理を説明する。
ステップＳ３１で、影響特定部２２は、ステップＳ１１で生成された引数情報表４２をストレージ１３から読み出す。
【００２５】
ステップＳ３２で、影響特定部２２は、引数情報表４２に含まれる全ての引数について処理が済んでいるか否かを判定する。影響特定部２２は、処理を行っていない引数がある場合には、処理をステップＳ３３に進める。一方、影響特定部２２は、全ての引数について処理が済んでいる場合には処理をステップＳ３７に進める。
【００２６】
ステップＳ３３で、影響特定部２２は、引数情報表４２から処理が済んでいない引数についてのレコードを読み出す。ステップＳ３４で、影響特定部２２は、ステップＳ３３で読み出されたレコードにおける依存元と依存先との組が、引数影響表４３に存在するか否かを判定する。影響特定部２２は、依存元と依存先との組が引数影響表４３に存在しない場合には、処理をステップＳ３５に進める。一方、影響特定部２２は、依存元と依存先との組が引数影響表４３に存在する場合には、処理をステップＳ３６に進める。
【００２７】
ステップＳ３５で、影響特定部２２は、ステップＳ３３で読み出されたレコードにおける依存元と依存先とをそれぞれ、引数影響表４３における依存元と依存先とに書き込む。また、影響特定部２２は、ステップＳ３３で読み出されたレコードにおけるビット数を、引数影響表４３における解析影響度に書き込む。
一方、ステップＳ３６で、影響特定部２２は、ステップＳ３３で読み出されたレコードにおける依存元と依存先との組についての、引数影響表４３のレコードを特定する。影響特定部２２は、特定された引数影響表４３のレコードにおける解析影響度に、ステップＳ３３で読み出されたレコードにおけるビット数を加算する。
その結果、例えば、依存元がｍａｉｎであり、依存先がＦｕｎｃＡである引数影響表４３のレコードの解析影響度は、引数情報表４２に引数ａのレコードのビット数“１”と引数ｂのレコードのビット数“８”とを合計した９になる。引数は、関数間で引き渡される情報であり、引数のビット数は関数間で引き渡される情報量である。そこで、引き渡される引数のビット数の合計が解析影響度とされている。解析影響度が大きいほど、解析精度に与える影響が大きくなる。
【００２８】
ステップＳ３７で、影響特定部２２は、ステップＳ３４からステップＳ３６の処理により生成された引数影響表４３をストレージ１３に格納する。
【００２９】
（図２のステップＳ１３：分割処理）
分割部２３は、ステップＳ１２で特定された解析影響度に基づき、ソースコード３０を複数の分割コード３２に分割する。
【００３０】
図７及び図８を参照して、実施の形態１に係る分割処理を説明する。
ステップＳ４１で、分割部２３は、ステップＳ１２で生成された引数影響表４３をストレージ１３から読み出す。引数影響表４３を参照して、各関数３１をノードとし、依存元のノードから依存先のノードへ矢印を引き、各矢印のコストとして解析影響度を割り当てることにより、グラフ４４を描くことが可能である。
【００３１】
ステップＳ４２で、分割部２３は、最小カット定理を用いて、ソースコード３０を複数の分割コード３２に分割する。これにより、解析影響度の合計が最小となるように、ソースコード３０を複数の分割コード３２に分割することが可能である。
なお、分割部２３は、ソースコード３０をいくつの分割コード３２に分割するかを示す分割数は、通信インタフェース１４を介して指定される、あるいは、事前に設定されているものとする。分割数が３以上の場合には、最小カット定理を用いた分割を繰り返し行えばよい。
【００３２】
ステップＳ４３で、分割部２３は、引数影響表４３に含まれる関数３１を分割表４５に書き込む。そして、分割部２３は、関数３１毎に、属する分割コード３２のグループ書き込む。ステップＳ４４で、分割部２３は、ステップＳ４３で生成された分割表４５を通信インタフェース１４を介して出力する。
【００３３】
＊＊＊実施の形態１の効果＊＊＊
以上のように、実施の形態１に係るソースコード分割装置１０は、関数３１の間で引き渡される情報量により関数３１の間の解析影響度を特定し、特定された解析影響度に基づきソースコード３０を複数の分割コード３２に分割する。これにより、ソースコード３０を分割することによる解析精度が低下する程度を小さくすることが可能である。
【００３４】
図９に示すように、ＦｕｎｃＡとＦｕｎｃＢとの間に依存関係がある場合、ＦｕｎｃＡからＦｕｎｃＢに引数値１０が渡され、ＦｕｎｃＢ内では実行されるｉｆ（ｘ＝＝１０）
ｚ  ＝  ｘ；の行のみが解析対象となる。しかし、ＦｕｎｃＡとＦｕｎｃＢと間の依存関係が欠落すると、ＦｕｎｃＡからＦｕｎｃＢに引数値１０が渡されないため、ＦｕｎｃＢ関数内でｘが不確定値となる。この場合にランタイムエラーを解析するためには、引数ｘの取り得る値の幅（−３２７６８〜３２７６７）分だけパラメータを変更しながら解析を行うことになる。このときに、本来解析対象外であるはずのｉｆ  ｅｌｓｅ（ｘ＝＝２０）  ｚ  ＝  ０；の行も実行されるために解析対象となり、ｚに０が代入されることとなる。
このように、ソースコード３０を複数の分割コード３２に分割する場合に、解析精度が低下する可能性がある。しかし、実施の形態１に係るソースコード分割装置１０は、適切な分割を行うことが可能であるため、ソースコード３０を分割することによる解析精度が低下する程度を小さくすることが可能である。
【００３５】
＊＊＊他の構成＊＊＊
＜変形例１＞
実施の形態１では、２つの関数３１の間で引き渡される引数のビット数を、２つの関数の間で引き渡される情報量とした。しかし、依存先の関数３１から依存元の関数３１へ引き渡される戻り値についても、２つの関数の間で引き渡される情報量としてもよい。つまり、２つの関数の間で引き渡される情報量は、２つの関数の間の引数と戻り値との少なくともいずれかのビット数とすればよい。
【００３６】
＜変形例２＞
実施の形態１では、各機能構成要素がソフトウェアで実現された。しかし、変形例２として、各機能構成要素はハードウェアで実現されてもよい。この変形例２について、実施の形態１と異なる点を説明する。
【００３７】
図１０を参照して、変形例２に係るソースコード分割装置１０の構成を説明する。
各機能構成要素がハードウェアで実現される場合には、ソースコード分割装置１０は、プロセッサ１１とメモリ１２とストレージ１３とに代えて、電子回路１５を備える。電子回路１５は、各機能構成要素と、メモリ１２と、ストレージ１３との機能とを実現する専用の回路である。
【００３８】
電子回路１５としては、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックＩＣ、ＧＡ（Ｇａｔｅ  Ａｒｒａｙ）、ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）、ＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）が想定される。
各機能構成要素を１つの電子回路１５で実現してもよいし、各機能構成要素を複数の電子回路１５に分散させて実現してもよい。
【００３９】
＜変形例３＞
変形例３として、一部の各機能構成要素がハードウェアで実現され、他の各機能構成要素がソフトウェアで実現されてもよい。
【００４０】
プロセッサ１１とメモリ１２とストレージ１３と電子回路１５とを処理回路という。つまり、各機能構成要素の機能は、処理回路により実現される。
【００４１】
実施の形態２．
実施の形態２は、グローバル変数を考慮して解析影響度を特定する点が実施の形態１と異なる。実施の形態２では、この異なる点を説明し、同一の点については説明を省略する。
【００４２】
＊＊＊構成の説明＊＊＊
図１１を参照して、実施の形態２に係るソースコード分割装置１０の構成を説明する。
ソースコード分割装置１０は、依存特定部２１に代えて、グローバル変数特定部２４を備える点が図１に示すソースコード分割装置１０と異なる。
【００４３】
＊＊＊動作の説明＊＊＊
図１２から図１６を参照して、実施の形態２に係るソースコード分割装置１０の動作を説明する。
【００４４】
図１２を参照して、実施の形態２に係るソースコード分割装置１０の全体的な動作を説明する。
（図１２のステップＳ５１：グローバル変数特定処理）
グローバル変数特定部２４は、ソースコード３０に含まれる複数のグローバル変数について、参照する関数３１を特定する。
【００４５】
図１３及び図１４を参照して、実施の形態２に係るグローバル変数特定処理を説明する。
ステップＳ６１で、グローバル変数特定部２４は、通信インタフェース１４を介して分析対象のソースコード３０の入力を受け付ける。ステップＳ２２で、依存特定部２１は、宣言型ビット数表４１をストレージ１３から読み出す。
【００４６】
ステップＳ６３で、グローバル変数特定部２４は、ステップＳ６１で受け付けられたソースコード３０に含まれる全てのグローバル変数について処理が済んでいるか否かを判定する。グローバル変数特定部２４は、処理を行っていないグローバル変数がある場合には、処理をステップＳ６４に進める。一方、グローバル変数特定部２４は、全てのグローバル変数について処理が済んでいる場合には処理をステップＳ６８に進める。
【００４７】
ステップＳ６４で、グローバル変数特定部２４は、ソースコード３０から処理を行っていないグローバル変数を１つ抽出して対象のグローバル変数とし、対象のグローバル変数をグローバル変数表４６のグローバル変数欄に書き込む。ステップＳ６５で、グローバル変数特定部２４は、対象のグローバル変数を参照する関数３１を特定して、グローバル変数表４６の参照関数欄に書き込む。ステップＳ６６で、グローバル変数特定部２４は、対象のグローバル変数の型をグローバル変数表４６の宣言型欄に書き込む。ステップＳ６７で、グローバル変数特定部２４は、宣言型ビット数表４１を参照して、対象のグローバル変数の型で使用されるビット数を特定し、特定されたビット数をグローバル変数表４６の型ビット数欄に書き込む。
【００４８】
ステップＳ６８で、グローバル変数特定部２４は、ステップＳ６４からステップＳ６７の処理により生成されたグローバル変数表４６をストレージ１３に格納する。
【００４９】
（図１２のステップＳ５２：影響特定処理）
影響特定部２２は、対象の２つの関数３１が共通して参照するグローバル変数の情報量により、対象の２つの関数３１の間の解析影響度を特定する。
【００５０】
図１５及び図１６を参照して、実施の形態２に係る影響特定処理を説明する。
ステップＳ７１で、影響特定部２２は、ステップＳ５１で生成されたグローバル変数表４６をストレージ１３から読み出す。
【００５１】
ステップＳ７２で、影響特定部２２は、グローバル変数表４６に含まれる全てのグローバル変数について処理が済んでいるか否かを判定する。影響特定部２２は、処理を行っていないグローバル変数がある場合には、処理をステップＳ７３に進める。一方、影響特定部２２は、全てのグローバル変数について処理が済んでいる場合には処理をステップＳ７８に進める。
【００５２】
ステップＳ７３で、影響特定部２２は、グローバル変数表４６から処理が済んでいないグローバル変数についてのレコードを読み出す。ステップＳ７４で、影響特定部２２は、ステップＳ７３で読み出されたレコードにおいて参照関数に登録されている２つの関数の組を特定する。なお、影響特定部２２は、参照関数に３つ以上の関数が登録されている場合には、２つの関数の各組を特定する。
【００５３】
影響特定部２２は、ステップＳ７４で特定された各組を対象として、ステップＳ７５からステップＳ７７の処理を実行する。
ステップＳ７５で、影響特定部２２は、対象の組がグローバル変数影響表４７に存在するか否かを判定する。影響特定部２２は、依存元と依存先との組がグローバル変数影響表４７に存在しない場合には、処理をステップＳ７６に進める。一方、影響特定部２２は、依存元と依存先との組がグローバル変数影響表４７に存在する場合には、処理をステップＳ７７に進める。
【００５４】
ステップＳ７６で、影響特定部２２は、対象の組の関数３１をそれぞれ、グローバル変数影響表４７における参照関数欄に書き込む。また、影響特定部２２は、ステップＳ７３で読み出されたレコードにおける型ビット数を、グローバル変数影響表４７における解析影響度に書き込む。
一方、ステップＳ７７で、影響特定部２２は、対象の組についての、グローバル変数影響表４７のレコードを特定する。影響特定部２２は、特定されたグローバル変数影響表４７のレコードにおける解析影響度に、ステップＳ７３で読み出されたレコードにおける型ビット数を加算する。
ＦｕｎｃＡとＦｕｎｃＢとでは、ｉｎｔ型のグローバル変数であるｇｌｏｂａｌＡを共通して参照している。そのため、ＦｕｎｃＡとＦｕｎｃＢとでは、ｇｌｏｂａｌＡを介して情報が引き渡されていることになる。したがって、ＦｕｎｃＡとＦｕｎｃＢとの組の解析影響度は、ｉｎｔ型のビット数である１６になる。つまり、ＦｕｎｃＡとＦｕｎｃＢとが別々の分割コード３２に分割された場合には、１６ビット分の情報量が失われ、その分解析精度が低下する。
【００５５】
ステップＳ７８で、影響特定部２２は、ステップＳ７４からステップＳ７７の処理により生成されたグローバル変数影響表４７をストレージ１３に格納する。
【００５６】
（図１２のステップＳ５３：分割処理）
分割部２３は、ステップＳ５２で特定された解析影響度に基づき、ソースコード３０を複数の分割コード３２に分割する。つまり、分割部２３は、グローバル変数影響表４７における解析影響度に基づき、ソースコード３０を複数の分割コード３２に分割する。分割の方法は、図２のステップＳ１３の処理と同じである。
【００５７】
＊＊＊実施の形態２の効果＊＊＊
以上のように、実施の形態２に係るソースコード分割装置１０は、２つの関数３１が共通して参照するグローバル変数の情報量により、２つの関数３１の間で引き渡される情報量を特定した。そして、特定された情報量にから解析影響度を特定し、特定された解析影響度に基づきソースコード３０を複数の分割コード３２に分割する。これにより、ソースコード３０を分割することによる解析精度が低下する程度を小さくすることが可能である。
【００５８】
＊＊＊他の構成＊＊＊
＜変形例４＞
実施の形態２では、２つの関数３１が共通して参照するグローバル変数の情報量により、対象の２つの関数３１の間の解析影響度を特定した。変形例４として、２つの関数３１が共通して参照するグローバル変数の情報量だけでなく、実施の形態１で説明した、対象の２つの関数３１の間で引き渡される情報量も考慮して、解析影響度を特定してもよい。これにより、より適切に解析影響度を特定することができる。その結果、より適切にソースコード３０を分割することができる。
【００５９】
図１７を参照して、変形例４に係るソースコード分割装置１０の構成を説明する。
ソースコード分割装置１０は、図１に示す依存特定部２１と、図１１に示すグローバル変数特定部２４との両方を備える。
【００６０】
図１８を参照して、変形例４に係るソースコード分割装置１０の動作を説明する。
ステップＳ８１からステップＳ８２の処理は、図２のステップＳ１１からステップＳ１２の処理と同じである。また、ステップＳ８３からステップＳ８４の処理は、図１２のステップＳ５１からステップＳ５２の処理と同じである。
【００６１】
（図１８のステップＳ８５：影響統合処理）
影響特定部２２は、ステップＳ８２で特定された解析影響度と、ステップＳ８４で特定された解析影響度とを統合する。
【００６２】
図１９及び図２０を参照して、変形例４に係る影響統合処理を説明する。
ステップＳ９１では、影響特定部２２は、ステップＳ８２の処理で生成された引数影響表４３と、ステップＳ８４の処理で生成されたグローバル変数影響表４７とを、ストレージ１３から読み出す。
ステップＳ９２では、影響特定部２２は、引数影響表４３における全てのレコードを統合影響表４８に追加する。
【００６３】
ステップＳ９３では、影響特定部２２は、グローバル変数影響表４７に含まれる全てのレコードについて処理が済んでいるか否かを判定する。影響特定部２２は、処理を行っていないレコードがある場合には、処理をステップＳ９４に進める。一方、影響特定部２２は、全てのレコードについて処理が済んでいる場合には処理をステップＳ９８に進める。
【００６４】
ステップＳ９４では、影響特定部２２は、グローバル変数影響表４７から処理が済んでいないレコードを１つ読み出す。ステップＳ９５では、影響特定部２２は、ステップＳ９４で読み出されたレコードにおける参照関数の組が、統合影響表４８に存在するか否かを判定する。影響特定部２２は、参照関数の組が統合影響表４８に存在しない場合には、処理をステップＳ９６に進める。一方、影響特定部２２は、参照関数の組が統合影響表４８に存在する場合には、処理をステップＳ９７に進める。
【００６５】
ステップＳ９６で、影響特定部２２は、ステップＳ９４で読み出されたレコードを統合影響表４８に追加する。
一方、ステップＳ９７で、影響特定部２２は、ステップＳ９４で読み出されたレコードにおける参照関数の組についての、統合影響表４８のレコードを特定する。影響特定部２２は、特定された統合影響表４８のレコードにおける解析影響度に、ステップＳ９４で読み出されたレコードにおける解析影響度を加算する。
【００６６】
ステップＳ９８で、影響特定部２２は、ステップＳ９５からステップＳ９７の処理により生成された統合影響表４８をストレージ１３に格納する。
【００６７】
（図１８のステップＳ８６：分割処理）
分割部２３は、ステップＳ８５で特定された解析影響度に基づき、ソースコード３０を複数の分割コード３２に分割する。つまり、分割部２３は、統合影響表４８における解析影響度に基づき、ソースコード３０を複数の分割コード３２に分割する。分割の方法は、図２のステップＳ１３の処理と同じである。
【００６８】
実施の形態３．
実施の形態３は、階層的な依存関係を考慮して解析影響度を特定する点が実施の形態１，２と異なる。実施の形態３では、この異なる点を説明し、同一の点については説明を省略する。
実施の形態３では、実施の形態１に機能を追加した場合を説明する。しかし、実施の形態２又は変形例４に機能を追加することも可能である。
【００６９】
図２１に示すように、関数３１の間の依存関係が階層的になっている場合がある。例えば、図２１では、ＦｕｎｃＡとＦｕｎｃＢとは、ＦｕｎｃＡが依存元であり、ＦｕｎｃＢが依存先である。また、ＦｕｎｃＢとＦｕｎｃＣとは、ＦｕｎｃＢが依存元であり、ＦｕｎｃＣが依存先である。つまり、ＦｕｎｃＡの依存先であるＦｕｎｃＢは、ＦｕｎｃＣの依存元である。
この場合、ＦｕｎｃＡとＦｕｎｃＢとが別々の分割コード３２に分割されると、ＦｕｎｃＢだけでなく、ＦｕｎｃＣにも影響が及ぶ可能性がある。そこで、影響特定部２２は、階層的な依存関係を考慮して、２つの関数の間の解析影響度を特定する。
【００７０】
＊＊＊動作の説明＊＊＊
図２２及び図２３を参照して、実施の形態３に係るソースコード分割装置１０の動作を説明する。
ステップＳ１０１からステップＳ１０２の処理は、図２のステップＳ１１からステップＳ１２の処理と同じである。
【００７１】
（図２２のステップＳ１０３：階層影響度特定処理）
影響特定部２２は、対象の２つの関数３１のうち呼び出される関数３１と、他の関数３１との間の解析影響度に基づき、対象の２つの関数３１の間の解析影響度を特定する。
具体的には、影響特定部２２は、階層の下位の関数３１の間から順に、下位の関数３１の解析影響度を合計した階層影響度を特定する。図２１の例であれば、影響特定部２２は、初めにＦｕｎｃＢとＦｕｎｃＤとの間と、ＦｕｎｃＢとＦｕｎｃＦとの間と、ＦｕｎｃＣとＦｕｎｃＧとの間とについて階層影響度を特定する。影響特定部２２は、次に、ＦｕｎｃＡとＦｕｎｃＢとの間と、ＦｕｎｃＡとＦｕｎｃＣとの間とについて階層影響度を特定する。
すると、図２３に示すように各関数３１の間の階層影響度が特定される。つまり、ＦｕｎｃＢとＦｕｎｃＤとの間と、ＦｕｎｃＢとＦｕｎｃＦとの間と、ＦｕｎｃＣとＦｕｎｃＧとの間とについては、下位の関数３１がないので、階層影響度は０になる。ＦｕｎｃＡとＦｕｎｃＢとの間については、ＦｕｎｃＢとＦｕｎｃＤとの間と、ＦｕｎｃＢとＦｕｎｃＦとの間との解析影響度及び階層影響度の合計である１６が階層影響度になる。ＦｕｎｃＡとＦｕｎｃＣとの間は、ＦｕｎｃＣとＦｕｎｃＧとの間の解析影響度及び階層影響度の合計である１が階層影響度になる。
そして、影響特定部２２は、各関数３１の間について、解析影響度と階層影響度とを合計して、新たな解析影響度とする。
なお、階層影響度に１未満の係数を乗じた上で、解析影響度と階層影響度とを合計して新たな解析影響度してもよい。
【００７２】
図２１の例では、実施の形態１で説明した方法であれば、ＦｕｎｃＡとＦｕｎｃＢとの間の解析影響度と、ＦｕｎｃＡとＦｕｎｃＣとの間の解析影響度とは、同じ１６であった。しかし、階層的な依存関係を考慮した結果、ＦｕｎｃＡとＦｕｎｃＢとの間の解析影響度は３２になり、ＦｕｎｃＡとＦｕｎｃＣとの間の解析影響度は１７になる。
【００７３】
（図２２のステップＳ１０４：分割処理）
分割部２３は、ステップＳ１０３で特定された新たな解析影響度に基づき、ソースコード３０を複数の分割コード３２に分割する。分割の方法は、図２のステップＳ１３の処理と同じである。
【００７４】
＊＊＊実施の形態３の効果＊＊＊
以上のように、実施の形態３に係るソースコード分割装置１０は、階層的な依存関係を考慮して解析影響度を特定する。これにより、より適切に解析影響度を特定することができる。その結果、より適切にソースコード３０を分割することができる。
【００７５】
実施の形態４．
実施の形態４は、引数の引き渡し先の関数３１の処理における引数の利用状況を考慮して解析影響度を特定する点が実施の形態１と異なる。実施の形態４では、この異なる点を説明し、同一の点は説明を省略する。
【００７６】
引数の引き渡し先の関数３１では、引数を利用して様々な処理が行われる。引数が１度だけ参照される場合もあれば、引数が複数回参照される場合もある。また、引数が代入されるだけの場合もあれば、引数が処理の分岐条件に利用される場合もある。このような引数の利用状況の違いにより、同じ情報量の引数が引き渡されていたとしても、解析影響度は異なる。そこで、影響特定部２２は、引数の引き渡し先の関数３１における引数の利用状況を考慮して解析影響度を特定する。
【００７７】
＊＊＊動作の説明＊＊＊
図２４及び図２５を参照して、実施の形態４に係るソースコード分割装置１０の動作を説明する。
ステップ１１１からステップＳ１１２の処理は、図２のステップＳ１１からステップＳ１２の処理と同じである。
【００７８】
（図２４のステップＳ１１３：利用影響度特定処理）
影響特定部２２は、対象の２つの関数３１の間で引き渡された情報の参照回数と、対象の２つの関数３１の間で引き渡された情報を用いた処理内容との少なくともいずれかに基づき、対象の２つの関数３１の間の解析影響度として特定する。
具体的には、参照回数を考慮して解析影響度を特定する場合には、影響特定部２２は、引数の引き渡し先の関数３１における引数の参照回数を特定する。そして、影響特定部２２は、ステップＳ１１２で特定された解析影響度に参照回数を乗じて、新たな解析影響度とする。
また、処理内容を考慮して解析影響度を特定する場合には、影響特定部２２は、引数の引き渡し先の関数３１における引数を用いた処理内容を特定する。そして、影響特定部２２は、ステップＳ１１２で特定された解析影響度に、処理内容毎に事前に定められた係数を乗じて、新たな解析影響度とする。図２５では、値代入の場合には係数１、分岐条件の場合には係数２と定義した処理方法表４９を用いている。
参照回数と処理内容との両方を考慮して解析影響度を特定する場合には、影響特定部２２は、ステップＳ１１２で特定された解析影響度に参照回数と処理内容毎に事前に定められた係数とを乗じて、新たな解析影響度とする。
【００７９】
＊＊＊実施の形態４の効果＊＊＊
以上のように、実施の形態４に係るソースコード分割装置１０は、引数の引き渡し先の関数３１の処理における引数の利用状況を考慮して解析影響度を特定する。これにより、より適切に解析影響度を特定することができる。その結果、より適切にソースコード３０を分割することができる。
【００８０】
実施の形態５．
実施の形態５では、実施の形態１〜４のいずれかで説明したソースコード分割装置１０により生成された複数の分割コード３２を解析するソースコード解析装置５０について説明する。
【００８１】
＊＊＊構成の説明＊＊＊
図２６を参照して、実施の形態５に係るソースコード解析装置５０の構成を説明する。
ソースコード解析装置５０は、コンピュータである。
ソースコード解析装置５０は、プロセッサ５１と、メモリ５２と、ストレージ５３と、通信インタフェース５４とのハードウェアを備える。プロセッサ５１は、信号線を介して他のハードウェアと接続され、これら他のハードウェアを制御する。
【００８２】
プロセッサ５１は、プロセッシングを行うＩＣである。プロセッサ５１は、具体例としては、ＣＰＵ、ＤＳＰ、ＧＰＵである。
【００８３】
メモリ５２は、データを一時的に記憶する記憶装置である。メモリ５２は、具体例としては、ＳＲＡＭ、ＤＲＡＭである。
【００８４】
ストレージ５３は、データを保管する記憶装置である。ストレージ５３は、具体例としては、ＨＤＤである。また、ストレージ５３は、ＳＤ（登録商標）メモリカード、ＣＦ（登録商標）、ＮＡＮＤフラッシュ、フレキシブルディスク、光ディスク、コンパクトディスク、ブルーレイ（登録商標）ディスク、ＤＶＤといった可搬記録媒体であってもよい。
【００８５】
通信インタフェース５４は、外部の装置と通信するためのインタフェースである。通信インタフェース５４は、具体例としては、Ｅｔｈｅｒｎｅｔ（登録商標）、ＵＳＢ、ＨＤＭＩ（登録商標）のポートである。
【００８６】
ソースコード解析装置５０は、機能構成要素として、参照特定部６１と、構造特定部６２と、情報取得部６３と、解析部６４と、情報格納部６５とを備える。ソースコード解析装置５０の各機能構成要素の機能はソフトウェアにより実現される。
ストレージ５３には、ソースコード解析装置５０の各機能構成要素の機能を実現するプログラムが格納されている。このプログラムは、プロセッサ５１によりメモリ５２に読み込まれ、プロセッサ５１によって実行される。これにより、ソースコード解析装置５０の各機能構成要素の機能が実現される。
【００８７】
また、ストレージ５３には、参照関係テーブル５３１と、解析情報テーブル５３２とが記憶される。
【００８８】
図２６では、プロセッサ５１は、１つだけ示されていた。しかし、プロセッサ５１は、複数であってもよく、複数のプロセッサ５１が、各機能を実現するプログラムを連携して実行してもよい。
【００８９】
図２７を参照して、実施の形態５に係る参照関係テーブル５３１の構成を説明する。
参照関係テーブル５３１は、関数名又はグローバル変数名が設定される名称をｋｅｙとし、参照関数と被参照関数とをバリューとして持つテーブルである。
【００９０】
図２８を参照して、実施の形態５に係る解析情報テーブル５３２の構成を説明する。
解析情報テーブル５３２は、関数名又はグローバル変数名が設定される名称をｋｅｙとし、引数の値範囲と、戻り値又はグローバル変数の値範囲と、解析結果とをバリューとして持つテーブルである。引数の値範囲には、引数名と、最小値ｍｉｎと、最大値ＭＡＸとが含まれる。戻り値又はグローバル変数の値範囲には、最小値ｍｉｎと、最大値ＭＡＸとが含まれる。解析結果には、行数と、結果とが含まれる。
解析結果に含まれる結果としては、安全と、危険と、未証明とがある。安全は、どのような値に対しても該当の行の処理が不具合を起こさないことを意味する。危険は、どのような値に対しても該当の行の処理が不具合を起こすことを意味する。未証明は、値によって該当の行の処理が不具合を起こすことを意味する。
【００９１】
ソースコード３０を分割すると、参照する関数と参照される関数との情報が抜けてしまう可能性がある。この場合、関数の引数と戻り値との値の範囲が不明になってしまう。値の範囲が不明の場合には、型によって特定される最小値から最大値までの値により解析を行う。その結果、解析結果に含まれる結果として未証明となる行が増えてしまう。ここでは、未証明となる行が増えてしまうことを、解析精度の低下と呼ぶ。
【００９２】
実施の形態１〜４のいずれかで説明したソースコード分割装置１０と、ソースコード解析装置５０とを備えるシステムを、ソースコード解析システムと呼ぶ。なお、実施の形態１〜４のいずれかで説明したソースコード分割装置１０と、ソースコード解析装置５０とは、１つのコンピュータによって実現されてもよい。つまり、ソースコード解析システムは、１つのコンピュータによって実現されてもよい。
【００９３】
＊＊＊動作の説明＊＊＊
図２９から図３８を参照して、実施の形態５に係るソースコード解析装置５０の動作を説明する。
実施の形態５に係るソースコード解析装置５０の動作は、実施の形態５に係るソースコード解析方法に相当する。また、実施の形態５に係るソースコード解析装置５０の動作は、実施の形態５に係るソースコード解析プログラムの処理に相当する。
【００９４】
以下の説明では、図２９に示すように、ソースコード分割装置１０によってソースコード３０が分割コード３２Ａと分割コード３２Ｂとに分割された場合を想定する。そして、分割コード３２Ｂに対する解析が実行済の状態を想定する。
【００９５】
実施の形態５に係るソースコード解析装置５０の前処理を説明する。
前処理は、以下で説明するソースコード解析装置５０の全体的な動作の前に実行される処理である。
前処理では、参照特定部６１は、ソースコード３０で定義されている関数とグローバル変数とについて、参照関数及び被参照関数を特定して、参照関係テーブル５３１に書き込む。
【００９６】
図３０及び図３１を参照して、実施の形態５に係る参照特定処理を説明する。
ステップＳ１２１で、参照特定部６１は、通信インタフェース５４を介して分析対象のソースコード３０の入力を受け付ける。参照特定部６１は、ソースコード３０に定義されている全ての関数名とグローバル変数名とを抽出する。参照特定部６１は、抽出された関数名及びグローバル変数名を、参照関係テーブル５３１の名称の欄に書き込む。
【００９７】
参照特定部６１は、ステップＳ１２２からステップＳ１２７の処理を、参照関係テーブル５３１の名称の欄に設定された各関数名を対象として実行する。
ステップＳ１２２で、参照特定部６１は、参照関係テーブル５３１から対象とする関数名を読み出す。ここでは、読み出された関数名を関数名Ａとする。
ステップＳ１２３で、参照特定部６１は、ソースコード３０において、関数名Ａが示す関数が参照している関数を特定する。ここでは、特定された関数の関数名を関数名Ｂとする。ステップＳ１２４で、参照特定部６１は、関数名Ａをｋｅｙとするレコードのバリューの参照関数に関数名Ｂを書き込む。ステップＳ１２５では、参照特定部６１は、関数名Ｂをｋｅｙとするレコードのバリューの被参照関数に関数名Ａを書き込む。
ステップＳ１２６では、参照特定部６１は、ソースコード３０において、関数名Ａが示す関数が参照しているグローバル変数名を特定する。ここでは、特定されたグローバル変数名を変数名Ｃとする。ステップＳ１２７では、参照特定部６１は、変数名Ｃをｋｅｙとするレコードのバリューの被参照関数に関数名Ａを書き込む。
【００９８】
図２９に示すソースコード３０を入力として参照特定処理が実行されると、図３１に示すように参照関係テーブル５３１が生成される。図３１に示す参照関係テーブル５３１は、ソースコード３０で定義されている関数であるｆｕｎｃＡと、ｆｕｎｃＢと、ｆｕｎｃＣと、ｆｕｎｃＤと、グローバル変数であるｇ＿ｖａｌＡとがｋｅｙとなっている。また、これらの関数及びグローバル変数についての、参照関数及び被参照関数が特定され、バリューとなっている。
【００９９】
図３２を参照して、実施の形態５に係るソースコード解析装置５０の全体的な動作を説明する。
（図３２のステップＳ１３１：コード取得処理）
構造特定部６２は、ソースコード３０を分割して生成された複数の分割コード３２のうち、解析の処理対象とする分割コード３２を取得する。
【０１００】
（図３２のステップＳ１３２：構造特定処理）
構造特定部６２は、参照関係テーブル５３１を参照して、ステップＳ１３１で取得された処理対象の分割コード３２についての参照関係を特定する。構造特定部６２は、特定された参照関係を示す部分参照関係テーブル５３３を生成して、メモリ５２に書き込む。部分参照関係テーブル５３３の構成は、参照関係テーブル５３１の構成と同じである。
【０１０１】
図３３及び図３４を参照して、実施の形態５に係る構造特定処理を説明する。
ステップＳ１４１で、構造特定部６２は、処理対象の分割コード３２に定義されている全ての関数名とグローバル変数名とを抽出する。構造特定部６２は、抽出された関数名及びグローバル変数名を、部分参照関係テーブル５３３の名称の欄に書き込む。
【０１０２】
構造特定部６２は、ステップＳ１４２からステップＳ１４４の処理を、部分参照関係テーブル５３３の名称の欄に設定された各要素（関数名及びグローバル変数名）を対象として実行する。
ステップＳ１４２で、構造特定部６２は、部分参照関係テーブル５３３から対象とする要素を読み出す。ここでは、読み出された要素を要素Ａとする。ステップＳ１４３で、構造特定部６２は、参照関係テーブル５３１から要素Ａをｋｅｙとする全てのバリューを読み出す。ここでは、読み出されたバリューをバリューＢとする。ステップＳ１４４で、構造特定部６２は、部分参照関係テーブル５３３における要素ＡをｋｅｙとするレコードのバリューにバリューＢを書き込む。
【０１０３】
図２９に示す分割コード３２Ａを入力として構造特定処理が実行されると、図３４に示すように部分参照関係テーブル５３３が生成される。図３４に示す部分参照関係テーブル５３３は、分割コード３２Ａで定義されている関数であるｆｕｎｃＡと、ｆｕｎｃＢと、グローバル変数であるｇ＿ｖａｌＡとがｋｅｙとなっている。また、これらの関数及びグローバル変数についての、参照関数及び被参照関数が特定され、バリューとなっている。なお、参照関係テーブル５３１を参照して部分参照関係テーブル５３３が生成されるため、分割コード３２Ａに現れないｆｕｎｃＤの情報を部分参照関係テーブル５３３に含めることが可能である。
【０１０４】
（図３２のステップＳ１３３：情報取得処理）
情報取得部６３は、解析情報テーブル５３２を参照して、ステップＳ１３１で取得された処理対象の分割コード３２に関連する変数の取り得る範囲を示す値範囲情報を取得する。情報取得部６３は、取得された解析情報を示す部分解析情報テーブル５３４を生成して、メモリ５２に書き込む。部分解析情報テーブル５３４の構成は、解析情報テーブル５３２の構成と同じである。
【０１０５】
図３５及び図３６を参照して、実施の形態５に係る情報取得処理を説明する。
ステップＳ１５１で、情報取得部６３は、ステップＳ１３２で生成された部分参照関係テーブル５３３に含まれる全ての関数名及びグローバル変数名を抽出する。情報取得部６３は、抽出された関数名及びグローバル変数名を、部分解析情報テーブル５３４の名称の欄に書き込む。
【０１０６】
情報取得部６３は、ステップＳ１５２からステップＳ１５４の処理を、部分解析情報テーブル５３４の名称の欄に設定された各要素（関数名及びグローバル変数名）を対象として実行する。
ステップＳ１５２で、情報取得部６３は、部分解析情報テーブル５３４から対象とする要素を読み出す。ここでは、読み出された要素を要素Ａとする。ステップＳ１５３で、情報取得部６３は、解析情報テーブル５３２から要素Ａをｋｅｙとする全てのバリューを読み出す。ここでは、読み出されたバリューをバリューＢとする。ステップＳ１５４で、情報取得部６３は、部分解析情報テーブル５３４における要素ＡをｋｅｙとするレコードのバリューにバリューＢを書き込む。
【０１０７】
図２９に示す分割コード３２Ａを入力として情報取得処理が実行されると、図３６に示すように部分解析情報テーブル５３４が生成される。図３６に示す部分解析情報テーブル５３４は、分割コード３２Ａに関連する関数であるｆｕｎｃＡと、ｆｕｎｃＢと、ｆｕｎｃＣと、ｆｕｎｃＤと、グローバル変数であるｇ＿ｖａｌＡとがｋｅｙとなっている。また、これらの関数及びグローバル変数についての、引数の値範囲及び戻り値又はグローバル変数の値範囲が特定され、バリューとなっている。
ここでは、上述した通り分割コード３２Ｂに対する解析が実行済の状態であるため、ｆｕｎｃＡの引数の値の範囲と、ｆｕｎｃＣ及びｆｕｎｃＤの戻り値の範囲とが特定されている。つまり、処理対象の分割コード３２Ａではない他の分割コード３２を解析することにより、処理対象の分割コード３２Ａだけでは得られない変数の値範囲情報が特定されている。
【０１０８】
（図３２のステップＳ１３４：解析処理）
解析部６４は、ステップＳ１３２で生成された部分参照関係テーブル５３３と、ステップＳ１３３で生成された部分解析情報テーブル５３４とを参照して、処理対象の分割コード３２を解析する。言い換えると、解析部６４は、処理対象の分割コード３２を除く複数の分割コードのうちの少なくともいずれかの分割コード３２を解析して得られた、ソースコード３０における変数の値の取り得る範囲を示す値範囲情報を参照して、処理対象の分割コード３２を解析する。
【０１０９】
図３７及び図３８を参照して、実施の形態５に係る解析処理を説明する。
解析部６４は、ステップＳ１６１からステップＳ１６９の処理を、部分参照関係テーブル５３３の名称の欄に設定された各関数名を対象として実行する。
ステップＳ１６１で、解析部６４は、部分参照関係テーブル５３３から対象とする関数名を読み出す。ここでは、読み出された関数名を関数名Ａとする。ステップＳ１６２で、解析部６４は、関数名Ａが示す関数と、部分解析情報テーブル５３４とから、関数名Ａが示す関数に関連する引数と戻り値とグローバル変数との各変数の値範囲情報を特定する。
【０１１０】
解析部６４は、ステップＳ１６３からステップＳ１６８の処理を関数名Ａが示す関数の各行を対象として実行する。解析部６４は、関数の１行目から昇順に、処理対象とする行を選択する。
ステップＳ１６３で、解析部６４は、ステップＳ１６２で特定された値範囲情報が示す最小値から最大値まで引数と戻り値とグローバル変数との各変数の値を変化させながら、処理対象の行が安全であるか、危険であるかを判定する。ステップＳ１６４で、解析部６４は、各変数をどの値とした場合であっても、全て安全と判定された場合には、処理をステップＳ１６５に進める。一方、解析部６４は、それ以外の場合には、処理をステップＳ１６６に進める。ステップＳ１６５で、解析部６４は、処理対象の行を安全と判定する。
ステップＳ１６６で、解析部６４は、各変数をどの値とした場合であっても、全て危険と判定された場合には、処理をステップＳ１６７に進める。一方、解析部６４は、それ以外の場合には、処理をステップＳ１６８に進める。ステップＳ１６７で、解析部６４は、処理対象の行を危険と判定する。ステップＳ１６８で、解析部６４は、処理対象の行を未証明と判定する。
【０１１１】
ステップＳ１６９で、解析部６４は、ステップＳ１６３からステップＳ１６８で判定された結果により、部分解析情報テーブル５３４の解析結果を更新する。また、解析部６４は、ステップＳ１６２で特定された値範囲情報により、部分解析情報テーブル５３４の引数の値範囲と、戻り値又はグローバル変数の値範囲とを更新する。
【０１１２】
図２９に示す分割コード３２Ａを入力として解析処理が実行されると、図３８に示すように部分解析情報テーブル５３４が更新される。つまり、図３６に示す部分解析情報テーブル５３４では特定されていなかった、ｆｕｎｃＢ及びｆｕｎｃＣの引数の値の範囲と、ｆｕｎｃＡ及びｆｕｎｃＢの戻り値の範囲と、ｆｕｎｃＡ及びｆｕｎｃＢの解析結果とが明らかになる。
なお、処理対象の分割コード３２Ａだけでは知り得ないｆｕｎｃＡの引数の値範囲と、ｆｕｎｃＣの戻り値の範囲とを利用して解析がされているため、解析精度の高い、つまり未証明個所の少ない解析結果が得られる。
【０１１３】
（図３２のステップＳ１３５：情報格納処理）
情報格納部６５は、ステップＳ１３４で得られた部分解析情報テーブル５３４により、解析情報テーブル５３２を更新する。これにより、次に、図３２に示す処理が実行される際、今回の処理で特定された値範囲情報を利用して解析を行うことが可能になる。
【０１１４】
＊＊＊実施の形態５の効果＊＊＊
以上のように、実施の形態５に係るソースコード解析装置５０は、ソースコード分割装置１０によって分割され生成された分割コード３２を解析する。そのため、ソースコード３０を解析する場合と比較して高速に解析することが可能である。また、実施の形態５に係るソースコード解析装置５０は、他の分割コード３２を解析することにより得られた値範囲情報を利用して解析を行う。そのため、解析精度の高い解析を行うことが可能である。
【０１１５】
＊＊＊他の構成＊＊＊
＜変形例５＞
実施の形態５では、各機能構成要素がソフトウェアで実現された。しかし、変形例５として、各機能構成要素はハードウェアで実現されてもよい。この変形例５について、実施の形態５と異なる点を説明する。
【０１１６】
図３９を参照して、変形例５に係るソースコード解析装置５０の構成を説明する。
各機能構成要素がハードウェアで実現される場合には、ソースコード解析装置５０は、プロセッサ５１とメモリ５２とストレージ５３とに代えて、電子回路５５を備える。電子回路５５は、各機能構成要素と、メモリ５２と、ストレージ５３との機能とを実現する専用の回路である。
【０１１７】
電子回路５５としては、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックＩＣ、ＧＡ（Ｇａｔｅ  Ａｒｒａｙ）、ＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）、ＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）が想定される。
各機能構成要素を１つの電子回路５５で実現してもよいし、各機能構成要素を複数の電子回路５５に分散させて実現してもよい。
【０１１８】
＜変形例６＞
変形例６として、一部の各機能構成要素がハードウェアで実現され、他の各機能構成要素がソフトウェアで実現されてもよい。
【０１１９】
プロセッサ５１とメモリ５２とストレージ５３と電子回路５５とを処理回路という。つまり、各機能構成要素の機能は、処理回路により実現される。
【０１２０】
実施の形態６．
実施の形態６は、未証明の行だけを解析する点が実施の形態５と異なる。実施の形態６では、この異なる点を説明し、同一の点については説明を省略する。
【０１２１】
＊＊＊動作の説明＊＊＊
図４０を参照して、実施の形態６に係る解析処理を説明する。
ステップＳ１７１からステップＳ１７２の処理は、図３７のステップＳ１６１からステップＳ１６２の処理と同じである。ステップＳ１７３で、解析部６４は、処理対象の行について、判定済か否かを判定する。つまり、解析部６４は、安全又は危険との判定結果が得られているか否かを判定する。解析部６４は、安全又は危険との判定結果が得られている場合には、既に判定済であるとして、行をインクリメントして次の行を処理対象にする。一方、解析部６４は、安全又は危険との判定結果が得られていない場合には、判定済でないとして、処理をステップＳ１７４に進める。
ステップＳ１７４からステップＳ１８０の処理は、図３７のステップＳ１６３からステップＳ１６９の処理と同じである。
【０１２２】
以上のように、実施の形態６に係るソースコード解析装置５０は、未証明の行だけを解析する。そのため、実施の形態５に係るソースコード解析装置５０に比べ、高速に解析を行うことが可能である。
【０１２３】
実施の形態７．
実施の形態７は、ソースコード３０全体の解析精度が指定された精度に達するまで、処理を繰り返し実行する点が実施の形態５，６と異なる。実施の形態７では、この異なる点を説明し、同一の点については説明を省略する。
実施の形態７では、実施の形態５に機能を追加した場合を説明する。しかし、実施の形態６に機能を追加することも可能である。
【０１２４】
＊＊＊構成の説明＊＊＊
図４１を参照して、実施の形態７に係るソースコード解析装置５０の構成を説明する。
ソースコード解析装置５０は、精度指定部６６を備える点が図２６に示すソースコード解析装置５０と異なる。
【０１２５】
図４２を参照して、実施の形態７に係る解析情報テーブル５３２の構成を説明する。
解析情報テーブル５３２は、バリューとして解析精度を含む点が図２７に示す解析情報テーブル５３２と異なる。解析精度は、関数毎に計算される。解析精度（％）は、（安全又は危険と判定された行数）／（関数の全ての行数）×１００によって計算される。
【０１２６】
＊＊＊動作の説明＊＊＊
図４３を参照して、実施の形態７に係るソースコード解析装置５０の全体的な動作を説明する。
（図４３のステップＳ１８１：精度指定処理）
精度指定部６６は、基準精度の指定を受け付ける。
具体的には、精度指定部６６は、通信インタフェース５４を介して接続された入力装置を利用者が操作することによって入力された精度を基準精度として受け付ける。
【０１２７】
（図４３のステップＳ１８２：精度判定処理）
精度指定部６６は、ソースコード３０の全体の解析精度がステップＳ１８１で受け付けられた基準精度以上であるか否かを判定する。精度指定部６６は、解析精度が基準精度以上である場合には、処理を終了する。一方、精度指定部６６は、解析精度が基準精度未満である場合には、処理をステップＳ１８３に進める。
ソースコード３０の全体の解析精度は、ソースコード３０の全ての関数の解析精度の平均値であってもよいし、安全又は危険と判定されたソースコード３０の行数／ソースコード３０の全ての行数×１００によって計算されてもよい。
【０１２８】
ステップＳ１８３からステップＳ１８７の処理は、図３２のステップＳ１３１からステップＳ１３５の処理と同じである。
つまり、解析精度が基準精度未満である場合には、ステップＳ１８３で新たな分割コード３２が解析の処理対象として受け付けられ、解析が継続される。
【０１２９】
以上のように、実施の形態７に係るソースコード解析装置５０は、ソースコード３０全体の解析精度が指定された精度に達するまで、新たな分割コード３２を対象として処理を繰り返し実行する。そのため、手動で解析を繰り返す手間を削減することが可能である。
【０１３０】
実施の形態８．
実施の形態８は、指定されたモジュールの解析精度が指定された精度に達するまで、処理を繰り返し実行する点が実施の形態７と異なる。実施の形態８では、この異なる点を説明し、同一の点については説明を省略する。
【０１３１】
＊＊＊動作の説明＊＊＊
図４４を参照して、実施の形態８に係るソースコード解析装置５０の全体的な動作を説明する。
（図４４のステップＳ１９１：精度指定処理）
精度指定部６６は、モジュールの指定及び基準精度の指定を受け付ける。
具体的には、精度指定部６６は、通信インタフェース５４を介して接続された入力装置を利用者が操作することによって入力されたモジュールを指定モジュールとし、精度を基準精度として受け付ける。
【０１３２】
（図４４のステップＳ１９２：精度判定処理）
精度指定部６６は、ステップＳ１９１で受け付けられた指定モジュールの解析精度がステップＳ１９１で受け付けられた基準精度以上であるか否かを判定する。精度指定部６６は、解析精度が基準精度以上である場合には、処理を終了する。一方、精度指定部６６は、解析精度が基準精度未満である場合には、処理をステップＳ１９３に進める。
モジュールは、１つ以上の関数である。指定モジュールが複数の関数を含む場合には、指定モジュールの解析精度は、指定モジュールに含まれる全ての関数の解析精度の平均値であってもよいし、安全又は危険と判定された指定モジュールの行数／指定モジュールの全ての行数×１００によって計算されてもよい。
【０１３３】
ステップＳ１９３からステップＳ１９７の処理は、図４３のステップＳ１８３からステップＳ１８７の処理と同じである。
つまり、指定モジュールの解析精度が基準精度未満である場合には、ステップＳ１９３で新たな分割コード３２が解析の処理対象として受け付けられ、解析が継続される。
【０１３４】
以上のように、実施の形態８に係るソースコード解析装置５０は、指定モジュールの解析精度が指定された精度に達するまで、新たな分割コード３２を対象として処理を繰り返し実行する。そのため、手動で解析を繰り返す手間を削減することが可能である。
【符号の説明】
【０１３５】
１０  ソースコード分割装置、１１  プロセッサ、１２  メモリ、１３  ストレージ、１４  通信インタフェース、１５  電子回路、２１  依存特定部、２２  影響特定部、２３  分割部、２４  グローバル変数特定部、３０  ソースコード、３１  関数、３２  分割コード、４１  宣言型ビット数表、４２  引数情報表、４３  引数影響表、４４  グラフ、４５  分割表、４６  グローバル変数表、４７  グローバル変数影響表、４８  統合影響表、４９  処理方法表。
【図１】
2019102786.tif 000003
【図２】
2019102786.tif 000004
【図３】
2019102786.tif 000005
【図４】
2019102786.tif 000006
【図５】
2019102786.tif 000007
【図６】
2019102786.tif 000008
【図７】
2019102786.tif 000009
【図８】
2019102786.tif 000010
【図９】
2019102786.tif 000011
【図１０】
2019102786.tif 000012
【図１１】
2019102786.tif 000013
【図１２】
2019102786.tif 000014
【図１３】
2019102786.tif 000015
【図１４】
2019102786.tif 000016
【図１５】
2019102786.tif 000017
【図１６】
2019102786.tif 000018
【図１７】
2019102786.tif 000019
【図１８】
2019102786.tif 000020
【図１９】
2019102786.tif 000021
【図２０】
2019102786.tif 000022
【図２１】
2019102786.tif 000023
【図２２】
2019102786.tif 000024
【図２３】
2019102786.tif 000025
【図２４】
2019102786.tif 000026
【図２５】
2019102786.tif 000027
【図２６】
2019102786.tif 000028
【図２７】
2019102786.tif 000029
【図２８】
2019102786.tif 000030
【図２９】
2019102786.tif 000031
【図３０】
2019102786.tif 000032
【図３１】
2019102786.tif 000033
【図３２】
2019102786.tif 000034
【図３３】
2019102786.tif 000035
【図３４】
2019102786.tif 000036
【図３５】
2019102786.tif 000037
【図３６】
2019102786.tif 000038
【図３７】
2019102786.tif 000039
【図３８】
2019102786.tif 000040
【図３９】
2019102786.tif 000041
【図４０】
2019102786.tif 000042
【図４１】
2019102786.tif 000043
【図４２】
2019102786.tif 000044
【図４３】
2019102786.tif 000045
【図４４】
2019102786.tif 000046
【国際調査報告】
2019102786.tif 000047
2019102786.tif 000048