JP6091471B2 - ソースコード解析装置、ソースコード解析方法およびソースコード解析プログラム - Google Patents

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

Info

Publication number
JP6091471B2
JP6091471B2 JP2014162986A JP2014162986A JP6091471B2 JP 6091471 B2 JP6091471 B2 JP 6091471B2 JP 2014162986 A JP2014162986 A JP 2014162986A JP 2014162986 A JP2014162986 A JP 2014162986A JP 6091471 B2 JP6091471 B2 JP 6091471B2
Authority
JP
Japan
Prior art keywords
numerical value
source code
unit
communication command
storage unit
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
JP2014162986A
Other languages
English (en)
Other versions
JP2016038800A (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
Priority to JP2014162986A priority Critical patent/JP6091471B2/ja
Publication of JP2016038800A publication Critical patent/JP2016038800A/ja
Application granted granted Critical
Publication of JP6091471B2 publication Critical patent/JP6091471B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Description

本発明は、ソースコード解析装置、ソースコード解析方法およびソースコード解析プログラムに関する。
組み込みシステムの通信試験では、当該組み込みシステムの仕様書の記載に基づいて、実施すべき試験項目が決定される。ここで、「通信試験」とは、通信機能を有する組み込み機器について仕様書に記載された通信機能が正常に実現されているか否かを確認する試験である。
ところで、組み込みシステムには、仕様書が存在せず、動作設定のためのソースコードのみが存在するものがある。また、分業による生産効率向上の観点から、組み込みシステムの仕様書作成の担当者とソースコード作成の担当者とが異なることが多い。この場合、仕様書作成の担当者とソースコード作成の担当者との意思疎通が上手くいかなければ、ソースコード作成の担当者がソースコードを更新したにも関わらず、それが仕様書の内容に反映されていないということが起こりうる。この場合、仕様書から実施すべき試験項目に関する情報が欠如しているため、実施すべき試験項目が十分に網羅されず、通信試験が不完全なものとなってしまう虞がある。
これに対して、従来、ソースコードに基づいて、自動的に試験項目を生成するソフトウェアテスト支援システムが提案されている(特許文献1参照)。
特許文献1に記載されたソフトウェアテスト支援システムでは、ソースコードを複数の単位サブルーチンに分類し、各単位サブルーチンの呼び出し関係を解析し、全ての呼び出しパターンを網羅するように、複数の試験項目を作成する。
特開平7−210424号公報
ソースコードには、実施すべき試験項目とは直接関係しない処理を行うサブルーチンが存在する場合がある。この場合、特許文献1に記載されたソフトウェアテスト支援システムは、実施すべき試験項目とは直接関係しない処理まで含めてテストケースを作成してしまう。このため、無駄な試験を実施してしまう虞がある。
また、ソースコードには、サブルーチン内で使用されている変数に数値を代入することを示す代入文が、当該サブルーチン以外の位置に存在するものがある。このようなソースコードにおいて代入文に誤りがあった場合、特許文献1に記載のソフトウェアテスト支援システムでは、エラー原因となっているサブルーチンは特定できるが、当該サブルーチンで使用されている変数に関する代入文の誤り箇所を特定することが困難である。従って、エラー原因の究明に時間を要してしまう虞がある。
本発明は、上記事由に鑑みてなされたものであり、無駄な試験の実施の抑制、並びに、試験エラーが発生した場合のエラー原因の早期究明に寄与しうるソースコード解析装置、ソースコード解析方法およびソースコード解析プログラムを提供することを目的とする。
上記目的を達成するために、本発明に係るソースコード解析装置は、
ソースコード群を記憶するソースコード記憶部と、
前記ソースコード記憶部に記憶された前記ソースコード群の中から1つのソースコードを取得するソースコード取得部と、
前記ソースコードにおいて、通信メソッド関数を表す対象文字列を探索し、探索した通信メソッド関数の前記ソースコードにおける位置を検出するメソッド探索部と、
前記通信メソッド関数の引数の少なくとも一部を通信コマンドとして抽出し、抽出した前記通信コマンドが変数または数値のいずれであるかを判定する引数抽出・判定部と、
数値記憶部と、
前記引数抽出・判定部により数値であると判定された前記通信コマンドの数値を前記数値記憶部に記憶させ、前記引数抽出・判定部により変数であると判定された前記通信コマンドに基づいて、前記ソースコードにおいて前記通信コマンドに代入される数値を検索して抽出し、抽出した数値を前記数値記憶部に記憶させる数値抽出部と、
前記メソッド探索部により探索された通信メソッド関数の位置と、前記数値記憶部に記憶された前記通信コマンドの数値と、を出力する位置・数値出力部と、を備える。
本発明は、無駄な試験の実施の抑制、並びに、試験エラーが発生した場合のエラー原因の早期究明に寄与しうる。
実施の形態に係るソースコード解析装置のハードウェア構成を示すブロック図である。 実施の形態に係るソースコード解析装置の機能構成を示すブロック図である。 実施の形態に係るソースコードの一例を示す図である。 実施の形態に係るソースコード解析装置の結果表示の一例を示す図である。 実施の形態に係る通信コマンド抽出処理の流れの一例を示すフローチャートである。 実施の形態に係る通信メソッド関数探索処理の流れの一例を示すフローチャートである。 実施の形態に係る引数抽出・判定処理の流れの一例を示すフローチャートである。 実施の形態に係る分岐判定処理の流れの一例の一部を示すフローチャートである。 実施の形態に係る分岐判定処理の流れの一例の一部を示すフローチャートである。 実施の形態に係る数値抽出処理の流れの一例を示すフローチャートである。 変形例に係る引数抽出・判定処理の流れの一例を示すフローチャートである。 変形例に係る分岐判定処理の流れの一例の一部を示すフローチャートである。 変形例に係るソースコード解析装置と、試験装置とから構成される試験システムの機能構成を示すブロック図である。
以下、本発明の実施の形態について添付図面を参照しながら説明する。
ソースコード解析装置1は、図1に示すように、ユーザが各種情報を入力するための入力部11と、各種情報を出力する出力部12と、外部機器に接続するための外部インターフェース(I/F)部13と、制御部14と、ROM(Read Only Memory)15と、RAM(Random Access Memory)16と、記憶部17と、から構成される。
入力部11は、マウスやキーボード等の入力装置3と接続されている。入力部11は、ユーザが入力装置3を用いて入力する各種情報を受け付ける。
出力部12は、液晶ディスプレイ等の出力装置5に接続されている。出力部12は、制御部14から入力された各種情報を出力する。
外部I/F部13は、CD(Compact Disc)等のリムーバブルディスクに対して読み書きするためのドライブ装置(図示せず)等に接続されている。また、外部のネットワーク(例えば、インターネット、LAN(Local Area Network)等)に接続するための装置や、制御部14が生成した情報を印字するためのプリンタに接続されていてもよい。
制御部14は、例えば、CPU(Central Processing Unit)から構成されており、ソースコード解析装置1の全体の制御を行う。例えば、制御部14は、通信コマンド抽出処理を実行する。通信コマンド抽出処理の詳細については後述する。
ROM15は、不揮発性メモリから構成され、制御部14がソースコード解析装置1の全体を制御するためのプログラム等を格納する。ROM15は、例えば通信コマンド抽出処理を実行するためのプログラムを格納している。
RAM16は、揮発性メモリから構成される。RAM16の一部には、制御部14が処理を行うために必要なデータ等が一時的に格納される作業領域が設けられる。
記憶部17は、ハードディスクドライブ等の記憶装置から構成される。
記憶部17は、ソースコード群を記憶するソースコード記憶部171と、後述の通信メソッド関数の引数である通信コマンドを記憶する引数記憶部173と、分岐部分内に存在すると判定された通信コマンドを記憶する分岐判定結果記憶部174と、第1数値記憶部175と、第2数値記憶部176と、第3数値記憶部177と、通信メソッド関数を記憶する関数記憶部172と、通信メソッド関数のソースコードにおける位置を示す行の識別情報並びに同一行に存在する通信メソッド関数の個数を記憶する識別情報・個数記憶部178と、フォーマット記憶部179と、分岐判定文字列記憶部180と、を有する。
ソースコード記憶部171は、複数の組み込みシステムのソースコードから構成されるソースコード群を記憶している。各ソースコードは、通常、組み込みシステムの機種に応じて異なる。
関数記憶部172は、予め、通信メソッド関数の形状または引数に関する情報を記憶している。ここで、「通信メソッド」とは、例えばデータの送受信等通信に関連する処理である。また、「通信メソッド関数」は、通信を実施するための関数を含む通信に関連する処理を行う関数である。
通信メソッド関数の形状に関する情報は、「send();」、「write();」等の通信メソッド関数の形状を表す文字列から構成される。
通信メソッド関数の引数に関する情報は、通信メソッド関数の引数フィールドの何番目の引数が通信コマンドに相当するかを示す情報から構成される。ここで、「通信コマンド」とは、例えば組み込みシステムにおいて、マイクロコンピュータとメモリとの間で通信するための通信メソッド関数の引数フィールドに入力する数値等から構成される。例えば、通信メソッド関数「send(socket,msg,msgLength,flag);」の場合、通信コマンドが、2番目に相当することを示す情報である。また、関数記憶部172は、この引数に関する情報を、当該通信コマンド関数に対応づけた形で記憶している。
引数記憶部173は、ソースコードに記述された通信メソッド関数から抽出された通信コマンドを記憶する。通信コマンドは、後述の引数抽出・判定部143により抽出される。
分岐判定結果記憶部174は、分岐条件により処理内容が変化する分岐部分に存在する文字列(以下、「分岐部内文字列」と称する。)に存在する通信コマンドを記憶する。
第1数値記憶部175は、引数抽出・判定部143で抽出される数値を記憶する。第2数値記憶部176および第3数値記憶部177は、後述の数値抽出部145で抽出される数値を記憶する。
識別情報・個数記憶部178は、ソースコードにおける通信メソッド関数が存在する行の識別情報(例えば、行番号)と、当該行番号の示す行に存在する通信メソッド関数の個数と、を記憶している。識別情報・個数記憶部178は、後述のメソッド探索部142が探索して得られる、通信メソッド関数が存在する行の識別情報および当該行に存在する通信メソッド関数の個数を記憶する。
フォーマット記憶部179は、ソースコードに使用され得るプログラミング言語における文字フォーマットまたは数値フォーマットに関する情報を予め記憶している。例えば、ソースコードに「11EF」等の16進数の数値が使用される場合、数値フォーマットに関する情報として、0乃至9およびA乃至Fが数値に使用される旨を示す情報を記憶する。
分岐判定文字列記憶部180は、予め、分岐判定文字列に関する情報を記憶している。分岐判定文字列に関する情報は、例えば「if(){}」、「else if(){}」、「for(){}」、「while(){}」、「switch case(){}」等の分岐判定文を表す文字列(例えば「if」等)から構成される。
次に、本実施の形態に係るソースコード解析装置1の制御部14の機能的構成について説明する。
制御部14は、図2に示すように、ソースコード取得部141、メソッド探索部142、引数抽出・判定部143、分岐判定部144、数値抽出部145、結果表示部146として機能する。なお、図2において、実線矢印は動作フローを表し、破線矢印はデータフローを表す。
ソースコード取得部141は、出力部12を介して出力装置5に、ユーザによる通信試験の対象である組み込みシステムのソースコードを指定するためのソースコード指定用画面を表示する。
ソースコード指定用画面は、例えば試験対象の組み込みシステムのソースコードが記述されたファイルのファイルパスを表示する画面から構成される。例えば、ソースコード指定用画面には、組み込み機器の各種ソースコードが記述されたファイルが保管されているフォルダ(ディレクトリ)の内容が表示される。
ここで、ユーザは、出力装置5に表示されたソースコード指定用画面を確認しながら、入力装置3を操作することにより、入力部11を介して試験対象のソースコードが記述されたファイルを選択することができる。
ソースコード取得部141は、ユーザにより試験対象のソースコードが記述されたファイルが選択されると、選択されたファイルをソースコード記憶部171から取得することによりソースコードを取得する。このとき、ソースコード取得部141は、取得したソースコードを、RAM16に形成された作業領域に読み込む。
ここで、ソースコード取得部141がソースコード記憶部171から取得したソースコードの一例について、図3を参照しながら説明する。
ソースコードは、例えばC言語等の高級プログラミング言語で記述されている。なお、図3では、ソースコードの構造を理解しやすくするために、左端に行番号を付してある。
図3に示すソースコードでは、51行目、61行目、62行目、81行目および181行目それぞれに、通信コマンドを示す数値「0101」、「1111」、「1000」、「0001」、「1110」が記述されている。81行目の通信コマンドを示す数値は、通信メソッド関数の引数として記述されている。
メソッド探索部142は、ソースコード取得部141が取得したソースコードにおいて、通信メソッド関数を探索する。メソッド探索部142は、関数記憶部172から通信メソッド関数の形状に関する情報を取得し、取得した形状に関する情報に基づいて、通信メソッド関数を探索する。なお、メソッド探索部142の動作の詳細は後述する。
引数抽出・判定部143は、メソッド探索部142が検出した通信メソッド関数の引数フィールドに記述されている通信コマンドを抽出するとともに、抽出した通信コマンドが変数または数値のいずれであるかを判定する。
引数抽出・判定部143は、関数記憶部172から通信メソッドの引数に関する情報を取得し、取得した引数に関する情報に基づいて、通信コマンドを抽出する。例えば図3の101行目に存在する通信メソッド関数「send(sockfd,POWER_ON,len,0);」の場合、引数抽出・判定部143は、第一検索文字列「(」から第二検索文字列「)」までの間の文字列を抽出し、更に、抽出した文字列の中から、2番目の引数「POWER_ON」を通信コマンドとして抽出する。
また、引数抽出・判定部143は、抽出した通信コマンドが変数または数値のいずれであるかを判定する。具体的には、引数抽出・判定部143は、フォーマット記憶部179から取得したソースコードに使用されているプログラミング言語におけるフォーマットに関する情報に基づいて判定する。
例えばC言語の場合、文字フォーマットは、a乃至zの文字を含む文字列であり、数値フォーマットは、数字0乃至9のみから構成される文字列である。そして、引数抽出・判定部143は、通信コマンドがa乃至zの文字を含む場合、当該通信コマンドを変数と判定する。一方、引数抽出・判定部143は、通信コマンドが0乃至9のみから構成される場合、当該通信コマンドを数値と判定する。
なお、引数抽出・判定部143の動作の詳細は、後述する。
分岐判定部144は、引数抽出・判定部143により通信コマンドが変数であると判定された場合、分岐部内文字列を抽出する。分岐判定部144は、分岐判定文字列記憶部180から分岐判定文字列を取得し、取得した分岐判定文字列に基づいて、ソースコードから分岐部内文字列を抽出する。また、分岐判定部144は、分岐部分において通信コマンドに代入される変数または数値(以下、「分岐部内通信コマンド」と称する。)を抽出する。
なお、分岐判定部144の動作の詳細は、後述する。
数値抽出部145は、ソースコードにおける通信コマンドに数値が代入されている位置を検索し、当該位置から通信コマンドに代入されている数値を抽出する。また、数値抽出部145は、通信コマンドまたは分岐部内通信コマンドが変数または数値のいずれであるかを判定する。具体的には、数値抽出部145は、フォーマット記憶部179から取得した、ソースコードに使用されているプログラミング言語におけるフォーマットに関する情報に基づいて、通信コマンドまたは分岐部内通信コマンドが変数または数値のいずれであるかを判定する。そして、数値抽出部145は、通信コマンドまたは分岐部内通信コマンドが変数である場合、ソースコードにおける通信コマンドまたは分岐部内通信コマンドに数値を代入する代入文の位置を検索し、当該位置から通信コマンドまたは分岐部内通信コマンドに代入されている数値を抽出する。ここで、同一の通信コマンドまたは同一の分岐部内通信コマンドに数値を代入する代入文が複数あるとする。この場合、数値抽出部145は、複数の代入文のうち、通信コマンドまたは分岐部内通信コマンドからの行数(文字数)が最小となる位置にある代入文から数値を抽出する。
また、数値抽出部145は、通信コマンドを引数記憶部173から取得した場合、抽出した数値を第2数値記憶部176に記憶する。一方、数値抽出部145は、通信コマンドを分岐判定結果記憶部174から取得した場合、抽出した数値を第3数値記憶部177に記憶する。
結果表示部(位置・数値出力部)146は、識別情報・個数記憶部178から通信メソッド関数が記述されている行および当該行に存在する通信メソッド関数の個数を取得する。また、結果表示部146は、第1数値記憶部175、第2数値記憶部176および第3数値記憶部177それぞれから通信コマンドまたは分岐部内通信コマンドを示す数値を取得し、取得した数値を、出力部12を介して出力装置5へ出力する。出力装置5は、通信コマンドまたは分岐部内通信コマンドを示す数値をユーザに視認可能な状態で表示する。即ち、結果表示部146は、出力装置5を介して、ソースコードに記述されている通信メソッド関数の位置並びに通信コマンドの数値をユーザに通知する。
結果表示部146が出力する抽出結果の表示の一例について、図4を参照しながら説明する。
出力装置5には、図4に示すように、3つのフィールドF1、F2、F3が表示される。フィールドF1には、「通信メソッド関数の場所、通信メソッド関数の個数」が表示され、フィールドF2には、「通信メソッド関数に数値として入力された通信コマンド」が表示される。また、フィールドF3には、「通信メソッド関数に変数を介して入力された通信コマンド」が表示される。ここで、フィールドF3は、更に、2つのフィールドF31、F32に区分けされている。フィールドF31には、「必ず実行される通信コマンド」が表示され、フィールドF32には、「条件に応じて実行される通信コマンド」が表示される。フィールドF31には、分岐条件に関わらず必ず実行される通信コマンドを示す数値が表示され、フィールドF32には、分岐条件に応じて実行されたり実行されなかったりする通信コマンドを示す数値が表示される。
次に、本実施の形態に係るソースコード解析装置1が実行する通信コマンド抽出処理の概要について、図5を参照しながら説明する。図5に示す通信コマンド抽出処理は、例えば、ユーザが入力装置3を介して通信コマンド抽出処理の実行を開始するための指令が入力されたことを契機として開始される。また、ソースコード記憶部171に記憶されているソースコードおよび関数記憶部172に記憶されている関数形状は、ユーザにより入力装置3を介して入力されることにより、予め格納されているものとする。
まず、ソースコード取得部141は、ソースコード記憶部171からソースコードを取得する(ステップS1)。ソースコード取得部141は、例えば、図3に示すような、C言語で記述されたソースコードを取得する。
次に、メソッド探索部142は、通信メソッド関数探索処理を実行する(ステップS2)。これにより、メソッド探索部142は、ソースコードにおける通信メソッド関数が記述された行の識別情報および当該行に存在する通信メソッド関数の個数を、識別情報・個数記憶部178に記憶させる。なお、通信メソッド関数探索処理の詳細は後述する。
続いて、引数抽出・判定部143、分岐判定部144および数値抽出部145は、協働して引数抽出・判定処理を実行する(ステップS3)。これにより、引数抽出・判定部143または数値抽出部145は、通信コマンドまたは分岐部内通信コマンドに代入される数値を、第1数値記憶部175、第2数値記憶部176または第3数値記憶部177のいずれかに記憶させる。なお、引数抽出・判定処理の詳細は後述する。
その後、結果表示部146は、通信メソッド関数の位置並びに通信コマンドの数値および分岐部内通信コマンドの数値を、出力部12を介して出力装置5に表示する(ステップS4)。結果表示部146は、例えば図4に示すような画面を出力装置5に表示する。この場合、結果表示部146は、識別情報・個数記憶部178から取得した通信メソッド関数の位置(行)の識別情報(行番号)を、フィールドF1に表示する。また、結果表示部146は、第1数値記憶部175から取得した数値を、フィールドF2に表示し、第2数値記憶部176から取得した数値を、フィールドF31に表示し、第3数値記憶部177から取得した数値を、フィールドF32に表示する。
次に、図5における通信メソッド関数探索処理(ステップS2)の内容について、図6を参照しながら詳細に説明する。
まず、メソッド探索部142は、取得したソースコード全体を一行毎に第1リストに格納していく(ステップS101)。第1リストは、例えば文字型の変数と、次の第1リストのアドレスを示すポインタと、をメンバとする構造体として定義される。ここにおいて、メソッド探索部142は、まず、RAM16の作業領域等に第1リストのための領域を準備する。そして、メソッド探索部142は、ソースコードを一行ずつ第1リストに格納していき、複数の第1リストそれぞれにソースコード一行分の文字列を格納する。これにより、例えばソースコード全体の行数をN行とすると、N個の第1リストが生成される。
次に、メソッド探索部142は、例えば前述のN個の第1リストの先頭の第1リストのアドレスを特定する(ステップS102)。先頭の第1リストのアドレスとは、RAM16の作業領域内における先頭の第1リストの位置を示すアドレスである。
続いて、メソッド探索部142は、特定した第1リストに格納された文字列において、対象となる通信メソッド関数の形状を表す文字列(対象文字列)を検索する(ステップS103)。具体的には、メソッド探索部142は、関数記憶部172から通信メソッド関数の形状を表す対象文字列を取得し、第1リストに格納された文字列の中からパターンマッチングを利用して検索する。例えば、メソッド探索部142は、図3のソースコードが格納された第1リストそれぞれから、通信メソッド関数「send(・・・);」を表す文字列パターン「send」を検索する。
その後、メソッド探索部142は、第1リストに格納された文字列内において、対象文字列を検出したか否かを判定する(ステップS104)。
ステップS104において、対象文字列が検出されなかった場合(ステップS104:No)、メソッド探索部142は、そのまま後述のステップS107の処理を行う。
一方、ステップS104において、対象文字列が検出された場合(ステップS104:Yes)、メソッド探索部142は、対象文字列が格納された第1リストの識別情報を識別情報・個数記憶部178に記憶させる(ステップS105)。識別情報は、例えば、ソースコードにおける対象文字列が存在する行の行番号から構成される。例えば、メソッド探索部142は、図3のソースコードの81行目の文字列が格納された第1リストが検索対象となっている場合、当該文字列の中から対象文字列「send」を検出する。すると、メソッド探索部142は、ソースコードの81行目を示す行番号である「81」を識別情報・個数記憶部178に記憶させる。
次に、メソッド探索部142は、対象文字列が格納された第1リストに含まれる対象文字列の個数を識別情報・個数記憶部178に記憶させる(ステップS106)。ここで、メソッド探索部142は、第1リストに含まれる対象文字列の個数を、当該第1リストの識別情報と対応づけた形で識別情報・個数記憶部178に記憶させる。
図3に示すソースコードでは、81行目に通信メソッド関数「send(・・・);」および「write(・・・);」が存在し、101行目に通信メソッド関数「send(・・・);」が存在する。すると、メソッド探索部142は、行番号「0081」に含まれる対象文字列の個数を「2」、行番号「0101」に含まれる対象文字列の個数を「1」として識別情報・個数記憶部178に記憶させる。
続いて、メソッド探索部142は、対象文字列の検索を終了した第1リストの次の第1リストのアドレスを特定する(ステップS107)。次の第1リストのアドレスとは、RAM16の作業領域内における、対象文字列の検索を終了した第1リストに後続する第1リストの位置を示すアドレスである。例えば、図3に示すソースコードについて、メソッド探索部142は、81行目が格納された第1リストについて対象文字列の検索を終了すると、82行目が格納された第1リストのアドレスを特定する。
その後、メソッド探索部142は、次の第1リストのアドレスが存在しない(NULL)か否かを判定する(ステップS108)。具体的には、メソッド探索部142は、次の第1リストのアドレスを示すポインタの内容がNULLに設定されているか否かを判定する。
ステップS108において、次の第1リストのアドレスが存在すると判定されると(ステップS108:No)、メソッド探索部142は、再びステップS103の処理を行う。
一方、ステップS108において、次の第1リストのアドレスが存在しないと判定されると(ステップS108:Yes)、通信コマンド抽出処理に戻る。
メソッド探索部142が、図3に示すソースコードについて、ステップS103からS108の一連の処理を繰り返したとする。この場合、81行目、101行目、131行目、155行目、185行目(図3の一点鎖線で囲まれた部分T1乃至T5参照)等の行番号が、識別情報・個数記憶部178に記憶される。
次に、図5における引数抽出・判定処理(ステップS3)について、図7を参照しながら詳細に説明する。
まず、引数抽出・判定部143は、先頭の第1リストのアドレスを特定する(ステップS201)。
次に、引数抽出・判定部143は、特定した第1リストに格納された文字列について、通信メソッド関数の形状を表す対象文字列を検索する(ステップS202)。具体的には、引数抽出・判定部143は、関数記憶部172から、対象となる通信メソッド関数の形状を表す対象文字列を取得し、第1リストに格納された文字列の中からパターンマッチングを利用して対象文字列を検索する。通信メソッド関数は、例えば「send(・・・);」という文字列で表される関数と定義されている。そして、引数抽出・判定部143は、第1リストに格納された文字列の中から、例えば左端部に「send」、右端部に「;」が配置された文字列パターンを検索する。
続いて、引数抽出・判定部143は、第1リストに格納された文字列のうちの対象文字列の検索対象となっている文字列の中に対象文字列が有るか否かを判定する(ステップS203)。
ステップS203において、対象文字列の検索対象となっている文字列の中に対象文字列が無いと判定されると(ステップS203:No)、引数抽出・判定部143は、後述のステップS212の処理を行う。
一方、ステップS203において、対象文字列の検索対象となっている文字列の中に対象文字列が有ると判定されると(ステップS203:Yes)、引数抽出・判定部143は、対象文字列の中から、第1検索文字列を検索する(ステップS204)。ここで、第1検索文字列は、通信メソッド関数の引数を入力するフィールドの左端を示す「(」に設定されている。
その後、引数抽出・判定部143は、対象文字列の中から、第2検索文字列を検索する(ステップS205)。ここで、第2検索文字列は、通信メソッド関数の引数を入力するフィールドの右端を示す「)」に設定されている。
次に、引数抽出・判定部143は、対象文字列の中から、第1検索文字列と第2検索文字列との間に囲まれた文字列の中から通信コマンドに相当する引数を抽出する(ステップS206)。ここで、引数抽出・判定部143は、関数記憶部172から引数に関する情報を取得し、取得した引数に関する情報に基づいて、通信コマンドに相当する引数を抽出する。例えば、通信メソッド関数が、図3のソースコードの101行目(一点鎖線で囲まれた部分T2参照)に示すように、「send(sockfd,POWER_ON,len,0)」であるとする。この場合、引数抽出・判定部143は、関数記憶部172に記憶されている引数情報に基づいて、2番目の引数「POWER_ON」を抽出する。
続いて、引数抽出・判定部143は、抽出した通信コマンドを引数記憶部173に記憶する(ステップS207)。
その後、引数抽出・判定部143は、引数記憶部173に記憶された通信コマンドが変数か数値かを判定する(ステップS208)。ここで、引数抽出・判定部143は、フォーマット記憶部179から、ソースコードのプログラミング言語における文字フォーマットと数値フォーマットとに関する情報を取得し、取得した情報に基づいて判定する。具体的には、引数抽出・判定部143は、通信コマンドにa乃至zが含まれている場合、通信コマンドは変数であると判定する。一方、引数抽出・判定部143は、通信コマンドが0乃至9のみから構成される場合、通信コマンドが数値であると判定する。
ステップS208において、通信コマンドが変数であると判定されると(ステップS208:Yes)、分岐判定部144が、分岐判定処理を行う(ステップS211)。なお、分岐判定処理の詳細は後述する。
一方、ステップS208において、通信コマンドが数値であると判定されると(ステップS208:No)、数値抽出部145が、通信コマンドの数値を第1数値記憶部175に記憶させる(ステップS209)。その後、引数抽出・判定部143は、第1リスト内の検索が終了したか否かを判定する(ステップS210)。具体的には、引数抽出・判定部143は、通信メソッド関数を表す文字列の右端部の「;」が第1リストに格納された文字列の最後に相当するか否かを判定する。
ステップS210において、第1リストの検索が終了していないと判定されると(ステップS210:No)、再びステップS202の処理を行う。
一方、ステップS210において、第1リストの検索が終了したと判定されると(ステップS210:Yes)、引数抽出・判定部143は、対象文字列の検索を終了した第1リストの次の第1リストのアドレスを特定する(ステップS212)。具体的には、引数抽出・判定部143は、次の第1リストのアドレスを示すポインタの内容を取得する。
その後、引数抽出・判定部143は、次の第1リストのアドレスが存在しない(NULL)か否かを判定する(ステップS213)。具体的には、引数抽出・判定部143は、次の第1リストのアドレスを示すポインタの内容がNULLに設定されているか否かを判定する。
ステップS213において、次の第1リストのアドレスが存在すると判定されると(ステップS213:No)、引数抽出・判定部143は、再びステップS202の処理を行う。
一方、ステップS213において、次の第1リストのアドレスが存在しないと判定されると(ステップS213:Yes)、通信コマンド抽出処理に戻る。
次に、図7における分岐判定処理(ステップS211)について、図8を参照しながら詳細に説明する。
まず、分岐判定部144は、先頭の第1リストのアドレスを特定する(ステップS301)。
次に、分岐判定部144は、特定した第1リストに格納された文字列について、分岐部分を検索する(ステップS302)。ここでは、分岐判定部144は、分岐判定文字列記憶部180から分岐判定文字列を取得し、取得した分岐判定文字列を用いて分岐部分の検索を行う。分岐判定部144は、第1リストに格納された文字列の中からパターンマッチングを利用して分岐判定文字列を検索する。分岐部分が、例えば「if(・・・){・・・}」または「else if(・・・){・・・}」で表されるとする。この場合、分岐判定部は、第1リストに格納された文字列の中から、「if」または「else if」の文字列パターンを検索する。
続いて、分岐判定部144は、第1リストに格納された文字列のうちの分岐部分の検索対象となっている文字列の中に分岐部分が有るか否かを判定する(ステップS303)。
ステップS303において、分岐部分の検索対象となっている文字列の中に分岐部分が有ると判定されると(ステップS303:Yes)、分岐判定部144は、分岐部分を構成する文字列の中から、第3検索文字列を検索する(ステップS304)。ここで、第3検索文字列は、分岐部分を構成する文字列のうち条件式フィールド「(・・・)」の右隣に配置され、分岐部分の処理内容を記述するフィールドの先頭に配置される文字列「{」に設定されている。
その後、分岐判定部144は、分岐部分を構成する文字列の中から、第4検索文字列を検索する(ステップS305)。ここで、第4検索文字列は、分岐部分の処理内容を記述するフィールドの最後に配置される文字列「}」に設定されている。
次に、分岐判定部144は、分岐部分を構成する文字列の中で第4検索文字列が検出されたか否かを判定する(ステップS306)。
ステップS306において、第4検索文字列が検出されなかったと判定されると(ステップS306:No)、分岐判定部144は、対象文字列の検索を終了した第1リストの次の第1リストのアドレスを特定し(ステップS307)、特定した第1リストについて、第4検索文字列を検索する(ステップS305)。
一方、ステップS306において、第4検索文字列が検出されたと判定されると(ステップS306:Yes)、分岐判定部144は、第3検索文字列と第4検索文字列とで囲まれた文字列(以下、「分岐部内文字列」と称する。)を抽出する(ステップS308)。ここで、第3検索文字列と第4検索文字列とが異なる第1リストに格納されているとする。この場合、分岐判定部144は、第3検索文字列が格納された第1リストと第4検索文字列が格納された第1リストに格納された文字列のみならず、これら2つの第1リストの間の第1リストに格納された文字列をも抽出する。
続いて、分岐判定部144は、抽出した分岐部内文字列を第2リストに格納する(ステップS309)。第2リストは、例えば、文字型の変数と次の第2リストのアドレスを示すポインタとをメンバとする構造体として定義される。ここにおいて、分岐判定部144は、まず、RAM16の作業領域等に第2リストのための領域を準備する。そして、分岐判定部144は、抽出した分岐部内文字列を第2リストに格納していく。
その後、分岐判定部144は、再びステップS302の処理を行う。
分岐判定部144が、図3に示すソースコードについて、ステップS302からステップS309の処理を繰り返し行ったとする。この場合、71行目から73行目、111行目から135行目、141行目から161行目、171行目から191行目、201行目から211行目の文字列等(図3の破線で囲まれた部分B1乃至B5参照)が、抽出される。
また、ステップS303において、分岐部分が無いと判定されると(ステップS303:No)、分岐判定部144は、対象文字列の検索を終了した第1リストの次の第1リストのアドレスを特定する(ステップS310)。具体的には、分岐判定部144は、次の第1リストのアドレスを示すポインタの内容を取得する。
次に、分岐判定部144は、次の第1リストのアドレスが存在しない(NULL)か否かを判定する(ステップS311)。具体的には、分岐判定部144は、次の第1リストのアドレスを示すポインタの内容がNULLに設定されているか否かを判定する。
ステップS311において、次の第1リストのアドレスが存在すると判定されると(ステップS311:No)、分岐判定部144は、再びステップS302の処理を行う。
一方、ステップS311において、次の第1リストのアドレスが存在しないと判定されると(ステップS311:Yes)、分岐判定部144は、先頭の第2リストのアドレスを特定する(ステップS312)。
続いて、分岐判定部144は、第2リストに格納された分岐部内文字列について、代入文を検索する(ステップS313)。ここで、代入文は、「(変数)=(変数)」または「(変数)=(数値)」の形となる部分に相当する。分岐判定部144は、これらの代入文を、パターンマッチングを利用して検索する。分岐判定部144は、図3に示すソースコードの121行目が格納された第2リストから、代入文の「a=b」(図3の点線で囲まれた部分D1参照)を検出する。また、分岐判定部144は、図3に示すソースコードの151行目が格納された第2リストから、代入文「a=c」(図3の点線で囲まれた部分D2参照)を検出する。更に、分岐判定部144は、図3に示すソースコードの181行目が格納された第2リストから、代入文「a=1110」(図3の点線で囲まれた部分D3参照)を検出する。
その後、分岐判定部144は、第2リストに格納された分岐部内文字列のうちの代入文の検索対象である文字列の中に、代入文が有るか否かを判定する(ステップS314)。
ステップS314において、代入文が無いと判定されると(ステップS314:No)、数値抽出部145が、数値抽出処理を行う(ステップS319)。分岐判定部144は、例えば図3に示すソースコードの71行目から74行目の分岐部分(図3の破線で囲まれた部分B1参照)の分岐部内文字列について、代入文が無いと判定する。また、分岐判定部144は、201行目から211行目の分岐部分(図3の破線で囲まれた部分B5)の分岐部内文字列についても、代入文が無いと判定する。
一方、ステップS314において、代入文が有ると判定されると(ステップS314:Yes)、分岐判定部144は、代入文の左辺と、引数記憶部173に記憶されている通信コマンドとを比較する(ステップS315)。具体的には、分岐判定部144は、パターンマッチングを利用して比較を行う。
次に、分岐判定部144は、数式の左辺が引数記憶部173に記憶されている通信コマンドに一致したか否かを判定する(ステップS316)。引数記憶部173に記憶されている通信コマンドは、通信メソッド関数の引数となるものである。従って、数式の左辺が、引数記憶部173に記憶されている通信コマンドに一致すれば、当該数式の左辺は通信メソッド関数の引数に相当することになる。そして、当該数式の右辺は、通信コマンドの数値または変数を示すことになる。
ステップS316において、数式の左辺が通信コマンドに一致しないと判定されると(ステップS316:No)、数値抽出部145が、数値抽出処理を行う(ステップS319)。
一方、ステップS316において、数式の左辺が通信コマンドに一致すると判定されると(ステップS316:Yes)、分岐判定部144は、数式の左辺に一致する通信コマンド(以下、「分岐部内通信コマンド」と称する。)を分岐判定結果記憶部174に記憶させる(ステップS317)。
続いて、分岐判定部144は、分岐判定結果記憶部174に記憶させた通信コマンドを引数記憶部173から削除し(ステップS318)、再びステップS313の処理を行う。
ステップS319において、数値抽出部145による数値抽出処理が行われた後、分岐判定部144は、代入文の検索を終了した第2リストの次の第2リストのアドレスを特定する(ステップS320)。具体的には、分岐判定部144は、次の第2リストのアドレスを示すポインタの内容を取得する。
その後、分岐判定部144は、次の第2リストのアドレスが存在しない(NULL)か否かを判定する(ステップS321)。具体的には、分岐判定部144は、次の第2リストのアドレスを示すポインタの内容がNULLに設定されているか否かを判定する。
ステップS321において、次の第2リストのアドレスが存在すると判定されると(ステップS321:No)、分岐判定部144は、再びステップS313の処理を行う。
一方、ステップS321において、次の第2リストのアドレスが存在しないと判定されると(ステップS321:Yes)、通信コマンド抽出処理に戻る。
次に、図9における数値抽出処理(ステップS319)について、図10を参照しながら詳細に説明する。
まず、数値抽出部145は、引数抽出・判定部143が抽出した通信コマンドが引数記憶部173に記憶されている通信コマンドであるか否かを判定する(ステップS401)。
ステップS401において、通信コマンドが引数記憶部173に記憶されていると判定されると(ステップS401:Yes)、数値抽出部145は、通信コマンドに数値が代入されている位置を特定する(ステップS402)。ここでは、数値抽出部145が、全ての第1リストについて、パターンマッチングを利用して順に検索していき、通信コマンドに数値が代入されている位置を特定する。
図3に示すソースコードに記述されている通信コマンド「POWER_ON」は、引数記憶部173に記憶されている。そして、数値抽出部145は、51行目の代入文「POWER_ON=0101」(破線で囲まれた部分D4参照)を特定する。
また、数値抽出部145は、通信コマンドに数値が代入されている位置を複数検出した場合、引数抽出・判定部143が通信コマンドを抽出した位置よりも前であり、当該抽出した位置に最も近い位置を特定する。
図3に示すソースコードにおいて、例えば、45行目に代入文「POWER_ON=0111」(図示せず)が記述されていたとする。この場合、引数抽出・判定部143は、通信コマンド「POWER_ON」を抽出した位置が101行目であるので、数値抽出部145は、101行目に最も近い51行目の代入文を特定する。
続いて、数値抽出部145は、特定した位置から数値を抽出する(ステップS403)。図3に示すように、特定した位置(破線で囲まれた部分D4参照)に、代入文「POWER_ON=0101」が記述されている場合、数値抽出部145は、当該代入文の右辺の数値「0101」を抽出する。
その後、数値抽出部145は、抽出した数値を第2数値記憶部176に記憶させる(ステップS404)。その後、分岐判定部144が、分岐判定処理を再開する。
一方、ステップS401において、通信コマンドが分岐判定結果記憶部174に記憶されている、即ち、通信コマンドが分岐部内通信コマンドであると判定されたとする(ステップS401:No)。この場合、数値抽出部145は、分岐部内通信コマンドに数値または変数を代入する代入文の位置を特定する(ステップS405)。ここでは、数値抽出部145が、全ての第1リストについて、パターンマッチングを利用して順に検索していき、通信コマンドに数値または変数を代入する代入文の位置を特定する。
数値抽出部145は、例えば、図3に示すソースコードの各行が格納された第1リストについて、その先頭から順番に代入文を検索する。この場合、数値抽出部145は、ソースコードの121行目が格納された第1リストにおいて代入文「a=b」(破線で囲まれた部分D1参照)を検出する。また、数値抽出部145は、図3に示すソースコードについて、121行目の代入文「a=b」の直後の文字列から代入文の検索を行う。そして、数値抽出部145は、ソースコードの151行目が格納された第1リストにおいて代入文「a=c」(破線で囲まれた部分D2参照)を検出する。更に、数値抽出部145は、151行目の代入文「a=c」の直後の文字列から代入文の検索を行う。そして、数値抽出部145は、ソースコードの181行目が格納された第1リストにおいて代入文「a=1110」(破線で囲まれた部分D3)を検出する。以後、数値抽出部145は、ソースコードの最終行が格納された第1リストまで、代入文の検索を行う。
次に、数値抽出部145は、分岐部内通信コマンドに変数が代入されているか否かを判定する(ステップS406)。ここでは、数値抽出部145は、フォーマット記憶部179から、ソースコードのプログラミング言語における文字フォーマットと数値フォーマットとに関する情報を取得し、取得した情報に基づいて判定する。具体的には、数値抽出部145は、特定した位置に記述されている代入文の右辺にa乃至zが含まれている場合、分岐部内通信コマンドは変数であると判定する。一方、数値抽出部145は、特定した位置に記述されている代入文の右辺が0乃至9のみから構成される場合、分岐部内通信コマンドが数値であると判定する。
数値抽出部145は、例えば図3に示すソースコードの121行目の代入文「a=b」(破線で囲まれた部分D1参照)から、分岐部内通信コマンドが変数であると判定する。一方、数値抽出部145は、図3に示すソースコードの181行目の代入文「a=1110」(破線で囲まれた部分D3参照)から、分岐部内通信コマンドが数値であると判定する。
ステップS406において、分岐部内通信コマンドに数値が代入されていると判定されると(ステップS406:No)、数値抽出部145は、特定した位置に記述されている代入文の右辺から数値を抽出し(ステップS407)、抽出した数値を第3数値記憶部177に記憶させる(ステップS410)。
一方、ステップS406において、分岐部内通信コマンドに変数が代入されていると判定されると(ステップS406:Yes)、数値抽出部145は、変数に数値が代入されている位置を特定する(ステップS408)。ここでは、数値抽出部145が、ソースコードが格納されている全ての第1リストについて、パターンマッチングを利用して順に検索していき、変数に数値が代入されている位置を特定する。
数値抽出部145は、例えば図3に示すソースコードについて、61行目の代入文「b=1111」および62行目の代入文「c=1000」(破線で囲まれた部分D5、D6)の位置(行番号)を特定する。
続いて、数値抽出部145は、特定した位置(行番号)に記述された代入文から数値を抽出する(ステップS409)。数値抽出部145は、図3に示すように、特定した位置(破線で囲まれた部分D5参照)に、代入文「b=1111」が記述されている場合、当該代入文の右辺の数値「1111」を抽出する。また、数値抽出部145は、特定した位置(破線で囲まれた部分D6参照)に、代入文「c=1000」が記述されている場合、当該代入文の右辺の数値「1000」を抽出する。
その後、数値抽出部145は、抽出した数値を第3数値記憶部177に記憶させる(ステップS410)。
数値抽出部145によるステップS410の処理の後、分岐判定部144による分岐判定処理に戻る。
以上のように、本実施の形態に係るソースコード解析装置1によれば、ソースコードにおける通信メソッド関数の位置をユーザに通知することができる。これにより、ソースコードが実施すべき試験項目とは直接関係しない処理を行うサブルーチンを含む場合でも、ユーザは、当該サブルーチンと通信メソッド関数との位置関係から通信メソッド関数を処理しないサブルーチンを判別することができる。従って、ユーザは、通信メソッド関数を処理しないサブルーチンの処理を避けるように試験項目を作成することができるので、無駄な試験の実施を抑制できる。
また、本実施の形態に係るソースコード解析装置1によれば、数値抽出部145が、通信コマンドが変数である場合、当該変数に数値を代入する代入文を検索し、検出した代入文に基づいて、通信コマンドに代入される数値を抽出する。そして、結果表示部146が、数値抽出部145が抽出した通信コマンドの数値を出力装置5に出力する。これにより、ユーザは、ソースコードにおいて使用されている通信コマンドに代入される数値の全てを確認することができるので、ソースコードにおける通信コマンドに関する代入文に誤りがある場合、この誤りをすぐに見つけることができる。従って、通信試験におけるエラー原因の早期究明を図ることができる。
また、本実施の形態に係るソースコード解析装置1では、引数抽出・判定部143または数値抽出部145が、ソースコードから通信コマンドを示す数値を漏れなく抽出する。これにより、通信試験で実施すべき試験項目の漏れの発生を抑制することができるので、通信試験の質の向上を図ることができる。
また、本実施の形態に係るソースコード解析装置1では、分岐判定部144が、ソースコードにおける分岐部分を検索し、分岐部分において通信コマンドに変数または数値を代入されているか否かを判定する。そして、分岐判定部144は、分岐部分において通信コマンドに変数または数値を代入されていると判定すると、通信コマンドを分岐判定結果記憶部174に記憶させる。数値抽出部145は、通信コマンドが分岐判定結果記憶部174に記憶されているか否かに応じて、通信コマンドが分岐部内通信コマンドであるか否かを判別する。そして、数値抽出部145は、分岐部内通信コマンドに代入された数値を、他の通信コマンドに代入された数値と区別して第3数値記憶部177に記憶させる。結果表示部146は、第3数値記憶部177から取得した数値を、分岐部内通信コマンドとして出力する。
これにより、分岐部分で使用されている通信コマンドの数値が、分岐部分以外で使用されている通信コマンドと区別できる形で出力されるので、ユーザは、各通信コマンドが分岐部分内または分岐部分外のいずれで使用されているかを考慮しながら試験項目を作成することができる。従って、実施すべき試験項目の妥当性向上を図ることができる。
また、本実施の形態に係るソースコード解析装置1によれば、数値抽出部145が、分岐部内通信コマンド変数が代入されていると判定した場合、ソースコードにおいて当該変数に代入される数値を検索して抽出する。これにより、ソースコードが、分岐部内通信コマンドに変数を代入する代入文を含む場合でも、数値抽出部145は、分岐部内通信コマンドに代入される数値を抽出することができる。
また、本実施の形態に係るソースコード解析装置1によれば、数値抽出部145は、フォーマット記憶部179から取得した文字列フォーマットおよび数値フォーマットに基づいて、通信コマンドまたは分岐部内通信コマンドに変数または数値のいずれが代入されているかを判定する。これにより、フォーマット記憶部179が、複数種類のプログラミング言語の文字列フォーマットまたは数値フォーマットを記憶しているとする。この場合、数値抽出部145は、複数種類のプログラミング言語で記述されたソースコードについて適切な判定を行うことができる。
以上、本発明の実施の形態について説明したが、本発明は実施の形態によって限定されるものではない。
例えば、本実施の形態の引数抽出・判定処理において、対象文字列、第1検索文字列、第2検索文字列の検索を、メソッド探索部142が検出した、対象文字列を含む第1リストのみについて行うようにしてもよい。
図11は、変形例に係る引数抽出・判定処理の流れの一例を示すフローチャートである。図11において、図7を用いて説明した処理と同一の処理については図7と同一の符号を付してある。
まず、引数抽出・判定部143は、識別情報・個数記憶部178が記憶する識別情報に基づいて、対象文字列を含む第1リストのアドレスを特定する(ステップS501)。引数抽出・判定部143は、例えば図3に示すソースコードについて、行番号81に対応する第1リストのアドレスを特定する。
次に、引数抽出・判定部143は、識別情報・個数記憶部178から、特定した第1リストに対応する対象文字列の個数Mを取得する(ステップS502)。引数抽出・判定部143は、例えば図3に示すソースコードの行番号81と対応づけて識別情報・個数記憶部178に記憶されている個数「2」を取得する。
続いて、引数抽出・判定部143は、処理インデックスmを「0」に設定し(0→m)(ステップS503)、ステップS202の処理を行い、その後、ステップS204の処理を行う。
以後、引数抽出・判定部143は、ステップS205乃至S209並びにS211までの処理を行い、その後、処理インデックスmを1だけインクリメント(m+1→m)する(ステップS504)。
次に、引数抽出・判定部143は、処理インデックスmが対象文字列の個数Mよりも1だけ小さい値よりも大きいか否かを判定する(ステップS505)。
ステップS505において、処理インデックスmが対象文字列の個数Mよりも1だけ小さい値以下と判定されると(ステップS505:No)、引数抽出・判定部143は、ステップS202の処理を行う。
一方、ステップS505において、処理インデックスmが対象文字列の個数Mよりも1だけ小さい値よりも大きいと判定されると(ステップS505:Yes)、引数抽出・判定部143は、未処理の対象文字列を含む第1リストが存在するか否かを判定する(ステップS506)。
ステップS506において、未処理の対象文字列を含む第1リストが存在すると判定されると(ステップS506:Yes)、引数抽出・判定部143は、再びステップS501の処理に戻る。
一方、ステップS506において、未処理の対象文字列を含む第1リストが存在しないと判定されると(ステップS506:No)、通信コマンド抽出処理に戻る。
本構成によれば、引数抽出・判定処理における処理量を軽減することができるので、処理時間の短縮を図ることができる。
また、本実施の形態の分岐判定処理において、分岐部内文字列について通信コマンドの検索を行い、通信コマンドが存在する場合に、通信コマンドが存在する位置が、通信コマンドに変数または数値を代入している位置に相当するか否かを判定するようにしてもよい。
図12は、変形例に係る分岐判定処理の流れの一例の一部を示すフローチャートである。図12において、図9を用いて説明した処理と同一の処理については図9と同一の符号を付してある。
分岐判定部144は、先頭の第2リストのアドレスを特定した後(ステップS312)、特定した第2リストに格納された文字列において、通信コマンドを検索する(ステップS601)。
次に、分岐判定部144は、検索対象の文字列の中に通信コマンドが有るか否かを判定する(ステップS602)。分岐判定部144は、引数記憶部173に記憶されている通信コマンドを、パターンマッチングを利用して検索する。
ステップS602において、通信コマンドが無いと判定されると(ステップS602:No)、数値抽出部145が、数値抽出処理を行う(ステップS319)。
一方、ステップS602において、通信コマンドが有ると判定されると(ステップS602:Yes)、分岐判定部144は、検出した通信コマンドの右隣の文字列を抽出する(ステップS603)。通信コマンドを検出した位置において、通信コマンドが通信メソッド関数の引数として記述されている場合(例えば、「write(sockfd,a,len)」)、分岐判定部144は、「,」を抽出する。
続いて、分岐判定部144は、抽出した文字列が「=」であるか否かを判定する(ステップS604)。
ステップS604において、抽出した文字列が「=」ではないと判定されると(ステップS604:No)、数値抽出部145が、数値抽出処理を行い(ステップS319)、その後、分岐判定部144は、ステップS320以降の処理を行う。
一方、ステップS604において、抽出した文字列が「=」であると判定されると(ステップS604:Yes)、分岐判定部144は、通信コマンドを分岐判定結果記憶部174に記憶させ(ステップS317)、ステップS318以降の処理を行う。
本構成によれば、分岐部分に通信メソッド関数が記述されていない場合、通信コマンドに関係のない代入文について、当該代入文に通信コマンドが含まれるか否かを判定する処理が省略される。従って、分岐部分に通信メソッド関数が記述されていない場合における処理量の軽減を図ることができる。
また、本実施の形態において、ソースコード記憶部、引数記憶部、分岐判定結果記憶部、第1数値記憶部、第2数値記憶部、第3数値記憶部、関数記憶部、識別情報・個数記憶部を、記憶部17以外の構成が備えていてもよい。例えば、RAM16が、各種記憶部の少なくとも一部を備えていてもよい。例えば、記憶部17が、ソースコード記憶部、第1数値記憶部、第2数値記憶部、第3数値記憶部、関数記憶部を備え、RAM16が、引数記憶部、分岐判定結果記憶部、識別情報・個数記憶部を備えていてもよい。
本構成によれば、通信コマンド抽出処理において、制御部14のアクセス回数が比較的大きくなる引数記憶部173、分岐判定結果記憶部174および識別情報・個数記憶部178を、制御部14が比較的高速にアクセスできるRAM16が有する。これにより、通信コマンド抽出処理の速度向上を図ることができる。
また、本実施の形態において、メソッド探索部142が、ソースコードの一部に記述されたヘッダファイルの名前に基づいて、当該ヘッダファイルから通信コマンド関数の形状および引数に関する情報を取得し、関数記憶部172に記憶させるものであってもよい。
例えば、ソースコードがC言語で記述されているとする。この場合、メソッド探索部142が、ソースコードの冒頭に記述されているヘッダファイルの名前(例えば、#include<winsock2.h>等)に基づいて、ヘッダファイルの中身を参照し、当該ヘッダファイル内に記述されている通信メソッド関数を取得してもよい。
本構成によれば、ユーザが通信試験を実施する前に、予め通信メソッド関数を関数記憶部172に記憶させておく作業を行う必要がない。従って、ユーザの作業負担の軽減を図ることができる。
また、本実施の形態において、ソースコードに記述された通信メソッド関数の引数が、通信コマンド1つだけの場合、関数記憶部172は、引数に関する情報を記憶していなくてもよい。これにより、関数記憶部172が必要とする記憶容量を低減することができる。
また、本実施の形態において、制御部14が、更に、ソースコードにおけるサブルーチン部分を判別するサブルーチン判別部を有してもよい。
具体的には、サブルーチン判別部が、ソースコードにおけるサブルーチンに対応する関数宣言文を検索し、検出した関数宣言文からサブルーチンを示す関数の形状および引数に関する情報を抽出する。次に、サブルーチン判別部は、抽出したサブルーチンを示す関数の形状および引数に関する情報を、例えば関数記憶部172に記憶させる。
その後、サブルーチン判別部は、関数記憶部172に記憶されたサブルーチンを示す関数の形状および引数に基づいて、ソースコードにおけるサブルーチン部分を特定する。そして、サブルーチン判別部は、通信コマンドが特定したサブルーチン部分内に存在するか否かを判別する。
本構成によれば、ソースコードにおいてサブルーチンを示す関数が定義されている場合、通信コマンドがソースコードのメインルーチンまたはサブルーチンのいずれで使用されているかを考慮してテストケースを作成することが可能となる。従って、実施すべき試験項目の妥当性向上を図ることができる。
また、本実施の形態において、結果出力部は、ソースコードにおける通信メソッド関数の位置を示す識別情報を、試験装置へ出力するものであってもよい。
図13は、変形例に係るソースコード解析装置201と、試験装置301とから構成される試験システムの機能構成を示すブロック図である。図13において、図2と同一の構成については図9と同一の符号を付してある。また、図13において、実線矢印は動作フローを表し、破線矢印はデータフローを表す。なお、ソースコード解析装置201と試験装置301とは、1つの装置で実現されていてもよい。また、ソースコード解析装置201と試験装置301とが別体であり、ソースコード解析装置201が、外部I/F部13を介して試験装置301に接続されていてもよい。
ソースコード解析装置201の結果出力部246は、識別情報・個数記憶部178に記憶された通信メソッド関数の位置を示す識別情報(行番号)を、試験装置301へ出力する。
一方、試験装置301は、ソースコードを記憶するソースコード記憶部311と、ソースコードにおける分岐部分を検索する分岐部分検索部312と、分岐部分内に存在する通信メソッド関数を検索する分岐部内メソッド検索部313と、複数のテストケースを作成するテストケース作成部314と、各テストケースを実施するテスト実施部315と、テスト結果を表示するテスト結果出力部316と、を備える。
分岐部分検索部312は、ソースコード記憶部311からソースコードを取得し、ソースコードにおける各分岐部分の位置(行番号)を検索し、識別できる形で位置を特定する。
分岐部内メソッド検索部313は、分岐部分検索部312により特定された各分岐部分の位置と、ソースコード解析装置201から取得した通信メソッド関数の位置を示す識別情報(行番号)に基づいて、通信メソッド関数を含む分岐部分の位置を特定する。
テストケース作成部314は、分岐部内メソッド探索部313から、通信メソッド関数を含む分岐部分の位置に関する情報を取得する。そして、テストケース作成部314は、取得した通信メソッド関数を含む分岐部分の位置に関する情報に基づいて、複数のテストケースを作成する。ここで、テストケース作成部314は、通信メソッド関数を含む分岐部分が実行され、通信メソッド関数を含まない分岐部分がなるべく実行されないように、テストケースを作成する。
テスト実施部315は、テストケース作成部314が作成したテストケースを実行する。
テスト結果出力部316は、テスト実施部315がテストケースを実行して得られる結果を出力する。
本構成によれば、テストケース作成部314が、取得した通信メソッド関数を含む分岐部分に関する情報に基づいて、通信メソッド関数を含まない分岐部分がなるべく実行されないように、テストケースを作成することが可能となる。これにより、試験装置301による、通信メソッド関数に関連しない無駄な試験項目の実施を抑制できる。
また、本実施の形態において、ソースコード記憶部171、引数記憶部173、分岐判定結果記憶部174、第1数値記憶部175、第2数値記憶部176および第3数値記憶部177が、複数の記憶部から構成されるものであってもよい。
また、本実施の形態において、第1リストおよび第2リストに代えて、配列を採用してもよい。
また、本発明に係るソースコード解析装置1は、専用のシステムによらず、通常のコンピュータシステムを用いて実現可能である。例えば、ネットワークに接続されているコンピュータに、上記動作を実行するためのプログラムを、コンピュータシステムが読み取り可能な非一時的な記録媒体(CD−ROM等)に格納して配布し、当該プログラムをコンピュータシステムにインストールすることにより、上述の処理を実行するソースコード解析装置1を構成してもよい。
また、コンピュータにプログラムを提供する方法は任意である。例えば、プログラムは、通信回線の掲示版(BBS)にアップロードされ、通信回線を介してコンピュータに配信されてもよい。そして、コンピュータは、このプログラムを起動して、OSの制御の下、他のアプリケーションと同様に実行する。これにより、コンピュータは、上述の処理を実行するソースコード解析装置1として機能する。
1、201 ソースコード解析装置、3 入力装置、5 出力装置、11 入力部、12 出力部、13 外部I/F部、14 制御部、15 ROM、16 RAM、17 記憶部、141 ソースコード取得部、142 メソッド探索部、143 引数抽出・判定部、144 分岐判定部、145 数値抽出部、146 結果表示部、171、311 ソースコード記憶部、172 関数記憶部、173 引数記憶部、174 分岐判定結果記憶部、175 第1数値記憶部、176 第2数値記憶部、177 第3数値記憶部、178 識別情報・個数記憶部、179 フォーマット記憶部、180 分岐判定文字列記憶部、246 結果出力部、301 試験装置、312 分岐部分検索部、313 分岐部内メソッド検索部、314 テストケース作成部、315 テスト実施部、316 テスト結果出力部

Claims (6)

  1. ソースコード群を記憶するソースコード記憶部と、
    前記ソースコード記憶部に記憶された前記ソースコード群の中から1つのソースコードを取得するソースコード取得部と、
    前記ソースコードにおいて、通信メソッド関数を表す対象文字列を探索し、探索した通信メソッド関数の前記ソースコードにおける位置を検出するメソッド探索部と、
    前記通信メソッド関数の引数の少なくとも一部を通信コマンドとして抽出し、抽出した前記通信コマンドが変数または数値のいずれであるかを判定する引数抽出・判定部と、
    数値記憶部と、
    前記引数抽出・判定部により数値であると判定された前記通信コマンドの数値を前記数値記憶部に記憶させ、前記引数抽出・判定部により変数であると判定された前記通信コマンドに基づいて、前記ソースコードにおいて前記通信コマンドに代入される数値を検索して抽出し、抽出した数値を前記数値記憶部に記憶させる数値抽出部と、
    前記メソッド探索部により探索された通信メソッド関数の位置と、前記数値記憶部に記憶された前記通信コマンドの数値と、を出力する位置・数値出力部と、を備える、
    ソースコード解析装置。
  2. 前記引数抽出・判定部が抽出した前記通信コマンドを記憶する引数記憶部を更に備え、
    前記ソースコードにおける分岐部分を検索するとともに、前記引数記憶部に記憶された前記通信コマンドに基づいて、前記分岐部分において前記通信コマンドに変数または数値を代入されているか否かを判定する分岐判定部と、
    前記分岐判定部により、前記分岐部分において変数または数値が代入されると判定された前記通信コマンドを記憶する分岐判定結果記憶部と、を備える、
    請求項1に記載のソースコード解析装置。
  3. 前記数値抽出部は、更に、前記分岐部分において前記通信コマンドに変数または数値のいずれが代入されているかを判定し、変数が代入されていると判定した場合、前記ソースコード内において前記変数に代入される数値を検索して抽出し、数値が代入されていると判定した場合、前記通信コマンドに代入される数値を抽出する、
    請求項2に記載のソースコード解析装置。
  4. ソースコードに使用されるプログラミング言語の文字列フォーマットおよび数値フォーマットを記憶するフォーマット記憶部を更に備え、
    前記数値抽出部は、前記フォーマット記憶部から取得した文字列フォーマットおよび数値フォーマットに基づいて、前記通信コマンドに変数または数値のいずれが代入されているかを判定する、
    請求項1から3に記載のソースコード解析装置。
  5. ソースコード群の中から1つのソースコードを取得するステップと、
    前記ソースコードにおいて、通信メソッド関数を表す対象文字列を探索し、探索した通信メソッド関数の位置を検出するステップと、
    前記通信メソッド関数の引数の少なくとも一部を通信コマンドとして抽出し、抽出した前記通信コマンドが変数または数値のいずれであるかを判定するステップと、
    数値であると判定された通信コマンドの数値を抽出するステップと、
    変数であると判定された通信コマンドに基づいて、前記ソースコードにおいて前記通信コマンドに代入される数値を検索して抽出するステップと、
    前記通信メソッド関数のソースコードにおける位置と、抽出した前記通信コマンドの数値と、を出力するステップと、を含む、
    ソースコード解析方法。
  6. コンピュータを、
    ソースコード群の中から1つのソースコードを取得するソースコード取得部、
    前記ソースコードにおいて、通信メソッド関数を表す対象文字列を探索し、前記通信メソッド関数のソースコードにおける位置を検出するメソッド探索部、
    前記通信メソッド関数の引数の少なくとも一部を通信コマンドとして抽出し、抽出した前記通信コマンドが変数または数値のいずれであるかを判定する引数抽出・判定部、
    数値であると判定された通信コマンドの数値を数値記憶部に記憶させ、変数であると判定された通信コマンドに基づいて、前記ソースコードにおいて前記通信コマンドに代入される数値を検索して抽出し、抽出した数値を前記数値記憶部に記憶させる数値抽出部、
    前記通信メソッド関数の位置と、前記数値記憶部に記憶された前記通信コマンドの数値と、を出力する位置・数値出力部、
    として機能させる、
    ソースコード解析プログラム。
JP2014162986A 2014-08-08 2014-08-08 ソースコード解析装置、ソースコード解析方法およびソースコード解析プログラム Active JP6091471B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2014162986A JP6091471B2 (ja) 2014-08-08 2014-08-08 ソースコード解析装置、ソースコード解析方法およびソースコード解析プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014162986A JP6091471B2 (ja) 2014-08-08 2014-08-08 ソースコード解析装置、ソースコード解析方法およびソースコード解析プログラム

Publications (2)

Publication Number Publication Date
JP2016038800A JP2016038800A (ja) 2016-03-22
JP6091471B2 true JP6091471B2 (ja) 2017-03-08

Family

ID=55529799

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014162986A Active JP6091471B2 (ja) 2014-08-08 2014-08-08 ソースコード解析装置、ソースコード解析方法およびソースコード解析プログラム

Country Status (1)

Country Link
JP (1) JP6091471B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111581094B (zh) * 2020-05-08 2023-06-23 贝壳技术有限公司 头文件名检测方法、装置、存储介质及电子设备

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH064344A (ja) * 1992-06-17 1994-01-14 Hokkaido Nippon Denki Software Kk プログラム中の参照された変数の型表示方式
JP2000020293A (ja) * 1998-07-03 2000-01-21 Ffc:Kk プログラムソース中の特定関数の検索方法
JP2002108653A (ja) * 2000-10-02 2002-04-12 Ntt Comware Corp 単体試験項目票作成支援方法ならびにそのシステム

Also Published As

Publication number Publication date
JP2016038800A (ja) 2016-03-22

Similar Documents

Publication Publication Date Title
JP4395761B2 (ja) プログラムテスト支援装置およびその方法
JP6440895B2 (ja) ソフトウェア分析装置及びソフトウェア分析方法
US8745521B2 (en) System and method for annotating graphical user interface
US20210208996A1 (en) Verification automation apparatus, verification automation method, and computer-readable recording medium
US11556317B2 (en) Instruction translation support method and information processing apparatus
JP2005107597A (ja) 類似文検索装置、類似文検索方法、およびプログラム
JP2009169689A (ja) データ分類方法およびデータ処理装置
JP6091471B2 (ja) ソースコード解析装置、ソースコード解析方法およびソースコード解析プログラム
US20200342169A1 (en) Information processing apparatus and non-transitory computer readable medium storing program
KR101996009B1 (ko) 테스트케이스 작성 지원 방법 및 이를 수행하는 서버 및 사용자 단말
JP2019148859A (ja) フローダイアグラムを用いたモデル開発環境におけるデザインパターンの発見を支援する装置および方法
US11635947B2 (en) Instruction translation support method and information processing apparatus
JP5758262B2 (ja) 類似文書可視化装置、類似文書可視化方法およびプログラム
JP5578625B2 (ja) プログラム分析装置、プログラム分析方法、及びプログラム
JP2018116517A (ja) 開発支援装置、開発支援方法、およびプログラム
CN111813749A (zh) 文件过滤方法及装置、电子设备、存储介质
JP2006309611A (ja) 解析装置、プログラム及び記録媒体
JP6455087B2 (ja) 帳票情報処理プログラム、帳票情報処理装置、および帳票情報処理方法
JP2015130040A (ja) 名寄せ装置、名寄せシステム、方法及びプログラム
JPWO2004107203A1 (ja) 対訳文対応付け装置
WO2021084807A1 (ja) 情報提供システム
JP6902513B2 (ja) ソースコード生成支援装置およびソースコード生成支援方法
JP2014241071A (ja) 分析システム、分析方法および分析用プログラム
JP2024130691A (ja) プログラム検証支援システム、及びプログラム検証支援方法
JP6553461B2 (ja) 既存システム処理仕様抽出装置

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20160115

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20161115

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: 20170110

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20170207

R150 Certificate of patent or registration of utility model

Ref document number: 6091471

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250