(57)【要約】【課題】無駄な試験の実施の抑制、並びに、試験エラーが発生した場合のエラー原因の早期究明に寄与しうるソースコード解析装置、ソースコード解析方法およびソースコード解析プログラムを提供する。【解決手段】ソースコード解析装置は、ソースコードにおいて、通信メソッド関数を表す対象文字列を探索し、探索した通信メソッド関数のソースコードにおける位置を検出するメソッド探索部１４２と、通信メソッド関数の引数の少なくとも一部を通信コマンドとして抽出し、抽出した通信コマンドが変数または数値のいずれであるかを判定する引数抽出・判定部１４３と、引数抽出・判定部１４３により変数であると判定された通信コマンドに基づいて、ソースコードにおいて通信コマンドに代入される数値を検索して抽出し、抽出した数値を第２数値記憶部１７６または第３数値記憶部１７７に記憶させる数値抽出部１４５と、を備える。【選択図】図２
2016038800.tif 000002
【特許請求の範囲】
【請求項１】
ソースコード群を記憶するソースコード記憶部と、
前記ソースコード記憶部に記憶された前記ソースコード群の中から１つのソースコードを取得するソースコード取得部と、
前記ソースコードにおいて、通信メソッド関数を表す対象文字列を探索し、探索した通信メソッド関数の前記ソースコードにおける位置を検出するメソッド探索部と、
前記通信メソッド関数の引数の少なくとも一部を通信コマンドとして抽出し、抽出した前記通信コマンドが変数または数値のいずれであるかを判定する引数抽出・判定部と、
数値記憶部と、
前記引数抽出・判定部により数値であると判定された前記通信コマンドの数値を前記数値記憶部に記憶させ、前記引数抽出・判定部により変数であると判定された前記通信コマンドに基づいて、前記ソースコードにおいて前記通信コマンドに代入される数値を検索して抽出し、抽出した数値を前記数値記憶部に記憶させる数値抽出部と、
前記メソッド探索部により探索された通信メソッド関数の位置と、前記数値記憶部に記憶された前記通信コマンドの数値と、を出力する位置・数値出力部と、を備える、
ソースコード解析装置。
【請求項２】
前記引数抽出・判定部が抽出した前記通信コマンドを記憶する引数記憶部を更に備え、
前記ソースコードにおける分岐部分を検索するとともに、前記引数記憶部に記憶された前記通信コマンドに基づいて、前記分岐部分において前記通信コマンドに変数または数値を代入されているか否かを判定する分岐判定部と、
前記分岐判定部により、前記分岐部分において変数または数値が代入されると判定された前記通信コマンドを記憶する分岐判定結果記憶部と、を備える、
請求項１に記載のソースコード解析装置。
【請求項３】
前記数値抽出部は、更に、前記分岐部分において前記通信コマンドに変数または数値のいずれが代入されているかを判定し、変数が代入されていると判定した場合、前記ソースコード内において前記変数に代入される数値を検索して抽出し、数値が代入されていると判定した場合、前記通信コマンドに代入される数値を抽出する、
請求項２に記載のソースコード解析装置。
【請求項４】
ソースコードに使用されるプログラミング言語の文字列フォーマットおよび数値フォーマットを記憶するフォーマット記憶部を更に備え、
前記数値抽出部は、前記フォーマット記憶部から取得した文字列フォーマットおよび数値フォーマットに基づいて、前記通信コマンドに変数または数値のいずれが代入されているかを判定する、
請求項１から３に記載のソースコード解析装置。
【請求項５】
ソースコード群の中から１つのソースコードを取得するステップと、
前記ソースコードにおいて、通信メソッド関数を表す対象文字列を探索し、探索した通信メソッド関数の位置を検出するステップと、
前記通信メソッド関数の引数の少なくとも一部を通信コマンドとして抽出し、抽出した前記通信コマンドが変数または数値のいずれであるかを判定するステップと、
数値であると判定された通信コマンドの数値を抽出するステップと、
変数であると判定された通信コマンドに基づいて、前記ソースコードにおいて前記通信コマンドに代入される数値を検索して抽出するステップと、
前記通信メソッド関数のソースコードにおける位置と、抽出した前記通信コマンドの数値と、を出力するステップと、を含む、
ソースコード解析方法。
【請求項６】
コンピュータを、
ソースコード群の中から１つのソースコードを取得するソースコード取得部、
前記ソースコードにおいて、通信メソッド関数を表す対象文字列を探索し、前記通信メソッド関数のソースコードにおける位置を検出するメソッド探索部、
前記通信メソッド関数の引数の少なくとも一部を通信コマンドとして抽出し、抽出した前記通信コマンドが変数または数値のいずれであるかを判定する引数抽出・判定部、
数値であると判定された通信コマンドの数値を数値記憶部に記憶させ、変数であると判定された通信コマンドに基づいて、前記ソースコードにおいて前記通信コマンドに代入される数値を検索して抽出し、抽出した数値を前記数値記憶部に記憶させる数値抽出部、
前記通信メソッド関数の位置と、前記数値記憶部に記憶された前記通信コマンドの数値と、を出力する位置・数値出力部、
として機能させる、
ソースコード解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコード解析装置、ソースコード解析方法およびソースコード解析プログラムに関する。
【背景技術】
【０００２】
組み込みシステムの通信試験では、当該組み込みシステムの仕様書の記載に基づいて、実施すべき試験項目が決定される。ここで、「通信試験」とは、通信機能を有する組み込み機器について仕様書に記載された通信機能が正常に実現されているか否かを確認する試験である。
【０００３】
ところで、組み込みシステムには、仕様書が存在せず、動作設定のためのソースコードのみが存在するものがある。また、分業による生産効率向上の観点から、組み込みシステムの仕様書作成の担当者とソースコード作成の担当者とが異なることが多い。この場合、仕様書作成の担当者とソースコード作成の担当者との意思疎通が上手くいかなければ、ソースコード作成の担当者がソースコードを更新したにも関わらず、それが仕様書の内容に反映されていないということが起こりうる。この場合、仕様書から実施すべき試験項目に関する情報が欠如しているため、実施すべき試験項目が十分に網羅されず、通信試験が不完全なものとなってしまう虞がある。
【０００４】
これに対して、従来、ソースコードに基づいて、自動的に試験項目を生成するソフトウェアテスト支援システムが提案されている（特許文献１参照）。
特許文献１に記載されたソフトウェアテスト支援システムでは、ソースコードを複数の単位サブルーチンに分類し、各単位サブルーチンの呼び出し関係を解析し、全ての呼び出しパターンを網羅するように、複数の試験項目を作成する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平７−２１０４２４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ソースコードには、実施すべき試験項目とは直接関係しない処理を行うサブルーチンが存在する場合がある。この場合、特許文献１に記載されたソフトウェアテスト支援システムは、実施すべき試験項目とは直接関係しない処理まで含めてテストケースを作成してしまう。このため、無駄な試験を実施してしまう虞がある。
【０００７】
また、ソースコードには、サブルーチン内で使用されている変数に数値を代入することを示す代入文が、当該サブルーチン以外の位置に存在するものがある。このようなソースコードにおいて代入文に誤りがあった場合、特許文献１に記載のソフトウェアテスト支援システムでは、エラー原因となっているサブルーチンは特定できるが、当該サブルーチンで使用されている変数に関する代入文の誤り箇所を特定することが困難である。従って、エラー原因の究明に時間を要してしまう虞がある。
【０００８】
本発明は、上記事由に鑑みてなされたものであり、無駄な試験の実施の抑制、並びに、試験エラーが発生した場合のエラー原因の早期究明に寄与しうるソースコード解析装置、ソースコード解析方法およびソースコード解析プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
上記目的を達成するために、本発明に係るソースコード解析装置は、
ソースコード群を記憶するソースコード記憶部と、
前記ソースコード記憶部に記憶された前記ソースコード群の中から１つのソースコードを取得するソースコード取得部と、
前記ソースコードにおいて、通信メソッド関数を表す対象文字列を探索し、探索した通信メソッド関数の前記ソースコードにおける位置を検出するメソッド探索部と、
前記通信メソッド関数の引数の少なくとも一部を通信コマンドとして抽出し、抽出した前記通信コマンドが変数または数値のいずれであるかを判定する引数抽出・判定部と、
数値記憶部と、
前記引数抽出・判定部により数値であると判定された前記通信コマンドの数値を前記数値記憶部に記憶させ、前記引数抽出・判定部により変数であると判定された前記通信コマンドに基づいて、前記ソースコードにおいて前記通信コマンドに代入される数値を検索して抽出し、抽出した数値を前記数値記憶部に記憶させる数値抽出部と、
前記メソッド探索部により探索された通信メソッド関数の位置と、前記数値記憶部に記憶された前記通信コマンドの数値と、を出力する位置・数値出力部と、を備える。
【発明の効果】
【００１０】
本発明は、無駄な試験の実施の抑制、並びに、試験エラーが発生した場合のエラー原因の早期究明に寄与しうる。
【図面の簡単な説明】
【００１１】
【図１】実施の形態に係るソースコード解析装置のハードウェア構成を示すブロック図である。
【図２】実施の形態に係るソースコード解析装置の機能構成を示すブロック図である。
【図３】実施の形態に係るソースコードの一例を示す図である。
【図４】実施の形態に係るソースコード解析装置の結果表示の一例を示す図である。
【図５】実施の形態に係る通信コマンド抽出処理の流れの一例を示すフローチャートである。
【図６】実施の形態に係る通信メソッド関数探索処理の流れの一例を示すフローチャートである。
【図７】実施の形態に係る引数抽出・判定処理の流れの一例を示すフローチャートである。
【図８】実施の形態に係る分岐判定処理の流れの一例の一部を示すフローチャートである。
【図９】実施の形態に係る分岐判定処理の流れの一例の一部を示すフローチャートである。
【図１０】実施の形態に係る数値抽出処理の流れの一例を示すフローチャートである。
【図１１】変形例に係る引数抽出・判定処理の流れの一例を示すフローチャートである。
【図１２】変形例に係る分岐判定処理の流れの一例の一部を示すフローチャートである。
【図１３】変形例に係るソースコード解析装置と、試験装置とから構成される試験システムの機能構成を示すブロック図である。
【発明を実施するための形態】
【００１２】
以下、本発明の実施の形態について添付図面を参照しながら説明する。
【００１３】
ソースコード解析装置１は、図１に示すように、ユーザが各種情報を入力するための入力部１１と、各種情報を出力する出力部１２と、外部機器に接続するための外部インターフェース（Ｉ／Ｆ）部１３と、制御部１４と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１５と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）１６と、記憶部１７と、から構成される。
【００１４】
入力部１１は、マウスやキーボード等の入力装置３と接続されている。入力部１１は、ユーザが入力装置３を用いて入力する各種情報を受け付ける。
【００１５】
出力部１２は、液晶ディスプレイ等の出力装置５に接続されている。出力部１２は、制御部１４から入力された各種情報を出力する。
【００１６】
外部Ｉ／Ｆ部１３は、ＣＤ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ）等のリムーバブルディスクに対して読み書きするためのドライブ装置（図示せず）等に接続されている。また、外部のネットワーク（例えば、インターネット、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）等）に接続するための装置や、制御部１４が生成した情報を印字するためのプリンタに接続されていてもよい。
【００１７】
制御部１４は、例えば、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）から構成されており、ソースコード解析装置１の全体の制御を行う。例えば、制御部１４は、通信コマンド抽出処理を実行する。通信コマンド抽出処理の詳細については後述する。
【００１８】
ＲＯＭ１５は、不揮発性メモリから構成され、制御部１４がソースコード解析装置１の全体を制御するためのプログラム等を格納する。ＲＯＭ１５は、例えば通信コマンド抽出処理を実行するためのプログラムを格納している。
【００１９】
ＲＡＭ１６は、揮発性メモリから構成される。ＲＡＭ１６の一部には、制御部１４が処理を行うために必要なデータ等が一時的に格納される作業領域が設けられる。
【００２０】
記憶部１７は、ハードディスクドライブ等の記憶装置から構成される。
記憶部１７は、ソースコード群を記憶するソースコード記憶部１７１と、後述の通信メソッド関数の引数である通信コマンドを記憶する引数記憶部１７３と、分岐部分内に存在すると判定された通信コマンドを記憶する分岐判定結果記憶部１７４と、第１数値記憶部１７５と、第２数値記憶部１７６と、第３数値記憶部１７７と、通信メソッド関数を記憶する関数記憶部１７２と、通信メソッド関数のソースコードにおける位置を示す行の識別情報並びに同一行に存在する通信メソッド関数の個数を記憶する識別情報・個数記憶部１７８と、フォーマット記憶部１７９と、分岐判定文字列記憶部１８０と、を有する。
【００２１】
ソースコード記憶部１７１は、複数の組み込みシステムのソースコードから構成されるソースコード群を記憶している。各ソースコードは、通常、組み込みシステムの機種に応じて異なる。
【００２２】
関数記憶部１７２は、予め、通信メソッド関数の形状または引数に関する情報を記憶している。ここで、「通信メソッド」とは、例えばデータの送受信等通信に関連する処理である。また、「通信メソッド関数」は、通信を実施するための関数を含む通信に関連する処理を行う関数である。
通信メソッド関数の形状に関する情報は、「ｓｅｎｄ()；」、「ｗｒｉｔｅ()；」等の通信メソッド関数の形状を表す文字列から構成される。
通信メソッド関数の引数に関する情報は、通信メソッド関数の引数フィールドの何番目の引数が通信コマンドに相当するかを示す情報から構成される。ここで、「通信コマンド」とは、例えば組み込みシステムにおいて、マイクロコンピュータとメモリとの間で通信するための通信メソッド関数の引数フィールドに入力する数値等から構成される。例えば、通信メソッド関数「ｓｅｎｄ（ｓｏｃｋｅｔ,ｍｓｇ,ｍｓｇＬｅｎｇｔｈ,ｆｌａｇ）；」の場合、通信コマンドが、２番目に相当することを示す情報である。また、関数記憶部１７２は、この引数に関する情報を、当該通信コマンド関数に対応づけた形で記憶している。
【００２３】
引数記憶部１７３は、ソースコードに記述された通信メソッド関数から抽出された通信コマンドを記憶する。通信コマンドは、後述の引数抽出・判定部１４３により抽出される。
【００２４】
分岐判定結果記憶部１７４は、分岐条件により処理内容が変化する分岐部分に存在する文字列（以下、「分岐部内文字列」と称する。）に存在する通信コマンドを記憶する。
【００２５】
第１数値記憶部１７５は、引数抽出・判定部１４３で抽出される数値を記憶する。第２数値記憶部１７６および第３数値記憶部１７７は、後述の数値抽出部１４５で抽出される数値を記憶する。
【００２６】
識別情報・個数記憶部１７８は、ソースコードにおける通信メソッド関数が存在する行の識別情報（例えば、行番号）と、当該行番号の示す行に存在する通信メソッド関数の個数と、を記憶している。識別情報・個数記憶部１７８は、後述のメソッド探索部１４２が探索して得られる、通信メソッド関数が存在する行の識別情報および当該行に存在する通信メソッド関数の個数を記憶する。
【００２７】
フォーマット記憶部１７９は、ソースコードに使用され得るプログラミング言語における文字フォーマットまたは数値フォーマットに関する情報を予め記憶している。例えば、ソースコードに「１１ＥＦ」等の１６進数の数値が使用される場合、数値フォーマットに関する情報として、０乃至９およびＡ乃至Ｆが数値に使用される旨を示す情報を記憶する。
【００２８】
分岐判定文字列記憶部１８０は、予め、分岐判定文字列に関する情報を記憶している。分岐判定文字列に関する情報は、例えば「ｉｆ（）｛｝」、「ｅｌｓｅ  ｉｆ（）｛｝」、「ｆｏｒ（）｛｝」、「ｗｈｉｌｅ（）｛｝」、「ｓｗｉｔｃｈ  ｃａｓｅ（）｛｝」等の分岐判定文を表す文字列（例えば「ｉｆ」等）から構成される。
【００２９】
次に、本実施の形態に係るソースコード解析装置１の制御部１４の機能的構成について説明する。
制御部１４は、図２に示すように、ソースコード取得部１４１、メソッド探索部１４２、引数抽出・判定部１４３、分岐判定部１４４、数値抽出部１４５、結果表示部１４６として機能する。なお、図２において、実線矢印は動作フローを表し、破線矢印はデータフローを表す。
【００３０】
ソースコード取得部１４１は、出力部１２を介して出力装置５に、ユーザによる通信試験の対象である組み込みシステムのソースコードを指定するためのソースコード指定用画面を表示する。
ソースコード指定用画面は、例えば試験対象の組み込みシステムのソースコードが記述されたファイルのファイルパスを表示する画面から構成される。例えば、ソースコード指定用画面には、組み込み機器の各種ソースコードが記述されたファイルが保管されているフォルダ（ディレクトリ）の内容が表示される。
ここで、ユーザは、出力装置５に表示されたソースコード指定用画面を確認しながら、入力装置３を操作することにより、入力部１１を介して試験対象のソースコードが記述されたファイルを選択することができる。
ソースコード取得部１４１は、ユーザにより試験対象のソースコードが記述されたファイルが選択されると、選択されたファイルをソースコード記憶部１７１から取得することによりソースコードを取得する。このとき、ソースコード取得部１４１は、取得したソースコードを、ＲＡＭ１６に形成された作業領域に読み込む。
【００３１】
ここで、ソースコード取得部１４１がソースコード記憶部１７１から取得したソースコードの一例について、図３を参照しながら説明する。
ソースコードは、例えばＣ言語等の高級プログラミング言語で記述されている。なお、図３では、ソースコードの構造を理解しやすくするために、左端に行番号を付してある。
図３に示すソースコードでは、５１行目、６１行目、６２行目、８１行目および１８１行目それぞれに、通信コマンドを示す数値「０１０１」、「１１１１」、「１０００」、「０００１」、「１１１０」が記述されている。８１行目の通信コマンドを示す数値は、通信メソッド関数の引数として記述されている。
【００３２】
メソッド探索部１４２は、ソースコード取得部１４１が取得したソースコードにおいて、通信メソッド関数を探索する。メソッド探索部１４２は、関数記憶部１７２から通信メソッド関数の形状に関する情報を取得し、取得した形状に関する情報に基づいて、通信メソッド関数を探索する。なお、メソッド探索部１４２の動作の詳細は後述する。
【００３３】
引数抽出・判定部１４３は、メソッド探索部１４２が検出した通信メソッド関数の引数フィールドに記述されている通信コマンドを抽出するとともに、抽出した通信コマンドが変数または数値のいずれであるかを判定する。
引数抽出・判定部１４３は、関数記憶部１７２から通信メソッドの引数に関する情報を取得し、取得した引数に関する情報に基づいて、通信コマンドを抽出する。例えば図３の１０１行目に存在する通信メソッド関数「ｓｅｎｄ（ｓｏｃｋｆｄ,ＰＯＷＥＲ＿ＯＮ,ｌｅｎ，０）;」の場合、引数抽出・判定部１４３は、第一検索文字列「(」から第二検索文字列「)」までの間の文字列を抽出し、更に、抽出した文字列の中から、２番目の引数「ＰＯＷＥＲ＿ＯＮ」を通信コマンドとして抽出する。
【００３４】
また、引数抽出・判定部１４３は、抽出した通信コマンドが変数または数値のいずれであるかを判定する。具体的には、引数抽出・判定部１４３は、フォーマット記憶部１７９から取得したソースコードに使用されているプログラミング言語におけるフォーマットに関する情報に基づいて判定する。
例えばＣ言語の場合、文字フォーマットは、ａ乃至ｚの文字を含む文字列であり、数値フォーマットは、数字０乃至９のみから構成される文字列である。そして、引数抽出・判定部１４３は、通信コマンドがａ乃至ｚの文字を含む場合、当該通信コマンドを変数と判定する。一方、引数抽出・判定部１４３は、通信コマンドが０乃至９のみから構成される場合、当該通信コマンドを数値と判定する。
なお、引数抽出・判定部１４３の動作の詳細は、後述する。
【００３５】
分岐判定部１４４は、引数抽出・判定部１４３により通信コマンドが変数であると判定された場合、分岐部内文字列を抽出する。分岐判定部１４４は、分岐判定文字列記憶部１８０から分岐判定文字列を取得し、取得した分岐判定文字列に基づいて、ソースコードから分岐部内文字列を抽出する。また、分岐判定部１４４は、分岐部分において通信コマンドに代入される変数または数値（以下、「分岐部内通信コマンド」と称する。）を抽出する。
なお、分岐判定部１４４の動作の詳細は、後述する。
【００３６】
数値抽出部１４５は、ソースコードにおける通信コマンドに数値が代入されている位置を検索し、当該位置から通信コマンドに代入されている数値を抽出する。また、数値抽出部１４５は、通信コマンドまたは分岐部内通信コマンドが変数または数値のいずれであるかを判定する。具体的には、数値抽出部１４５は、フォーマット記憶部１７９から取得した、ソースコードに使用されているプログラミング言語におけるフォーマットに関する情報に基づいて、通信コマンドまたは分岐部内通信コマンドが変数または数値のいずれであるかを判定する。そして、数値抽出部１４５は、通信コマンドまたは分岐部内通信コマンドが変数である場合、ソースコードにおける通信コマンドまたは分岐部内通信コマンドに数値を代入する代入文の位置を検索し、当該位置から通信コマンドまたは分岐部内通信コマンドに代入されている数値を抽出する。ここで、同一の通信コマンドまたは同一の分岐部内通信コマンドに数値を代入する代入文が複数あるとする。この場合、数値抽出部１４５は、複数の代入文のうち、通信コマンドまたは分岐部内通信コマンドからの行数（文字数）が最小となる位置にある代入文から数値を抽出する。
また、数値抽出部１４５は、通信コマンドを引数記憶部１７３から取得した場合、抽出した数値を第２数値記憶部１７６に記憶する。一方、数値抽出部１４５は、通信コマンドを分岐判定結果記憶部１７４から取得した場合、抽出した数値を第３数値記憶部１７７に記憶する。
【００３７】
結果表示部（位置・数値出力部）１４６は、識別情報・個数記憶部１７８から通信メソッド関数が記述されている行および当該行に存在する通信メソッド関数の個数を取得する。また、結果表示部１４６は、第１数値記憶部１７５、第２数値記憶部１７６および第３数値記憶部１７７それぞれから通信コマンドまたは分岐部内通信コマンドを示す数値を取得し、取得した数値を、出力部１２を介して出力装置５へ出力する。出力装置５は、通信コマンドまたは分岐部内通信コマンドを示す数値をユーザに視認可能な状態で表示する。即ち、結果表示部１４６は、出力装置５を介して、ソースコードに記述されている通信メソッド関数の位置並びに通信コマンドの数値をユーザに通知する。
【００３８】
結果表示部１４６が出力する抽出結果の表示の一例について、図４を参照しながら説明する。
出力装置５には、図４に示すように、３つのフィールドＦ１、Ｆ２、Ｆ３が表示される。フィールドＦ１には、「通信メソッド関数の場所、通信メソッド関数の個数」が表示され、フィールドＦ２には、「通信メソッド関数に数値として入力された通信コマンド」が表示される。また、フィールドＦ３には、「通信メソッド関数に変数を介して入力された通信コマンド」が表示される。ここで、フィールドＦ３は、更に、２つのフィールドＦ３１、Ｆ３２に区分けされている。フィールドＦ３１には、「必ず実行される通信コマンド」が表示され、フィールドＦ３２には、「条件に応じて実行される通信コマンド」が表示される。フィールドＦ３１には、分岐条件に関わらず必ず実行される通信コマンドを示す数値が表示され、フィールドＦ３２には、分岐条件に応じて実行されたり実行されなかったりする通信コマンドを示す数値が表示される。
【００３９】
次に、本実施の形態に係るソースコード解析装置１が実行する通信コマンド抽出処理の概要について、図５を参照しながら説明する。図５に示す通信コマンド抽出処理は、例えば、ユーザが入力装置３を介して通信コマンド抽出処理の実行を開始するための指令が入力されたことを契機として開始される。また、ソースコード記憶部１７１に記憶されているソースコードおよび関数記憶部１７２に記憶されている関数形状は、ユーザにより入力装置３を介して入力されることにより、予め格納されているものとする。
【００４０】
まず、ソースコード取得部１４１は、ソースコード記憶部１７１からソースコードを取得する（ステップＳ１）。ソースコード取得部１４１は、例えば、図３に示すような、Ｃ言語で記述されたソースコードを取得する。
【００４１】
次に、メソッド探索部１４２は、通信メソッド関数探索処理を実行する（ステップＳ２）。これにより、メソッド探索部１４２は、ソースコードにおける通信メソッド関数が記述された行の識別情報および当該行に存在する通信メソッド関数の個数を、識別情報・個数記憶部１７８に記憶させる。なお、通信メソッド関数探索処理の詳細は後述する。
【００４２】
続いて、引数抽出・判定部１４３、分岐判定部１４４および数値抽出部１４５は、協働して引数抽出・判定処理を実行する（ステップＳ３）。これにより、引数抽出・判定部１４３または数値抽出部１４５は、通信コマンドまたは分岐部内通信コマンドに代入される数値を、第１数値記憶部１７５、第２数値記憶部１７６または第３数値記憶部１７７のいずれかに記憶させる。なお、引数抽出・判定処理の詳細は後述する。
【００４３】
その後、結果表示部１４６は、通信メソッド関数の位置並びに通信コマンドの数値および分岐部内通信コマンドの数値を、出力部１２を介して出力装置５に表示する（ステップＳ４）。結果表示部１４６は、例えば図４に示すような画面を出力装置５に表示する。この場合、結果表示部１４６は、識別情報・個数記憶部１７８から取得した通信メソッド関数の位置（行）の識別情報（行番号）を、フィールドＦ１に表示する。また、結果表示部１４６は、第１数値記憶部１７５から取得した数値を、フィールドＦ２に表示し、第２数値記憶部１７６から取得した数値を、フィールドＦ３１に表示し、第３数値記憶部１７７から取得した数値を、フィールドＦ３２に表示する。
【００４４】
次に、図５における通信メソッド関数探索処理（ステップＳ２）の内容について、図６を参照しながら詳細に説明する。
【００４５】
まず、メソッド探索部１４２は、取得したソースコード全体を一行毎に第１リストに格納していく（ステップＳ１０１）。第１リストは、例えば文字型の変数と、次の第１リストのアドレスを示すポインタと、をメンバとする構造体として定義される。ここにおいて、メソッド探索部１４２は、まず、ＲＡＭ１６の作業領域等に第１リストのための領域を準備する。そして、メソッド探索部１４２は、ソースコードを一行ずつ第１リストに格納していき、複数の第１リストそれぞれにソースコード一行分の文字列を格納する。これにより、例えばソースコード全体の行数をＮ行とすると、Ｎ個の第１リストが生成される。
【００４６】
次に、メソッド探索部１４２は、例えば前述のＮ個の第１リストの先頭の第１リストのアドレスを特定する（ステップＳ１０２）。先頭の第１リストのアドレスとは、ＲＡＭ１６の作業領域内における先頭の第１リストの位置を示すアドレスである。
【００４７】
続いて、メソッド探索部１４２は、特定した第１リストに格納された文字列において、対象となる通信メソッド関数の形状を表す文字列（対象文字列）を検索する（ステップＳ１０３）。具体的には、メソッド探索部１４２は、関数記憶部１７２から通信メソッド関数の形状を表す対象文字列を取得し、第１リストに格納された文字列の中からパターンマッチングを利用して検索する。例えば、メソッド探索部１４２は、図３のソースコードが格納された第１リストそれぞれから、通信メソッド関数「ｓｅｎｄ（・・・）；」を表す文字列パターン「ｓｅｎｄ」を検索する。
【００４８】
その後、メソッド探索部１４２は、第１リストに格納された文字列内において、対象文字列を検出したか否かを判定する（ステップＳ１０４）。
【００４９】
ステップＳ１０４において、対象文字列が検出されなかった場合（ステップＳ１０４：Ｎｏ）、メソッド探索部１４２は、そのまま後述のステップＳ１０７の処理を行う。
【００５０】
一方、ステップＳ１０４において、対象文字列が検出された場合（ステップＳ１０４：Ｙｅｓ）、メソッド探索部１４２は、対象文字列が格納された第１リストの識別情報を識別情報・個数記憶部１７８に記憶させる（ステップＳ１０５）。識別情報は、例えば、ソースコードにおける対象文字列が存在する行の行番号から構成される。例えば、メソッド探索部１４２は、図３のソースコードの８１行目の文字列が格納された第１リストが検索対象となっている場合、当該文字列の中から対象文字列「ｓｅｎｄ」を検出する。すると、メソッド探索部１４２は、ソースコードの８１行目を示す行番号である「８１」を識別情報・個数記憶部１７８に記憶させる。
【００５１】
次に、メソッド探索部１４２は、対象文字列が格納された第１リストに含まれる対象文字列の個数を識別情報・個数記憶部１７８に記憶させる（ステップＳ１０６）。ここで、メソッド探索部１４２は、第１リストに含まれる対象文字列の個数を、当該第１リストの識別情報と対応づけた形で識別情報・個数記憶部１７８に記憶させる。
図３に示すソースコードでは、８１行目に通信メソッド関数「ｓｅｎｄ（・・・）；」および「ｗｒｉｔｅ（・・・）；」が存在し、１０１行目に通信メソッド関数「ｓｅｎｄ（・・・）；」が存在する。すると、メソッド探索部１４２は、行番号「００８１」に含まれる対象文字列の個数を「２」、行番号「０１０１」に含まれる対象文字列の個数を「１」として識別情報・個数記憶部１７８に記憶させる。
【００５２】
続いて、メソッド探索部１４２は、対象文字列の検索を終了した第１リストの次の第１リストのアドレスを特定する（ステップＳ１０７）。次の第１リストのアドレスとは、ＲＡＭ１６の作業領域内における、対象文字列の検索を終了した第１リストに後続する第１リストの位置を示すアドレスである。例えば、図３に示すソースコードについて、メソッド探索部１４２は、８１行目が格納された第１リストについて対象文字列の検索を終了すると、８２行目が格納された第１リストのアドレスを特定する。
【００５３】
その後、メソッド探索部１４２は、次の第１リストのアドレスが存在しない（ＮＵＬＬ）か否かを判定する（ステップＳ１０８）。具体的には、メソッド探索部１４２は、次の第１リストのアドレスを示すポインタの内容がＮＵＬＬに設定されているか否かを判定する。
【００５４】
ステップＳ１０８において、次の第１リストのアドレスが存在すると判定されると（ステップＳ１０８：Ｎｏ）、メソッド探索部１４２は、再びステップＳ１０３の処理を行う。
一方、ステップＳ１０８において、次の第１リストのアドレスが存在しないと判定されると（ステップＳ１０８：Ｙｅｓ）、通信コマンド抽出処理に戻る。
【００５５】
メソッド探索部１４２が、図３に示すソースコードについて、ステップＳ１０３からＳ１０８の一連の処理を繰り返したとする。この場合、８１行目、１０１行目、１３１行目、１５５行目、１８５行目（図３の一点鎖線で囲まれた部分Ｔ１乃至Ｔ５参照）等の行番号が、識別情報・個数記憶部１７８に記憶される。
【００５６】
次に、図５における引数抽出・判定処理（ステップＳ３）について、図７を参照しながら詳細に説明する。
【００５７】
まず、引数抽出・判定部１４３は、先頭の第１リストのアドレスを特定する（ステップＳ２０１）。
【００５８】
次に、引数抽出・判定部１４３は、特定した第１リストに格納された文字列について、通信メソッド関数の形状を表す対象文字列を検索する（ステップＳ２０２）。具体的には、引数抽出・判定部１４３は、関数記憶部１７２から、対象となる通信メソッド関数の形状を表す対象文字列を取得し、第１リストに格納された文字列の中からパターンマッチングを利用して対象文字列を検索する。通信メソッド関数は、例えば「ｓｅｎｄ（・・・）；」という文字列で表される関数と定義されている。そして、引数抽出・判定部１４３は、第１リストに格納された文字列の中から、例えば左端部に「ｓｅｎｄ」、右端部に「；」が配置された文字列パターンを検索する。
【００５９】
続いて、引数抽出・判定部１４３は、第１リストに格納された文字列のうちの対象文字列の検索対象となっている文字列の中に対象文字列が有るか否かを判定する（ステップＳ２０３）。
【００６０】
ステップＳ２０３において、対象文字列の検索対象となっている文字列の中に対象文字列が無いと判定されると（ステップＳ２０３：Ｎｏ）、引数抽出・判定部１４３は、後述のステップＳ２１２の処理を行う。
一方、ステップＳ２０３において、対象文字列の検索対象となっている文字列の中に対象文字列が有ると判定されると（ステップＳ２０３：Ｙｅｓ）、引数抽出・判定部１４３は、対象文字列の中から、第１検索文字列を検索する（ステップＳ２０４）。ここで、第１検索文字列は、通信メソッド関数の引数を入力するフィールドの左端を示す「（」に設定されている。
【００６１】
その後、引数抽出・判定部１４３は、対象文字列の中から、第２検索文字列を検索する（ステップＳ２０５）。ここで、第２検索文字列は、通信メソッド関数の引数を入力するフィールドの右端を示す「）」に設定されている。
【００６２】
次に、引数抽出・判定部１４３は、対象文字列の中から、第１検索文字列と第２検索文字列との間に囲まれた文字列の中から通信コマンドに相当する引数を抽出する（ステップＳ２０６）。ここで、引数抽出・判定部１４３は、関数記憶部１７２から引数に関する情報を取得し、取得した引数に関する情報に基づいて、通信コマンドに相当する引数を抽出する。例えば、通信メソッド関数が、図３のソースコードの１０１行目（一点鎖線で囲まれた部分Ｔ２参照）に示すように、「ｓｅｎｄ（ｓｏｃｋｆｄ,ＰＯＷＥＲ＿ＯＮ,ｌｅｎ,０）」であるとする。この場合、引数抽出・判定部１４３は、関数記憶部１７２に記憶されている引数情報に基づいて、２番目の引数「ＰＯＷＥＲ＿ＯＮ」を抽出する。
【００６３】
続いて、引数抽出・判定部１４３は、抽出した通信コマンドを引数記憶部１７３に記憶する（ステップＳ２０７）。
【００６４】
その後、引数抽出・判定部１４３は、引数記憶部１７３に記憶された通信コマンドが変数か数値かを判定する（ステップＳ２０８）。ここで、引数抽出・判定部１４３は、フォーマット記憶部１７９から、ソースコードのプログラミング言語における文字フォーマットと数値フォーマットとに関する情報を取得し、取得した情報に基づいて判定する。具体的には、引数抽出・判定部１４３は、通信コマンドにａ乃至ｚが含まれている場合、通信コマンドは変数であると判定する。一方、引数抽出・判定部１４３は、通信コマンドが０乃至９のみから構成される場合、通信コマンドが数値であると判定する。
【００６５】
ステップＳ２０８において、通信コマンドが変数であると判定されると（ステップＳ２０８：Ｙｅｓ）、分岐判定部１４４が、分岐判定処理を行う（ステップＳ２１１）。なお、分岐判定処理の詳細は後述する。
【００６６】
一方、ステップＳ２０８において、通信コマンドが数値であると判定されると（ステップＳ２０８：Ｎｏ）、数値抽出部１４５が、通信コマンドの数値を第１数値記憶部１７５に記憶させる（ステップＳ２０９）。その後、引数抽出・判定部１４３は、第１リスト内の検索が終了したか否かを判定する（ステップＳ２１０）。具体的には、引数抽出・判定部１４３は、通信メソッド関数を表す文字列の右端部の「；」が第１リストに格納された文字列の最後に相当するか否かを判定する。
【００６７】
ステップＳ２１０において、第１リストの検索が終了していないと判定されると（ステップＳ２１０：Ｎｏ）、再びステップＳ２０２の処理を行う。
一方、ステップＳ２１０において、第１リストの検索が終了したと判定されると（ステップＳ２１０：Ｙｅｓ）、引数抽出・判定部１４３は、対象文字列の検索を終了した第１リストの次の第１リストのアドレスを特定する（ステップＳ２１２）。具体的には、引数抽出・判定部１４３は、次の第１リストのアドレスを示すポインタの内容を取得する。
【００６８】
その後、引数抽出・判定部１４３は、次の第１リストのアドレスが存在しない（ＮＵＬＬ）か否かを判定する（ステップＳ２１３）。具体的には、引数抽出・判定部１４３は、次の第１リストのアドレスを示すポインタの内容がＮＵＬＬに設定されているか否かを判定する。
【００６９】
ステップＳ２１３において、次の第１リストのアドレスが存在すると判定されると（ステップＳ２１３：Ｎｏ）、引数抽出・判定部１４３は、再びステップＳ２０２の処理を行う。
一方、ステップＳ２１３において、次の第１リストのアドレスが存在しないと判定されると（ステップＳ２１３：Ｙｅｓ）、通信コマンド抽出処理に戻る。
【００７０】
次に、図７における分岐判定処理（ステップＳ２１１）について、図８を参照しながら詳細に説明する。
【００７１】
まず、分岐判定部１４４は、先頭の第１リストのアドレスを特定する（ステップＳ３０１）。
【００７２】
次に、分岐判定部１４４は、特定した第１リストに格納された文字列について、分岐部分を検索する（ステップＳ３０２）。ここでは、分岐判定部１４４は、分岐判定文字列記憶部１８０から分岐判定文字列を取得し、取得した分岐判定文字列を用いて分岐部分の検索を行う。分岐判定部１４４は、第１リストに格納された文字列の中からパターンマッチングを利用して分岐判定文字列を検索する。分岐部分が、例えば「ｉｆ（・・・）｛・・・｝」または「ｅｌｓｅ  ｉｆ（・・・）｛・・・｝」で表されるとする。この場合、分岐判定部は、第１リストに格納された文字列の中から、「ｉｆ」または「ｅｌｓｅ  ｉｆ」の文字列パターンを検索する。
【００７３】
続いて、分岐判定部１４４は、第１リストに格納された文字列のうちの分岐部分の検索対象となっている文字列の中に分岐部分が有るか否かを判定する（ステップＳ３０３）。
【００７４】
ステップＳ３０３において、分岐部分の検索対象となっている文字列の中に分岐部分が有ると判定されると（ステップＳ３０３：Ｙｅｓ）、分岐判定部１４４は、分岐部分を構成する文字列の中から、第３検索文字列を検索する（ステップＳ３０４）。ここで、第３検索文字列は、分岐部分を構成する文字列のうち条件式フィールド「（・・・）」の右隣に配置され、分岐部分の処理内容を記述するフィールドの先頭に配置される文字列「｛」に設定されている。
【００７５】
その後、分岐判定部１４４は、分岐部分を構成する文字列の中から、第４検索文字列を検索する（ステップＳ３０５）。ここで、第４検索文字列は、分岐部分の処理内容を記述するフィールドの最後に配置される文字列「｝」に設定されている。
【００７６】
次に、分岐判定部１４４は、分岐部分を構成する文字列の中で第４検索文字列が検出されたか否かを判定する（ステップＳ３０６）。
【００７７】
ステップＳ３０６において、第４検索文字列が検出されなかったと判定されると（ステップＳ３０６：Ｎｏ）、分岐判定部１４４は、対象文字列の検索を終了した第１リストの次の第１リストのアドレスを特定し（ステップＳ３０７）、特定した第１リストについて、第４検索文字列を検索する（ステップＳ３０５）。
【００７８】
一方、ステップＳ３０６において、第４検索文字列が検出されたと判定されると（ステップＳ３０６：Ｙｅｓ）、分岐判定部１４４は、第３検索文字列と第４検索文字列とで囲まれた文字列（以下、「分岐部内文字列」と称する。）を抽出する（ステップＳ３０８）。ここで、第３検索文字列と第４検索文字列とが異なる第１リストに格納されているとする。この場合、分岐判定部１４４は、第３検索文字列が格納された第１リストと第４検索文字列が格納された第１リストに格納された文字列のみならず、これら２つの第１リストの間の第１リストに格納された文字列をも抽出する。
【００７９】
続いて、分岐判定部１４４は、抽出した分岐部内文字列を第２リストに格納する（ステップＳ３０９）。第２リストは、例えば、文字型の変数と次の第２リストのアドレスを示すポインタとをメンバとする構造体として定義される。ここにおいて、分岐判定部１４４は、まず、ＲＡＭ１６の作業領域等に第２リストのための領域を準備する。そして、分岐判定部１４４は、抽出した分岐部内文字列を第２リストに格納していく。
その後、分岐判定部１４４は、再びステップＳ３０２の処理を行う。
【００８０】
分岐判定部１４４が、図３に示すソースコードについて、ステップＳ３０２からステップＳ３０９の処理を繰り返し行ったとする。この場合、７１行目から７３行目、１１１行目から１３５行目、１４１行目から１６１行目、１７１行目から１９１行目、２０１行目から２１１行目の文字列等（図３の破線で囲まれた部分Ｂ１乃至Ｂ５参照）が、抽出される。
【００８１】
また、ステップＳ３０３において、分岐部分が無いと判定されると（ステップＳ３０３：Ｎｏ）、分岐判定部１４４は、対象文字列の検索を終了した第１リストの次の第１リストのアドレスを特定する（ステップＳ３１０）。具体的には、分岐判定部１４４は、次の第１リストのアドレスを示すポインタの内容を取得する。
【００８２】
次に、分岐判定部１４４は、次の第１リストのアドレスが存在しない（ＮＵＬＬ）か否かを判定する（ステップＳ３１１）。具体的には、分岐判定部１４４は、次の第１リストのアドレスを示すポインタの内容がＮＵＬＬに設定されているか否かを判定する。
【００８３】
ステップＳ３１１において、次の第１リストのアドレスが存在すると判定されると（ステップＳ３１１：Ｎｏ）、分岐判定部１４４は、再びステップＳ３０２の処理を行う。
一方、ステップＳ３１１において、次の第１リストのアドレスが存在しないと判定されると（ステップＳ３１１：Ｙｅｓ）、分岐判定部１４４は、先頭の第２リストのアドレスを特定する（ステップＳ３１２）。
【００８４】
続いて、分岐判定部１４４は、第２リストに格納された分岐部内文字列について、代入文を検索する（ステップＳ３１３）。ここで、代入文は、「（変数）＝（変数）」または「（変数）＝（数値）」の形となる部分に相当する。分岐判定部１４４は、これらの代入文を、パターンマッチングを利用して検索する。分岐判定部１４４は、図３に示すソースコードの１２１行目が格納された第２リストから、代入文の「ａ＝ｂ」（図３の点線で囲まれた部分Ｄ１参照）を検出する。また、分岐判定部１４４は、図３に示すソースコードの１５１行目が格納された第２リストから、代入文「ａ＝ｃ」（図３の点線で囲まれた部分Ｄ２参照）を検出する。更に、分岐判定部１４４は、図３に示すソースコードの１８１行目が格納された第２リストから、代入文「ａ＝１１１０」（図３の点線で囲まれた部分Ｄ３参照）を検出する。
【００８５】
その後、分岐判定部１４４は、第２リストに格納された分岐部内文字列のうちの代入文の検索対象である文字列の中に、代入文が有るか否かを判定する（ステップＳ３１４）。
ステップＳ３１４において、代入文が無いと判定されると（ステップＳ３１４：Ｎｏ）、数値抽出部１４５が、数値抽出処理を行う（ステップＳ３１９）。分岐判定部１４４は、例えば図３に示すソースコードの７１行目から７４行目の分岐部分（図３の破線で囲まれた部分Ｂ１参照）の分岐部内文字列について、代入文が無いと判定する。また、分岐判定部１４４は、２０１行目から２１１行目の分岐部分（図３の破線で囲まれた部分Ｂ５）の分岐部内文字列についても、代入文が無いと判定する。
一方、ステップＳ３１４において、代入文が有ると判定されると（ステップＳ３１４：Ｙｅｓ）、分岐判定部１４４は、代入文の左辺と、引数記憶部１７３に記憶されている通信コマンドとを比較する（ステップＳ３１５）。具体的には、分岐判定部１４４は、パターンマッチングを利用して比較を行う。
【００８６】
次に、分岐判定部１４４は、数式の左辺が引数記憶部１７３に記憶されている通信コマンドに一致したか否かを判定する（ステップＳ３１６）。引数記憶部１７３に記憶されている通信コマンドは、通信メソッド関数の引数となるものである。従って、数式の左辺が、引数記憶部１７３に記憶されている通信コマンドに一致すれば、当該数式の左辺は通信メソッド関数の引数に相当することになる。そして、当該数式の右辺は、通信コマンドの数値または変数を示すことになる。
【００８７】
ステップＳ３１６において、数式の左辺が通信コマンドに一致しないと判定されると（ステップＳ３１６：Ｎｏ）、数値抽出部１４５が、数値抽出処理を行う（ステップＳ３１９）。
一方、ステップＳ３１６において、数式の左辺が通信コマンドに一致すると判定されると（ステップＳ３１６：Ｙｅｓ）、分岐判定部１４４は、数式の左辺に一致する通信コマンド（以下、「分岐部内通信コマンド」と称する。）を分岐判定結果記憶部１７４に記憶させる（ステップＳ３１７）。
【００８８】
続いて、分岐判定部１４４は、分岐判定結果記憶部１７４に記憶させた通信コマンドを引数記憶部１７３から削除し（ステップＳ３１８）、再びステップＳ３１３の処理を行う。
【００８９】
ステップＳ３１９において、数値抽出部１４５による数値抽出処理が行われた後、分岐判定部１４４は、代入文の検索を終了した第２リストの次の第２リストのアドレスを特定する（ステップＳ３２０）。具体的には、分岐判定部１４４は、次の第２リストのアドレスを示すポインタの内容を取得する。
その後、分岐判定部１４４は、次の第２リストのアドレスが存在しない（ＮＵＬＬ）か否かを判定する（ステップＳ３２１）。具体的には、分岐判定部１４４は、次の第２リストのアドレスを示すポインタの内容がＮＵＬＬに設定されているか否かを判定する。
【００９０】
ステップＳ３２１において、次の第２リストのアドレスが存在すると判定されると（ステップＳ３２１：Ｎｏ）、分岐判定部１４４は、再びステップＳ３１３の処理を行う。
一方、ステップＳ３２１において、次の第２リストのアドレスが存在しないと判定されると（ステップＳ３２１：Ｙｅｓ）、通信コマンド抽出処理に戻る。
【００９１】
次に、図９における数値抽出処理（ステップＳ３１９）について、図１０を参照しながら詳細に説明する。
【００９２】
まず、数値抽出部１４５は、引数抽出・判定部１４３が抽出した通信コマンドが引数記憶部１７３に記憶されている通信コマンドであるか否かを判定する（ステップＳ４０１）。
【００９３】
ステップＳ４０１において、通信コマンドが引数記憶部１７３に記憶されていると判定されると（ステップＳ４０１：Ｙｅｓ）、数値抽出部１４５は、通信コマンドに数値が代入されている位置を特定する（ステップＳ４０２）。ここでは、数値抽出部１４５が、全ての第１リストについて、パターンマッチングを利用して順に検索していき、通信コマンドに数値が代入されている位置を特定する。
図３に示すソースコードに記述されている通信コマンド「ＰＯＷＥＲ＿ＯＮ」は、引数記憶部１７３に記憶されている。そして、数値抽出部１４５は、５１行目の代入文「ＰＯＷＥＲ＿ＯＮ＝０１０１」（破線で囲まれた部分Ｄ４参照）を特定する。
また、数値抽出部１４５は、通信コマンドに数値が代入されている位置を複数検出した場合、引数抽出・判定部１４３が通信コマンドを抽出した位置よりも前であり、当該抽出した位置に最も近い位置を特定する。
図３に示すソースコードにおいて、例えば、４５行目に代入文「ＰＯＷＥＲ＿ＯＮ＝０１１１」（図示せず）が記述されていたとする。この場合、引数抽出・判定部１４３は、通信コマンド「ＰＯＷＥＲ＿ＯＮ」を抽出した位置が１０１行目であるので、数値抽出部１４５は、１０１行目に最も近い５１行目の代入文を特定する。
【００９４】
続いて、数値抽出部１４５は、特定した位置から数値を抽出する（ステップＳ４０３）。図３に示すように、特定した位置（破線で囲まれた部分Ｄ４参照）に、代入文「ＰＯＷＥＲ＿ＯＮ＝０１０１」が記述されている場合、数値抽出部１４５は、当該代入文の右辺の数値「０１０１」を抽出する。
【００９５】
その後、数値抽出部１４５は、抽出した数値を第２数値記憶部１７６に記憶させる（ステップＳ４０４）。その後、分岐判定部１４４が、分岐判定処理を再開する。
【００９６】
一方、ステップＳ４０１において、通信コマンドが分岐判定結果記憶部１７４に記憶されている、即ち、通信コマンドが分岐部内通信コマンドであると判定されたとする（ステップＳ４０１：Ｎｏ）。この場合、数値抽出部１４５は、分岐部内通信コマンドに数値または変数を代入する代入文の位置を特定する（ステップＳ４０５）。ここでは、数値抽出部１４５が、全ての第１リストについて、パターンマッチングを利用して順に検索していき、通信コマンドに数値または変数を代入する代入文の位置を特定する。
【００９７】
数値抽出部１４５は、例えば、図３に示すソースコードの各行が格納された第１リストについて、その先頭から順番に代入文を検索する。この場合、数値抽出部１４５は、ソースコードの１２１行目が格納された第１リストにおいて代入文「ａ＝ｂ」（破線で囲まれた部分Ｄ１参照）を検出する。また、数値抽出部１４５は、図３に示すソースコードについて、１２１行目の代入文「ａ＝ｂ」の直後の文字列から代入文の検索を行う。そして、数値抽出部１４５は、ソースコードの１５１行目が格納された第１リストにおいて代入文「ａ＝ｃ」（破線で囲まれた部分Ｄ２参照）を検出する。更に、数値抽出部１４５は、１５１行目の代入文「ａ＝ｃ」の直後の文字列から代入文の検索を行う。そして、数値抽出部１４５は、ソースコードの１８１行目が格納された第１リストにおいて代入文「ａ＝１１１０」（破線で囲まれた部分Ｄ３）を検出する。以後、数値抽出部１４５は、ソースコードの最終行が格納された第１リストまで、代入文の検索を行う。
【００９８】
次に、数値抽出部１４５は、分岐部内通信コマンドに変数が代入されているか否かを判定する（ステップＳ４０６）。ここでは、数値抽出部１４５は、フォーマット記憶部１７９から、ソースコードのプログラミング言語における文字フォーマットと数値フォーマットとに関する情報を取得し、取得した情報に基づいて判定する。具体的には、数値抽出部１４５は、特定した位置に記述されている代入文の右辺にａ乃至ｚが含まれている場合、分岐部内通信コマンドは変数であると判定する。一方、数値抽出部１４５は、特定した位置に記述されている代入文の右辺が０乃至９のみから構成される場合、分岐部内通信コマンドが数値であると判定する。
数値抽出部１４５は、例えば図３に示すソースコードの１２１行目の代入文「ａ＝ｂ」（破線で囲まれた部分Ｄ１参照）から、分岐部内通信コマンドが変数であると判定する。一方、数値抽出部１４５は、図３に示すソースコードの１８１行目の代入文「ａ＝１１１０」（破線で囲まれた部分Ｄ３参照）から、分岐部内通信コマンドが数値であると判定する。
【００９９】
ステップＳ４０６において、分岐部内通信コマンドに数値が代入されていると判定されると（ステップＳ４０６：Ｎｏ）、数値抽出部１４５は、特定した位置に記述されている代入文の右辺から数値を抽出し（ステップＳ４０７）、抽出した数値を第３数値記憶部１７７に記憶させる（ステップＳ４１０）。
一方、ステップＳ４０６において、分岐部内通信コマンドに変数が代入されていると判定されると（ステップＳ４０６：Ｙｅｓ）、数値抽出部１４５は、変数に数値が代入されている位置を特定する（ステップＳ４０８）。ここでは、数値抽出部１４５が、ソースコードが格納されている全ての第１リストについて、パターンマッチングを利用して順に検索していき、変数に数値が代入されている位置を特定する。
数値抽出部１４５は、例えば図３に示すソースコードについて、６１行目の代入文「ｂ＝１１１１」および６２行目の代入文「ｃ＝１０００」（破線で囲まれた部分Ｄ５、Ｄ６）の位置（行番号）を特定する。
【０１００】
続いて、数値抽出部１４５は、特定した位置（行番号）に記述された代入文から数値を抽出する（ステップＳ４０９）。数値抽出部１４５は、図３に示すように、特定した位置（破線で囲まれた部分Ｄ５参照）に、代入文「ｂ＝１１１１」が記述されている場合、当該代入文の右辺の数値「１１１１」を抽出する。また、数値抽出部１４５は、特定した位置（破線で囲まれた部分Ｄ６参照）に、代入文「ｃ＝１０００」が記述されている場合、当該代入文の右辺の数値「１０００」を抽出する。
【０１０１】
その後、数値抽出部１４５は、抽出した数値を第３数値記憶部１７７に記憶させる（ステップＳ４１０）。
【０１０２】
数値抽出部１４５によるステップＳ４１０の処理の後、分岐判定部１４４による分岐判定処理に戻る。
【０１０３】
以上のように、本実施の形態に係るソースコード解析装置１によれば、ソースコードにおける通信メソッド関数の位置をユーザに通知することができる。これにより、ソースコードが実施すべき試験項目とは直接関係しない処理を行うサブルーチンを含む場合でも、ユーザは、当該サブルーチンと通信メソッド関数との位置関係から通信メソッド関数を処理しないサブルーチンを判別することができる。従って、ユーザは、通信メソッド関数を処理しないサブルーチンの処理を避けるように試験項目を作成することができるので、無駄な試験の実施を抑制できる。
【０１０４】
また、本実施の形態に係るソースコード解析装置１によれば、数値抽出部１４５が、通信コマンドが変数である場合、当該変数に数値を代入する代入文を検索し、検出した代入文に基づいて、通信コマンドに代入される数値を抽出する。そして、結果表示部１４６が、数値抽出部１４５が抽出した通信コマンドの数値を出力装置５に出力する。これにより、ユーザは、ソースコードにおいて使用されている通信コマンドに代入される数値の全てを確認することができるので、ソースコードにおける通信コマンドに関する代入文に誤りがある場合、この誤りをすぐに見つけることができる。従って、通信試験におけるエラー原因の早期究明を図ることができる。
【０１０５】
また、本実施の形態に係るソースコード解析装置１では、引数抽出・判定部１４３または数値抽出部１４５が、ソースコードから通信コマンドを示す数値を漏れなく抽出する。これにより、通信試験で実施すべき試験項目の漏れの発生を抑制することができるので、通信試験の質の向上を図ることができる。
【０１０６】
また、本実施の形態に係るソースコード解析装置１では、分岐判定部１４４が、ソースコードにおける分岐部分を検索し、分岐部分において通信コマンドに変数または数値を代入されているか否かを判定する。そして、分岐判定部１４４は、分岐部分において通信コマンドに変数または数値を代入されていると判定すると、通信コマンドを分岐判定結果記憶部１７４に記憶させる。数値抽出部１４５は、通信コマンドが分岐判定結果記憶部１７４に記憶されているか否かに応じて、通信コマンドが分岐部内通信コマンドであるか否かを判別する。そして、数値抽出部１４５は、分岐部内通信コマンドに代入された数値を、他の通信コマンドに代入された数値と区別して第３数値記憶部１７７に記憶させる。結果表示部１４６は、第３数値記憶部１７７から取得した数値を、分岐部内通信コマンドとして出力する。
これにより、分岐部分で使用されている通信コマンドの数値が、分岐部分以外で使用されている通信コマンドと区別できる形で出力されるので、ユーザは、各通信コマンドが分岐部分内または分岐部分外のいずれで使用されているかを考慮しながら試験項目を作成することができる。従って、実施すべき試験項目の妥当性向上を図ることができる。
【０１０７】
また、本実施の形態に係るソースコード解析装置１によれば、数値抽出部１４５が、分岐部内通信コマンド変数が代入されていると判定した場合、ソースコードにおいて当該変数に代入される数値を検索して抽出する。これにより、ソースコードが、分岐部内通信コマンドに変数を代入する代入文を含む場合でも、数値抽出部１４５は、分岐部内通信コマンドに代入される数値を抽出することができる。
【０１０８】
また、本実施の形態に係るソースコード解析装置１によれば、数値抽出部１４５は、フォーマット記憶部１７９から取得した文字列フォーマットおよび数値フォーマットに基づいて、通信コマンドまたは分岐部内通信コマンドに変数または数値のいずれが代入されているかを判定する。これにより、フォーマット記憶部１７９が、複数種類のプログラミング言語の文字列フォーマットまたは数値フォーマットを記憶しているとする。この場合、数値抽出部１４５は、複数種類のプログラミング言語で記述されたソースコードについて適切な判定を行うことができる。
【０１０９】
以上、本発明の実施の形態について説明したが、本発明は実施の形態によって限定されるものではない。
【０１１０】
例えば、本実施の形態の引数抽出・判定処理において、対象文字列、第１検索文字列、第２検索文字列の検索を、メソッド探索部１４２が検出した、対象文字列を含む第１リストのみについて行うようにしてもよい。
【０１１１】
図１１は、変形例に係る引数抽出・判定処理の流れの一例を示すフローチャートである。図１１において、図７を用いて説明した処理と同一の処理については図７と同一の符号を付してある。
【０１１２】
まず、引数抽出・判定部１４３は、識別情報・個数記憶部１７８が記憶する識別情報に基づいて、対象文字列を含む第１リストのアドレスを特定する（ステップＳ５０１）。引数抽出・判定部１４３は、例えば図３に示すソースコードについて、行番号８１に対応する第１リストのアドレスを特定する。
【０１１３】
次に、引数抽出・判定部１４３は、識別情報・個数記憶部１７８から、特定した第１リストに対応する対象文字列の個数Ｍを取得する（ステップＳ５０２）。引数抽出・判定部１４３は、例えば図３に示すソースコードの行番号８１と対応づけて識別情報・個数記憶部１７８に記憶されている個数「２」を取得する。
【０１１４】
続いて、引数抽出・判定部１４３は、処理インデックスｍを「０」に設定し（０→ｍ）（ステップＳ５０３）、ステップＳ２０２の処理を行い、その後、ステップＳ２０４の処理を行う。
【０１１５】
以後、引数抽出・判定部１４３は、ステップＳ２０５乃至Ｓ２０９並びにＳ２１１までの処理を行い、その後、処理インデックスｍを１だけインクリメント（ｍ＋１→ｍ）する（ステップＳ５０４）。
【０１１６】
次に、引数抽出・判定部１４３は、処理インデックスｍが対象文字列の個数Ｍよりも１だけ小さい値よりも大きいか否かを判定する（ステップＳ５０５）。
ステップＳ５０５において、処理インデックスｍが対象文字列の個数Ｍよりも１だけ小さい値以下と判定されると（ステップＳ５０５：Ｎｏ）、引数抽出・判定部１４３は、ステップＳ２０２の処理を行う。
【０１１７】
一方、ステップＳ５０５において、処理インデックスｍが対象文字列の個数Ｍよりも１だけ小さい値よりも大きいと判定されると（ステップＳ５０５：Ｙｅｓ）、引数抽出・判定部１４３は、未処理の対象文字列を含む第１リストが存在するか否かを判定する（ステップＳ５０６）。
ステップＳ５０６において、未処理の対象文字列を含む第１リストが存在すると判定されると（ステップＳ５０６：Ｙｅｓ）、引数抽出・判定部１４３は、再びステップＳ５０１の処理に戻る。
【０１１８】
一方、ステップＳ５０６において、未処理の対象文字列を含む第１リストが存在しないと判定されると（ステップＳ５０６：Ｎｏ）、通信コマンド抽出処理に戻る。
【０１１９】
本構成によれば、引数抽出・判定処理における処理量を軽減することができるので、処理時間の短縮を図ることができる。
【０１２０】
また、本実施の形態の分岐判定処理において、分岐部内文字列について通信コマンドの検索を行い、通信コマンドが存在する場合に、通信コマンドが存在する位置が、通信コマンドに変数または数値を代入している位置に相当するか否かを判定するようにしてもよい。
【０１２１】
図１２は、変形例に係る分岐判定処理の流れの一例の一部を示すフローチャートである。図１２において、図９を用いて説明した処理と同一の処理については図９と同一の符号を付してある。
分岐判定部１４４は、先頭の第２リストのアドレスを特定した後（ステップＳ３１２）、特定した第２リストに格納された文字列において、通信コマンドを検索する（ステップＳ６０１）。
【０１２２】
次に、分岐判定部１４４は、検索対象の文字列の中に通信コマンドが有るか否かを判定する（ステップＳ６０２）。分岐判定部１４４は、引数記憶部１７３に記憶されている通信コマンドを、パターンマッチングを利用して検索する。
【０１２３】
ステップＳ６０２において、通信コマンドが無いと判定されると（ステップＳ６０２：Ｎｏ）、数値抽出部１４５が、数値抽出処理を行う（ステップＳ３１９）。
一方、ステップＳ６０２において、通信コマンドが有ると判定されると（ステップＳ６０２：Ｙｅｓ）、分岐判定部１４４は、検出した通信コマンドの右隣の文字列を抽出する（ステップＳ６０３）。通信コマンドを検出した位置において、通信コマンドが通信メソッド関数の引数として記述されている場合（例えば、「ｗｒｉｔｅ（ｓｏｃｋｆｄ,ａ,ｌｅｎ）」）、分岐判定部１４４は、「，」を抽出する。
【０１２４】
続いて、分岐判定部１４４は、抽出した文字列が「＝」であるか否かを判定する（ステップＳ６０４）。
ステップＳ６０４において、抽出した文字列が「＝」ではないと判定されると（ステップＳ６０４：Ｎｏ）、数値抽出部１４５が、数値抽出処理を行い（ステップＳ３１９）、その後、分岐判定部１４４は、ステップＳ３２０以降の処理を行う。
一方、ステップＳ６０４において、抽出した文字列が「＝」であると判定されると（ステップＳ６０４：Ｙｅｓ）、分岐判定部１４４は、通信コマンドを分岐判定結果記憶部１７４に記憶させ（ステップＳ３１７）、ステップＳ３１８以降の処理を行う。
【０１２５】
本構成によれば、分岐部分に通信メソッド関数が記述されていない場合、通信コマンドに関係のない代入文について、当該代入文に通信コマンドが含まれるか否かを判定する処理が省略される。従って、分岐部分に通信メソッド関数が記述されていない場合における処理量の軽減を図ることができる。
【０１２６】
また、本実施の形態において、ソースコード記憶部、引数記憶部、分岐判定結果記憶部、第１数値記憶部、第２数値記憶部、第３数値記憶部、関数記憶部、識別情報・個数記憶部を、記憶部１７以外の構成が備えていてもよい。例えば、ＲＡＭ１６が、各種記憶部の少なくとも一部を備えていてもよい。例えば、記憶部１７が、ソースコード記憶部、第１数値記憶部、第２数値記憶部、第３数値記憶部、関数記憶部を備え、ＲＡＭ１６が、引数記憶部、分岐判定結果記憶部、識別情報・個数記憶部を備えていてもよい。
【０１２７】
本構成によれば、通信コマンド抽出処理において、制御部１４のアクセス回数が比較的大きくなる引数記憶部１７３、分岐判定結果記憶部１７４および識別情報・個数記憶部１７８を、制御部１４が比較的高速にアクセスできるＲＡＭ１６が有する。これにより、通信コマンド抽出処理の速度向上を図ることができる。
【０１２８】
また、本実施の形態において、メソッド探索部１４２が、ソースコードの一部に記述されたヘッダファイルの名前に基づいて、当該ヘッダファイルから通信コマンド関数の形状および引数に関する情報を取得し、関数記憶部１７２に記憶させるものであってもよい。
【０１２９】
例えば、ソースコードがＣ言語で記述されているとする。この場合、メソッド探索部１４２が、ソースコードの冒頭に記述されているヘッダファイルの名前（例えば、＃ｉｎｃｌｕｄｅ＜ｗｉｎｓｏｃｋ２．ｈ＞等）に基づいて、ヘッダファイルの中身を参照し、当該ヘッダファイル内に記述されている通信メソッド関数を取得してもよい。
【０１３０】
本構成によれば、ユーザが通信試験を実施する前に、予め通信メソッド関数を関数記憶部１７２に記憶させておく作業を行う必要がない。従って、ユーザの作業負担の軽減を図ることができる。
【０１３１】
また、本実施の形態において、ソースコードに記述された通信メソッド関数の引数が、通信コマンド１つだけの場合、関数記憶部１７２は、引数に関する情報を記憶していなくてもよい。これにより、関数記憶部１７２が必要とする記憶容量を低減することができる。
【０１３２】
また、本実施の形態において、制御部１４が、更に、ソースコードにおけるサブルーチン部分を判別するサブルーチン判別部を有してもよい。
具体的には、サブルーチン判別部が、ソースコードにおけるサブルーチンに対応する関数宣言文を検索し、検出した関数宣言文からサブルーチンを示す関数の形状および引数に関する情報を抽出する。次に、サブルーチン判別部は、抽出したサブルーチンを示す関数の形状および引数に関する情報を、例えば関数記憶部１７２に記憶させる。
【０１３３】
その後、サブルーチン判別部は、関数記憶部１７２に記憶されたサブルーチンを示す関数の形状および引数に基づいて、ソースコードにおけるサブルーチン部分を特定する。そして、サブルーチン判別部は、通信コマンドが特定したサブルーチン部分内に存在するか否かを判別する。
【０１３４】
本構成によれば、ソースコードにおいてサブルーチンを示す関数が定義されている場合、通信コマンドがソースコードのメインルーチンまたはサブルーチンのいずれで使用されているかを考慮してテストケースを作成することが可能となる。従って、実施すべき試験項目の妥当性向上を図ることができる。
【０１３５】
また、本実施の形態において、結果出力部は、ソースコードにおける通信メソッド関数の位置を示す識別情報を、試験装置へ出力するものであってもよい。
図１３は、変形例に係るソースコード解析装置２０１と、試験装置３０１とから構成される試験システムの機能構成を示すブロック図である。図１３において、図２と同一の構成については図９と同一の符号を付してある。また、図１３において、実線矢印は動作フローを表し、破線矢印はデータフローを表す。なお、ソースコード解析装置２０１と試験装置３０１とは、１つの装置で実現されていてもよい。また、ソースコード解析装置２０１と試験装置３０１とが別体であり、ソースコード解析装置２０１が、外部Ｉ／Ｆ部１３を介して試験装置３０１に接続されていてもよい。
【０１３６】
ソースコード解析装置２０１の結果出力部２４６は、識別情報・個数記憶部１７８に記憶された通信メソッド関数の位置を示す識別情報（行番号）を、試験装置３０１へ出力する。
【０１３７】
一方、試験装置３０１は、ソースコードを記憶するソースコード記憶部３１１と、ソースコードにおける分岐部分を検索する分岐部分検索部３１２と、分岐部分内に存在する通信メソッド関数を検索する分岐部内メソッド検索部３１３と、複数のテストケースを作成するテストケース作成部３１４と、各テストケースを実施するテスト実施部３１５と、テスト結果を表示するテスト結果出力部３１６と、を備える。
【０１３８】
分岐部分検索部３１２は、ソースコード記憶部３１１からソースコードを取得し、ソースコードにおける各分岐部分の位置（行番号）を検索し、識別できる形で位置を特定する。
分岐部内メソッド検索部３１３は、分岐部分検索部３１２により特定された各分岐部分の位置と、ソースコード解析装置２０１から取得した通信メソッド関数の位置を示す識別情報（行番号）に基づいて、通信メソッド関数を含む分岐部分の位置を特定する。
【０１３９】
テストケース作成部３１４は、分岐部内メソッド探索部３１３から、通信メソッド関数を含む分岐部分の位置に関する情報を取得する。そして、テストケース作成部３１４は、取得した通信メソッド関数を含む分岐部分の位置に関する情報に基づいて、複数のテストケースを作成する。ここで、テストケース作成部３１４は、通信メソッド関数を含む分岐部分が実行され、通信メソッド関数を含まない分岐部分がなるべく実行されないように、テストケースを作成する。
【０１４０】
テスト実施部３１５は、テストケース作成部３１４が作成したテストケースを実行する。
テスト結果出力部３１６は、テスト実施部３１５がテストケースを実行して得られる結果を出力する。
【０１４１】
本構成によれば、テストケース作成部３１４が、取得した通信メソッド関数を含む分岐部分に関する情報に基づいて、通信メソッド関数を含まない分岐部分がなるべく実行されないように、テストケースを作成することが可能となる。これにより、試験装置３０１による、通信メソッド関数に関連しない無駄な試験項目の実施を抑制できる。
【０１４２】
また、本実施の形態において、ソースコード記憶部１７１、引数記憶部１７３、分岐判定結果記憶部１７４、第１数値記憶部１７５、第２数値記憶部１７６および第３数値記憶部１７７が、複数の記憶部から構成されるものであってもよい。
【０１４３】
また、本実施の形態において、第１リストおよび第２リストに代えて、配列を採用してもよい。
【０１４４】
また、本発明に係るソースコード解析装置１は、専用のシステムによらず、通常のコンピュータシステムを用いて実現可能である。例えば、ネットワークに接続されているコンピュータに、上記動作を実行するためのプログラムを、コンピュータシステムが読み取り可能な非一時的な記録媒体（ＣＤ−ＲＯＭ等）に格納して配布し、当該プログラムをコンピュータシステムにインストールすることにより、上述の処理を実行するソースコード解析装置１を構成してもよい。
【０１４５】
また、コンピュータにプログラムを提供する方法は任意である。例えば、プログラムは、通信回線の掲示版（ＢＢＳ）にアップロードされ、通信回線を介してコンピュータに配信されてもよい。そして、コンピュータは、このプログラムを起動して、ＯＳの制御の下、他のアプリケーションと同様に実行する。これにより、コンピュータは、上述の処理を実行するソースコード解析装置１として機能する。
【符号の説明】
【０１４６】
１、２０１  ソースコード解析装置、３  入力装置、５  出力装置、１１  入力部、１２  出力部、１３  外部Ｉ／Ｆ部、１４  制御部、１５  ＲＯＭ、１６  ＲＡＭ、１７  記憶部、１４１  ソースコード取得部、１４２  メソッド探索部、１４３  引数抽出・判定部、１４４  分岐判定部、１４５  数値抽出部、１４６  結果表示部、１７１、３１１  ソースコード記憶部、１７２  関数記憶部、１７３  引数記憶部、１７４  分岐判定結果記憶部、１７５  第１数値記憶部、１７６  第２数値記憶部、１７７  第３数値記憶部、１７８  識別情報・個数記憶部、１７９  フォーマット記憶部、１８０  分岐判定文字列記憶部、２４６  結果出力部、３０１  試験装置、３１２  分岐部分検索部、３１３  分岐部内メソッド検索部、３１４  テストケース作成部、３１５  テスト実施部、３１６  テスト結果出力部
【図１】
2016038800.tif 000003
【図２】
2016038800.tif 000004
【図３】
2016038800.tif 000005
【図４】
2016038800.tif 000006
【図５】
2016038800.tif 000007
【図６】
2016038800.tif 000008
【図７】
2016038800.tif 000009
【図８】
2016038800.tif 000010
【図９】
2016038800.tif 000011
【図１０】
2016038800.tif 000012
【図１１】
2016038800.tif 000013
【図１２】
2016038800.tif 000014
【図１３】
2016038800.tif 000015