以下、図面を参照しつつ、本開示に係る技術思想の実施の形態について説明する。以下の説明では、同一の部品には同一の符号を付してある。それらの名称および機能も同じである。したがって、それらについての詳細な説明は繰り返さない。
実施の形態1.
本実施の形態に従うCRUD図生成装置100は、任意のプログラムのソースコードを解析して、ソースコード中の不具合が潜在している可能性のある箇所(以下、「不具合潜在箇所」と呼ぶ)を特定する。また、CRUD図生成装置100は、不具合潜在箇所の情報を強調表示するCRUD図を生成する。不具合潜在箇所は、大域変数に起因する不具合が潜在している可能性のある箇所を含む。まず、図1および図2を参照して、CRUD図生成装置100の機能およびハードウェア構成について説明する。
図1は、本実施の形態に従うCRUD図生成装置100の機能構成の一例を示す図である。ある局面において、図1に示す各機能ブロックは、図2に示すハードウェアがソフトウェアと協働することにより実現され得る。
CRUD図生成装置100は、不具合潜在パターン入力部101と、静的解析部102と、CRUD情報抽出部103と、不具合潜在箇所特定部104と、CRUD図生成部105とを備える。CRUD図生成装置100の入出力ファイルは、不具合潜在パターン111と、ソースコード112と、CRUD図113とを含む。CRUD図生成装置100が蓄積するデータは、解析データDB(Database)121と、CRUD情報DB122と、不具合潜在パターンDB123とにそれぞれ保存される。ある局面において、各DBは、CRUD図生成装置100の内部の記憶装置(図示せず)に保存されてもよいし、外部の装置に保存されてもよい。
不具合潜在パターン入力部101は、不具合潜在パターン111の入力を受け付ける。また、不具合潜在パターン入力部101は、取得した不具合潜在パターン111を不具合潜在パターンDB123に格納する。不具合潜在パターン111は、例えば、あるプログラムのソースコードについて、潜在的な不具合を引き起こす可能性がある、大域変数の生成(Create)、参照(Read)、更新(Update)および削除(Delete)の実行条件の組み合わせを含む(以下、各々を「生成(C)、参照(R)、更新(U)および削除(D)」と呼ぶ)。
大域変数の生成(C)は、オブジェクト指向プログラムにおけるクラスのインスタンスの生成、または、変数へのメモリ領域の動的な確保を含む。変数へのメモリの動的な確保は、例えば、C言語における「malloc()」関数の実行等に相当する。大域変数の参照(R)は、変数に格納されたデータの読み出し処理である。大域変数の更新(U)は、変数に格納されたデータの更新または上書き処理である。削除(D)は、インスタンスの削除、または、変数に動的に確保されたメモリ領域の開放を含む。
静的解析部102は、ソースコード112を取得して、当該ソースコードの解析を実行し、大域変数および関数の参照関係情報を含んだ解析データを生成する。静的解析部102は、生成した解析データを解析データDB121に格納する。ある局面において、ソースコード112は、任意の言語のソースコードを含み得る。例えば、ソースコード112は、C言語等のコンパイルを必要とする言語のソースコードであってもよいし、Python等のインタプリタによって実行される言語のソースコードであってもよい。他の局面において、静的解析部102は、既存の静的解析技術を用いた静的解析ツールにより実現されてもよい。
ある局面において、不具合潜在パターン入力部101および静的解析部102は、ユーザからの入力を受け付ける入力インターフェイス、または/および、他の装置からの通信を取得する通信インターフェイスを含んでいてもよい。
CRUD情報抽出部103は、解析データDB121から、解析データを読み出して解析することで、ソースコード112内の大域変数が、どの関数により作成(C)、参照(R)、更新(U)、および削除(D)されたのか、および、その実行回数を含むCRUD情報を生成する。CRUD情報抽出部103は、生成したCRUD情報をCRUD情報DB122に格納する。これ以降、作成(C)、参照(R)、更新(U)、および削除(D)を総称して「CRUD処理」と呼ぶ。また、「CRUD処理の実行回数(または、CRUD情報)」とは、作成(C)、参照(R)、更新(U)、および削除(D)の各々の処理の実行回数を指す。CRUD情報抽出部103によって抽出されるCRUD情報は、各関数の各大域変数に対するCRUD処理の実行回数(CRUD情報)を含む。
不具合潜在箇所特定部104は、不具合潜在パターンDB123から不具合潜在パターン111を取得し、CRUD情報DB122からCRUD情報を取得する。不具合潜在箇所特定部104は、不具合潜在パターン111およびCRUD情報に基づいて、不具合潜在箇所を特定する。不具合潜在箇所特定部104は、不具合潜在箇所の情報と、CRUD情報とをCRUD図生成部105に出力する。
CRUD図生成部105は、不具合潜在箇所特定部104から取得した不具合潜在箇所の情報およびCRUD情報に基づいて、CRUD図113を生成して出力する。CRUD図113は、CRUD図113中の不具合潜在箇所を強調表示する情報を含む。ある局面において、CRUD図113中の不具合潜在箇所の強調表示は、不具合箇所のカラムの色の変更、不具合箇所のカラムの罫線処理、文字のサイズの変更、文字の強調、文字の色の変更またはこれらの組み合わせ等の任意の強調表示を含み得る。ユーザは、不具合箇所を強調表示されたCRUD図113を参照することで、ソースコード112に含まれる大域変数に起因する潜在的な不具合を容易に発見することができる。
ある局面において、解析データDB121、CRUD情報DB122および不具合潜在パターンDB123は、リレーショナルDBであってもよいし、JSON(JavaScript(登録商標) Object Notation)等の任意の形式のデータを含んでいてもよい。また、他の局面において、CRUD図生成装置100は、過去に取得または生成した不具合潜在箇所のデータおよびCRUD図113をメモリ(図示せず)に格納してもよい。
図2は、CRUD図生成装置100のハードウェア構成の一例を示す図である。CRUD図生成装置100は、CPU(Central Processing Unit)201と、1次記憶装置202と、2次記憶装置203と、外部機器インターフェイス204と、入力インターフェイス205と、出力インターフェイス206と、通信インターフェイス207とを含む。
CPU201は、CRUD図生成装置100の各種機能を実現するためのプログラムを実行し得る。CPU201は、例えば、少なくとも1つの集積回路によって構成される。集積回路は、例えば、少なくとも1つのCPU、少なくとも1つのFPGA(Field Programmable Gate Array)、またはこれらの組み合わせ等によって構成されてもよい。
1次記憶装置202は、CPU201によって実行されるプログラムと、CPU201によって参照されるデータとを格納する。ある局面において、1次記憶装置202は、DRAM(Dynamic Random Access Memory)またはSRAM(Static Random Access Memory)等によって実現されてもよい。
2次記憶装置203は、不揮発性メモリであり、CPU201によって実行されるプログラムおよびCPU201によって参照されるデータを格納してもよい。その場合、CPU201は、2次記憶装置203から1次記憶装置202に読み出されたプログラムを実行し、2次記憶装置203から1次記憶装置202に読み出されたデータを参照する。ある局面において、2次記憶装置203は、HDD(Hard Disk Drive)、SSD(Solid State Drive)、EPROM(Erasable Programmable Read Only Memory)、EEPROM(Electrically Erasable Programmable Read Only Memory)またはフラッシュメモリ等によって実現されてもよい。
外部機器インターフェイス204は、プリンター、スキャナーおよび外付けHDD等の任意の外部機器に接続され得る。ある局面において、外部機器インターフェイス204は、USB(Universal Serial Bus)端子等によって実現されてもよい。
入力インターフェイス205は、キーボード、マウス、タッチパッドまたはゲームパッド等の任意の入力装置に接続され得る。ある局面において、入力インターフェイス205は、USB端子、PS/2端子およびBluetooth(登録商標)モジュール等によって実現されてもよい。
出力インターフェイス206は、ブラウン管ディスプレイ、液晶ディスプレイまたは有機EL(Electro-Luminescence)ディスプレイ等の任意の出力装置に接続され得る。ある局面において、出力インターフェイス206は、USB端子、D-sub端子、DVI(Digital Visual Interface)端子およびHDMI(登録商標)(High-Definition Multimedia Interface)端子等によって実現されてもよい。
通信インターフェイス207は、有線または無線のネットワーク機器と接続される。ある局面において、通信インターフェイス207は、有線LAN(Local Area Network)ポートおよびWi-Fi(登録商標)(Wireless Fidelity)モジュール等によって実現されてもよい。他の局面において、通信インターフェイス207は、TCP/IP(Transmission Control Protocol/Internet Protocol)、UDP(User Datagram Protocol)等の通信プロトコルを用いてデータを送受信してもよい。
次に、図3~図5を参照して、CRUD図生成装置100が参照または生成するCRUD情報、不具合潜在パターン111、および、CRUD図113について詳しく説明する。
図3は、本実施の形態に従うCRUD情報300の一例である。CRUD情報300は、各関数の各大域変数に対するCRUD処理の実行回数を示す。CRUD情報300は、例えば、図3に示すテーブル形式で、CRUD情報DB122に格納され得る。ある局面において、CRUD情報300は、JSON等の他の任意のデータ形式で表現されてもよい。CRUD情報300は、要素として、大域変数301と、関数302と、作成(C)303と、参照(R)304と、更新(U)305と、削除(D)306とを含む。
大域変数301は、ソースコード112に含まれる各大域変数を示す。関数302は、大域変数を使用した関数を示す。図3に示す例では、関数「funcA」は、大域変数「g_val_01, g_val_02, g_val_03」を使用している。また、関数「funcB」も、大域変数「g_val_01, g_val_02, g_val_03」を使用している。
作成(C)303は、大域変数が作成された回数を示す。参照(R)304は、大域変数が参照された回数を示す。更新(U)305は、大域変数が更新された回数を示す。削除(D)306は、大域変数が削除された回数を示す。CRUD情報300のテーブルの1行目を例に説明すると、大域変数「g_val_01」は、関数「funcA」により、1回作成され、1回参照され、1回更新されているが、一度も削除されていない。また、CRUD情報300のテーブルの4行目を例に説明すると、大域変数「g_val_02」は、関数「funcB」により、1回更新され、1回削除されているが、作成および参照はされていない。
図4は、本実施の形態に従う不具合潜在パターン111の一例である。不具合潜在パターン111は、CRUD図において問題を発生させ得るCRUD処理の実行回数の組み合わせを定義する。不具合潜在パターン111は、例えば、図4に示すテーブル形式で、不具合潜在パターンDB123に格納され得る。ある局面において、不具合潜在パターン111は、JSON等の他の任意のデータ形式で表現されてもよい。また、他の局面において、不具合潜在パターン入力部101は、必ずしも図4に示す形式のデータの入力を受け付ける必要はなく、大域変数ごとの潜在不具合パターンが含まれる任意の形式の情報の入力を受け付けてもよい。
不具合潜在パターン111は、要素として、ID(Identifier)401と、分類402と、対象403と、条件404とを含む。ID401は、各々の不具合を一意に示す。分類402は、不具合の分類を示す。図4に示す例では、分類402は、不具合および警告を含む。各不具合は、その危険度等に基づいて分類され得る。対象403は、その分析対象を示す。対象403は、例えば、大域変数および関数を含み得る。ある局面において、対象403は、オブジェクト指向プログラムのクラス等を含んでもよい。条件404は、不具合潜在箇所を検出する際の条件を示す。条件404は、CRUD処理の実行回数の組み合わせにより定義され得る。
図4のテーブルの1行目を例に説明すると、CRUD図生成装置100は、対象403「大域変数」において、条件404「C>0&&D==0(作成(C)が1回以上実行され、かつ、削除(D)が一度も実行されない)」が確認されたとき、ある大域変数において、分類402「不具合」の潜在的な不具合があると判定する。図4のテーブルの1行目は、大域変数のインスタンスが生成されているが(または、大域変数に動的にメモリが確保されたが)、大域変数のインスタンスが破棄されていない(または、大域変数に動的に確保されたメモリが解放されてない)ことを示す。このような場合、メモリリークが発生し得る。
図4のテーブルの2行目を例に説明すると、CRUD図生成装置100は、対象403「大域変数」において、条件404「U>0&&R==0(更新(U)が1回以上実行され、かつ、参照(R)が一度も実行されない)」が確認されたとき、ある大域変数において、分類402「警告」の潜在的な不具合があると判定する。図4のテーブルの2行目は、大域変数が更新されているが、その後一度も参照されていないことを示す。このような場合、ソースコード112は意味の無い処理を含む可能性がある。
ある局面において、対象403に「関数」が指定されていた場合、CRUD図生成装置100は、各関数における全ての大域変数に対するCRUD情報を合算する。CRUD図生成装置100は、各関数の合算結果が、条件404に含まれるパターンに合致するか否かを判定する。CRUD図生成装置100は、ある関数の合算結果が条件404に含まれるパターンに合致する場合、当該関数において潜在的な不具合があると判定する。
図5は、本実施の形態に従うCRUD図113の一例を示す図である。CRUD図113は、各関数の各大域変数に対するCRUD処理の実行回数の情報を含む。また、CRUD図113は、不具合潜在箇所を強調表示する。
CRUD図113は、要素として、大域変数501と、関数502,503を含む。なお、図5に示す関数「funcA, funcB」は一例であり、ある局面において、CRUD図113は、ソースコード112内の1以上の任意の数の関数を要素として含み得る。
図5の一行目を例に説明すると、大域変数501「g_val_01」は、関数502「funcA」において、1回作成(C)され、1回参照(R)され、1回更新(U)されている。また大域変数501「g_val_01」は、関数503「funcB」において、2回参照(R)され、1回更新(U)されている。図5の一行目は、図4の1行目の条件404「C>0&&D==0」に合致するため、強調表示されている。
図5の二行目を例に説明すると、大域変数501「g_val_02」は、関数502「funcA」において、1回作成(C)され、2回更新(U)されている。また大域変数501「g_val_02」は、関数503「funcB」において、1回更新(U)され、1回削除(D)されている。図5の二行目は、図4の2行目の条件404「U>0&&R==0」に合致するため、強調表示されている。なお、CRUD図113の強調表示は、分類402に応じて、適宜変更され得る。
図5の3行目は、図4のいずれの条件404にも合致しないため、強調表示されない。このように、CRUD図生成装置100は、不具合潜在箇所を強調表示したCRUD図113を出力する。ユーザは、当該CRUD図113を参照することで、ソースコード112内の大域変数による潜在的な不具合を含み得る箇所を発見しやすくなる。
次に、図6~図11を参照して、CRUD図生成装置100が、ソースコード112を解析してCRUD図113を出力するまでの処理の手順について説明する。ある局面において、CPU201は、図6~図9、図11および図12の各処理を行うためのプログラムを2次記憶装置203から1次記憶装置202に読み込んで、当該プログラムを実行してもよい。他の局面において、当該処理の一部または全部は、当該処理を実行するように構成された回路素子の組み合わせとしても実現され得る。
図6は、CRUD図生成装置100における不具合潜在パターン111の登録処理の手順の一例を示す図である。ステップS610において、CPU201は、入力インターフェイス205を介して、1または複数の不具合潜在パターン111を含む不具合潜在パターンファイルを取得する。ある局面において、CPU201は、外部機器インターフェイス204または通信インターフェイス207を介して、不具合潜在パターンファイルを取得してもよい。
ステップS620において、CPU201は、全ての不具合潜在パターン111の登録処理を完了するまで、ループ内部の処理を繰り返し実行する。ステップS630において、CPU201は、不具合潜在パターンファイルの中から1つの不具合潜在パターン111を取得する。
ステップS640において、CPU201は、ステップS630にて取得した不具合潜在パターン111が、既に不具合潜在パターンDB123に登録されているか否かを判定する。CPU201は、ステップS630にて取得した不具合潜在パターン111が、既に不具合潜在パターンDB123に登録されていると判定した場合(ステップS640にてYES)、制御をステップS620に移す。そうでない場合(ステップS640にてNO)、CPU201は、制御をステップS650に移す。ステップS650において、CPU201は、ステップS630にて取得した不具合潜在パターン111を不具合潜在パターンDB123に登録する。
図7は、CRUD図生成装置100におけるソースコード112の取得からCRUD図113の生成までの手順の一例を示す図である。ステップS710において、CPU201は、取得したソースコード112に対して静的解析を実行する。CPU201は、解析データを解析データDB121に格納する。
ステップS720において、CPU201は、解析データからCRUD情報を抽出する。CPU201は、CRUD情報をCRUD情報DB122に格納する。ステップS720の処理の詳細については図8を参照して説明する。
ステップS730において、CPU201は、不具合潜在パターン111に基づいて、ソースコード112内の不具合潜在箇所を特定する。ある局面において、CPU201は、不具合潜在箇所のデータを2次記憶装置203に格納してもよい。ステップS730の処理の詳細については図9を参照して説明する。
ステップS740において、CPU201は、CRUD情報および不具合潜在箇所からCRUD図113を生成して出力する。ある局面において、CPU201は、CRUD図113を2次記憶装置203に格納してもよい。ステップS740の処理の詳細については図11を参照して説明する。
図8は、CRUD図生成装置100におけるCRUD情報の抽出処理の手順の一例を示す図である。図8に示す処理は、図7のステップS720に対応する。ステップS810において、CPU201は、解析データに含まれる全ての変数の確認を完了するまで、ループ内部の処理を繰り返し実行する。
ステップS820において、CPU201は、解析データから変数を取り出す。ここでの変数は、ソースコード112に含まれる全ての変数を指し、また、大域変数および局所変数(ローカル変数)の両方を含み得る。ある局面において、変数は、構造体、配列、ポインタおよびクラス等を含み得る。
ステップS830において、CPU201は、取得した変数が大域変数であるか否かを判定する。CPU201は、取得した変数が大域変数であると判定した場合(ステップS830にてYES)、制御をステップS840に移す。そうでない場合(ステップS830にてNO)、CPU201は、制御をステップS820に移す。
ステップS840において、CPU201は、解析データに含まれる全ての関数の確認を完了するまで、ステップS850~ステップS870の処理を繰り返し実行する。ステップS850において、CPU201は、解析データから参照関数を取り出す。参照関数とは、ステップS820にて取得された変数に対して、CRUD処理を実行する関数である。
ステップS860において、CPU201は、CRUD情報を抽出する。より具体的には、CPU201は、ステップS850にて取り出された参照関数の、ステップS820にて取得された変数に対する、CRUD情報を抽出する。
ステップS870において、CPU201は、ステップS860にて抽出したCRUD情報をCRUD情報DB122に登録する。すでに、同一のデータがCRUD情報DB122に登録されていた場合、CPU201は、本ステップの処理を実行しなくてもよい。
図9は、CRUD図生成装置100における不具合潜在箇所の特定処理の手順の一例を示す図である。図9に示す処理は、図7のステップS730に対応する。ステップS905において、CPU201は、全ての不具合潜在パターンの確認が完了するまでループ内部の処理を繰り返し実行する。ステップS910において、CPU201は、不具合潜在パターンDB123から、不具合潜在パターン111を取り出す。
ステップS915において、CPU201は、判定対象が大域変数であるか否かを判定する。ここでの判定対象とは、ステップS910にて取得された不具合潜在パターン111に合致するか否かを判定される対象である。判定対象は、大域変数および関数を含み得る。ある局面において、大域変数は、構造体、配列、および、ポインタ等を含んでいてもよい。また、他の局面において、判定対象は、変数または/および関数を含むクラスを含んでいてもよい。CPU201は、判定対象が大域変数であると判定した場合(ステップS915にてYES)、制御をステップS920に移す。そうでない場合(ステップS915にてNO)、CPU201は、制御をステップS945に移す。
ステップS920において、CPU201は、全ての大域変数の確認を完了するまでループ内の処理を繰り返し実行する。ステップS925において、CPU201は、CRUD情報から大域変数を取り出す。
ステップS930において、CPU201は、大域変数のCRUD情報を合算する。ここでの合算とは、ステップS925にて取得された大域変数に対する各関数のCRUD処理の実行回数の合算である。例えば、大域変数「g_val_01」は、関数「funcA」によりCRUD処理「C(1)R(1)U(1)D(0)」を実行されるとする(例えば、C(1)は、作成(C)の1回実行を意味する)。また、大域変数「g_val_01」は、関数「funcB」によりCRUD処理「C(0)R(2)U(1)D(0)」を実行されるとする。この場合、CPU201は、関数「funcA」によるCRUD処理「C(1)R(1)U(1)D(0)」と、関数「funcB」によるCRUD処理「C(0)R(2)U(1)D(0)」とを合算して、合算結果「C(1)R(3)U(2)D(0)」を得る。
ステップS935において、CPU201は、合算結果が取り出した不具合潜在パターン111に合致するか否かを判定する。CPU201は、合算結果が取り出した不具合潜在パターン111に合致すると判定した場合(ステップS935にてYES)、制御をステップS940に移す。そうでない場合(ステップS935にてNO)、CPU201は、制御をステップS925に移す。
ステップS940において、CPU201は、不具合潜在パターン111に合致するCRUD処理を実行される大域変数を不具合潜在箇所として登録する。ある局面において、CPU201は、当該登録結果を2次記憶装置203に格納してもよい。
ステップS945において、CPU201は、全ての関数の確認を完了するまでループ内の処理を繰り返し実行する。ステップS950において、CPU201は、CRUD情報から関数を取り出す。
ステップS955において、CPU201は、ステップS950にて取り出した関数のCRUD処理の実行回数(CRUD情報)を合算する。例えば、関数「funcA」が、大域変数「g_val_01, g_val_02, g_val_03」の各々に対してCRUD処理「C(1)R(1)U(1)D(0)」、CRUD処理「C(1)R(0)U(2)D(0)」およびCRUD処理「C(1)R(1)U(1)D(0)」の各々を実行するとする。この場合、CPU201は、関数「funcA」の大域変数「g_val_01, g_val_02, g_val_03」の各々に対するCRUD処理の合算結果「C(3)R(2)U(4)D(0)」を得る。
ステップS960において、CPU201は、合算結果が取り出した不具合潜在パターン111に合致するか否かを判定する。CPU201は、合算結果が取り出した不具合潜在パターン111に合致すると判定した場合(ステップS960にてYES)、制御をステップS965に移す。そうでない場合(ステップS960にてNO)、CPU201は、制御をステップS945に移す。
ステップS965において、CPU201は、不具合潜在パターン111に合致するCRUD処理を実行する関数を不具合潜在箇所として登録する。ある局面において、CPU201は、当該登録結果を2次記憶装置203に格納してもよい。
図10は、本実施の形態に従う不具合潜在箇所のデータ1000の一例を示す図である。不具合潜在箇所のデータ1000は、図9に示す処理により生成および登録される。不具合潜在箇所のデータ1000は、要素として、ID1001と、不具合潜在箇所1002と、種別1003と、分類1004とを含む。
ID1001は、不具合潜在箇所のデータ1000に含まれる不具合潜在箇所を一意に識別する。不具合潜在箇所1002は、不具合が潜在する可能性がある大域変数または関数を示す。種別1003は、不具合潜在箇所1002の種類を示す。種別1003は、大域変数および関数を含み得る。分類1004は、不具合の分類を示す。分類1004は、不具合および警告を含み得る。
図11は、CRUD図生成装置100におけるCRUD図113の生成処理の手順の一例を示す図である。図11に示す処理は、図7のステップS740に対応する。
ステップS1110において、CPU201は、CRUD情報DB122から、大域変数の一覧を取り出す。ステップS1120において、CPU201は、CRUD情報DB122から、関数一覧を取り出す。ある局面において、CPU201は、ステップS1110およびステップS1120の処理を同時に実行してもよい。
ステップS1130において、CPU201は、取り出した全ての大域変数の確認が完了するまでループ内の処理を繰り返し実行する。ステップS1140において、CPU201は、CPU201は、取り出した全ての関数の確認が完了するまでループ内の処理を繰り返し実行する。ステップS1150において、CPU201は、CRUD情報DB122から取り出した大域変数および関数のCRUD図113を生成する。ステップS1160において、CPU201は、不具合潜在箇所のデータ1000に基づいて、CRUD図113内の不具合潜在箇所を強調表示に変更する。CPU201は、不具合潜在箇所を強調表示したCRUD図113を出力する。
以上説明したように、本実施の形態に従うCRUD図生成装置100は、プログラムのソースコード112を解析し、大域変数の処理に起因する不具合潜在箇所を強調表示したCRUD図113を出力する機能を備える。当該機能により、ユーザは、通常では発見することが難しい大域変数の処理に起因する不具合を発見しやすくなる。
実施の形態2.
次に、実施の形態2について説明する。本実施の形態は、タスクリストに基づくCRUD図を生成する点で、実施の形態1とは異なる。なお、実施の形態1と同一の構成については同じ符号を付し、説明を繰り返さない。
図12は、本実施の形態に従うCRUD図生成装置1200の機能構成の一例を示す図である。ある局面において、図12に示す各機能ブロックは、図2に示すハードウェアがソフトウェアと協働することにより実現され得る。
CRUD図生成装置1200は、不具合潜在パターン入力部1201と、静的解析部102と、CRUD情報抽出部1203と、タスク結合部1206と、不具合潜在箇所特定部1204と、CRUD図生成部1205とを備える。
タスクリスト1214は、タスク(機能)の名称と、当該タスクのエントリーポイントとなる関数名とを含む。例えば、タスクとは、オンラインショップのソフトウェアにおける、商品の購入処理等の個別の機能を含み得る。また、エントリーポイントとなる関数とは、当該タスクの処理を開始する関数である。
タスク結合部1206は、取得したタスクリスト1214に基づいて、タスクリスト1214に含まれるタスクに関連する関数をグループ化する。以下、あるタスクに関連する関数をグループ化したデータを「タスク情報」と呼ぶ。タスク結合部1206は、当該タスク情報を解析データDB121に保存する。当該タスク情報は、静的解析部102の出力する解析データに関連付けられていてもよい。
不具合潜在パターン入力部1201は、タスク単位の不具合潜在パターン1211の入力を受け付ける。CRUD情報抽出部1203は、タスク情報に基づき、タスク単位でCRUD情報を抽出する。ある局面において、CRUD情報抽出部1203は、解析データから関数単位でCRUD情報を抽出してもよい。その場合、不具合潜在箇所特定部1204が、タスク単位となるように、関数のCRUD情報を合算し得る。
不具合潜在箇所特定部1204は、タスク単位で、ソースコード112内に潜在的不具合があるか否かを特定する。すなわち、不具合潜在箇所特定部1204は、タスクが含む関数群のCRUD情報の合算値に基づいて、ソースコード112内に潜在的不具合があるか否かを特定する。
CRUD図生成部1205は、大域変数におけるタスク単位でのCRUD情報を含むCRUD図1215を生成する。強調表示される不具合特定箇所もタスク単位となる。タスク単位でのCRUD情報は、タスクに含まれる各関数のCRUD情報の合算値である。
図13は、タスクの一例を示す図である。図13に示す例では、ソースコード112は、タスク1300と、タスク1310とを含む(タスクを機能と呼び変えてもよい)。また、タスク1300は、関数「funcA, funcB, funcC, funcD, funcE, funcF」を含む。タスク1310は、関数「funcG, funcH, funcI」を含む。この場合、タスク1300のCRUD情報とは、関数「funcA, funcB, funcC, funcD, funcE, funcF」の各々のCRUD情報の合算値になる。また、タスク1310のCRUD情報とは、関数「funcG, funcH, funcI」の各々のCRUD情報の合算値になる。
図14は、タスク単位の不具合潜在パターン1211の一例を示す図である。不具合潜在パターン1211は、要素として、ID1401と、分類1402と、対象1403と、条件1404とを含む。不具合潜在パターン1211は、例えば、図14に示すテーブル形式で、不具合潜在パターンDB123に格納され得る。ある局面において、不具合潜在パターン1211は、JSON等の他の任意のデータ形式で表現されてもよい。
ID1401は、各々の不具合を一意に示す。分類1402は、不具合の分類を示す。図14に示す例では、分類1402は、「不具合」および「警告」を含む。各不具合は、その危険度等に基づいて分類され得る。対象1403は、その分析対象を示す。対象1403は、例えば、大域変数(タスク)、大域変数および関数を含み得る。大域変数(タスク)とは、タスク単位でCRUD情報を解析される大域変数である。条件1404は、不具合潜在箇所を検出する際の条件を示す。図14に示す例において、条件1404は、「タスク参照数>=4(4つ以上のタスクから参照される大域変数)」と「タスク参照数==1(単一のタスクのみから参照される大域変数)」とを含む。
例えば、単一のタスクのみから参照されている大域変数は、局所変数に変更可能な場合がある。CRUD図生成装置1200は、単一のタスクのみから参照されている大域変数をリファクタリングの指標としてユーザに提示することにより、ソースコード112の不具合解析の工数を削減し得る。
図15は、タスク単位のCRUD図1215の一例を示す図である。CRUD図1215は、要素として、大域変数1501と、タスク1502~1505とを含む。なお、タスク1502~1505は一例であり、ある局面において、CRUD図1215は、任意の数のタスクを要素として含んでいてもよい。図15に示す例では、複数の関数がタスク1~タスク4に集約されている。各タスクのGRUD情報は、各タスクに含まれる関数のCRUD情報の合算値(タスク単位のCRUD情報)である。
CRUD図1215の一行目は、大域変数1501「g_val_01」が4つ以上のタスクから参照されており、不具合潜在パターン1211に含まれる条件1404「タスク参照数>=4」に合致するため、強調表示されている。また、CRUD図1215の三行目は、大域変数「g_val_03」が1つのタスクから参照されており、不具合潜在パターンに含まれる条件「タスク参照数==1」に合致するため、強調表示されている。
次に、図16および図17を参照して、CRUD図生成装置1200が、タスクを結合する処理と、不具合潜在箇所を特定する処理とについて説明する。ある局面において、CPU201は、図16および図17の処理を行うためのプログラムを2次記憶装置203から1次記憶装置202に読み込んで、当該プログラムを実行してもよい。他の局面において、当該処理の一部または全部は、当該処理を実行するように構成された回路素子の組み合わせとしても実現され得る。
図16は、CRUD図生成装置1200におけるタスク結合処理の一例を示す図である。ステップS1610において、CPU201は、入力されたタスクリスト1214と、ソースコード112の解析データとを読み込む。ある局面において、CPU201は、解析データの代わりに、関数の情報を含むCRUD情報を取得してもよい。
ステップS1620において、CPU201は、タスクリスト1214に含まれる全ての関数(エントリーポイントとなる関数)の確認を完了するまでループ内の処理を繰り返し実行する。
ステップS1630において、CPU201は、タスクリスト1214から、タスク名およびエントリーポイントとなる関数を取り出す。ステップS1640において、CPU201は、解析データに含まれる関数を全て取り出す。
ステップS1650において、CPU201は、全ての呼び出し関数の確認を完了するまでループ内の処理を繰り返し実行する。「呼び出し関数」とは、エントリーポイントとなる関数から直接的または間接的に参照される関数である。図13に示す例では、関数「funcA」がエントリーポイントとなる関数であり、関数「funcB, funcC, funcD, funcE, funcF」が呼び出し関数である。
ステップS1660において、CPU201は、解析データに含まれる関数の1つが、呼び出し関数であれば、タスクの関数として登録する。ある局面において、CPU201は、複数のタスクの各々に、関数を登録してもよい。
ステップS1670において、CPU201は、作成したタスク情報を登録する。ある局面において、2次記憶装置203に、エントリーポイントとなる関数、呼び出し関数、およびタスク名を含むタスク情報を保存してもよい。
図17は、CRUD図生成装置1200における不具合潜在箇所を特定する処理の一例を示す図である。ステップS1710において、CPU201は、全ての不具合潜在パターンの確認を完了するまでループ内の処理を繰り返し実行する。ステップS1720において、CPU201は、不具合潜在パターンDB123から、不具合潜在パターン1211を取り出す。
ステップS1730において、CPU201は、判定対象が大域変数(タスク)であるか否かを判定する。CPU201は、判定対象が大域変数(タスク)であると判定した場合(ステップS1730にてYES)、制御をステップS1740に移す。そうでない場合(ステップS1730にてNO)、CPU201は、制御をステップS1790に移す。判定対象は、大域変数(タスク)以外に、通常の大域変数および関数を含み得る。
ステップS1740において、CPU201は、全ての大域変数の確認を完了するまでループ内の処理を繰り返し実行する。ステップS1750において、CPU201は、タスク単位のCRUD情報から、大域変数を取り出す。
ステップS1760において、CPU201は、タスク単位のCRUD情報から、ステップS1750にて取り出した大域変数を参照するタスクの数を取得して保存する。ある局面において、CPU201は、大域変数を参照するタスクの数だけでなく、任意のCRUD処理に関する情報を取得して保存し得る。
ステップS1770において、CPU201は、ステップS1760にて保存した情報が取り出した不具合潜在パターン1211に合致するか否かを判定する。CPU201は、ステップS1760にて保存した情報が取り出した不具合潜在パターン1211に合致すると判定した場合(ステップS1770にてYES)、制御をステップS1780に移す。そうでない場合、CPU201は、制御をステップS1740に移す。
ステップS1780において、CPU201は、不具合潜在パターン1211に合致するCRUD処理を実行される大域変数を不具合潜在箇所として登録する。ある局面において、CPU201は、当該登録結果を2次記憶装置203に格納してもよい。ステップS1790において、CPU201は、その他の対象(大域変数および関数等)の場合の処理を実行する。その他の対象の場合の処理は、図9に示す処理等を含む。
以上説明したように、本実施の形態に従うCRUD図生成装置1200は、膨大なソースコード112の全てを解析せずに、解析対象をタスク(機能)に関連する関数および大域変数に絞る。それにより、CRUD図生成装置1200は、効率的に大域変数に起因する潜在的不具合を特定することができる。
実施の形態3.
次に、実施の形態3について説明する。本実施の形態は、実施の形態2の構成にタスク間依存抽出部1861をさらに加えたものであり、タスク間で共有する大域変数の個数をタスク間の依存度として抽出し、抽出結果をファイルとして出力する点で、実施の形態1および2とは異なる。
図18は、本実施の形態に従うCRUD図生成装置1850の機能構成の一例を示す図である。ある局面において、図18に示す各機能ブロックは、図2に示すハードウェアがソフトウェアと協働することにより実現され得る。
CRUD図生成装置1850は、CRUD図生成装置1200の構成に加えて、タスク間依存抽出部1861を備える。タスク間依存抽出部1861は、CRUD情報DB122から、解析対象のソースコード112に含まれるタスク毎のCRUD情報を取得する。次に、タスク間依存抽出部1861は、各タスク間で共有される大域変数の数をタスク間依存度として抽出する。一例として、タスク間依存抽出部1861は、タスク1とタスク2との間で共有される大域変数の数を、タスク1およびタスク2のタスク間依存度として抽出する。
タスク間依存抽出部1861は、各タスク間で共有している大域変数の数(タスク間依存度)を抽出し、タスク間依存度の出力ファイル1851を出力する。タスク間依存度の出力ファイル1851は、大域変数が3つ以上ある場合、複数のタスク間依存度(例えば、大域変数1,2のタスク間依存度、大域変数2,3のタスク間依存度、大域変数3,1のタスク間依存度等)を含む。
図19は、タスク間依存度の出力ファイル1851の抽出手順の一例を示す図である。図19に示される例では、解析対象のソースコード112は、タスク1~4と、大域変数「g_val_01」、「g_val_02」、「g_val_03」、「g_val_04」および「g_val_05」とを含む。
タスク間依存抽出部1861は、全てのタスクの組合わせ毎にタスク間依存度を抽出し、これらのタスク間依存度をタスク間依存度の出力ファイル1851に含める。例えば、タスク1,2は、「g_val_01」、「g_val_02」および「g_val_04」を共有している。そのため、タスク間依存抽出部1861は、タスク1およびタスク2のタスク間依存度「3」を抽出する。
図20は、タスク間依存度の出力ファイル1851の一例を示す図である。図20に示されるタスク間依存度の出力ファイル1851は、図19に示されるCRUD情報から生成されたものである。一例として、レコード2051を参照すると、タスク1およびタスク2のタスク間依存度は「3」であり、タスク1およびタスク3のタスク間依存度は「2」であり、タスク1およびタスク4のタスク間依存度は「1」である。
基本的にタスク間で依存度が高いほど(共有するタスクの数が多いほど)、大域変数の管理が複雑になり、不具合が発生しやすくなる。そのため、CRUD図生成装置1850は、タスク間依存度をユーザに提示することにより(タスク間依存度の大きい大域変数をユーザに提示することにより)、ソースコード112の不具合解析の工数を削減し得る。
図21は、CRUD図生成装置1850におけるタスク間依存度の出力ファイル1851を出力するまでの処理の手順の一例を示す図である。
ステップS2160において、CPU201は、全てのタスクを確認するまで、ループ内の処理を繰り返し実行する。
ステップS2165において、CPU201は、CRUD情報DB122から取得したCRUD情報の中から、タスクを取り出す。
ステップS2170において、CPU201は、ステップS2165にて取り出したタスク以外の全てのタスクを確認するまで、ループ内の処理を繰り返し実行する。例えば、解析対象のソースコード112がタスク1~5を含んでいた場合に、ステップS2165にてタスク1が取り出されたとき、CPU201は、タスク2~5を全て確認するまでステップS2175以下の処理をループする。
ステップS2175において、CPU201は、取り出した2つのタスクで共有される大域変数をカウントする。例えば、ステップ2165にてタスク1が取り出され、ステップS2170にてタスク2が取り出された場合、CPU201は、タスク1およびタスク2間で共有される大域変数をカウントする。
ステップS2180において、CPU201は、取り出した2つのタスクで共有される大域変数の数をタスク間依存度として保存する。ある局面において、CPU201は、タスク間依存度を一時的に1次記憶装置202に保存してもよいし、または2次記憶装置203に保存してもよい。
ステップS2185において、CPU201は、各タスク間のタスク間依存度の結果をファイル(タスク間依存度の出力ファイル1851)に出力する。
実施の形態4.
次に、実施の形態4について説明する。本実施の形態は、ソースコード112が改変される前のCRUD図113と、ソースコード112が改変された後のCRUD図113とを比較し、不具合が潜在している可能性の高い箇所を強調表示したCRUD図の差分ファイル1815を生成する点で、実施の形態1~3とは異なる。なお、実施の形態1~3と同一の構成については同じ符号を付し、説明を繰り返さない。
図22は、本実施の形態に従うCRUD図生成装置1800の機能構成の一例を示す図である。ある局面において、図22に示す各機能ブロックは、図2に示すハードウェアがソフトウェアと協働することにより実現され得る。
CRUD図生成装置1800は、不具合潜在パターン入力部1801と、静的解析部102と、CRUD情報抽出部103と、不具合潜在箇所特定部104と、CRUD図生成部105と、CRUD図比較部1807とを備える。
CRUD図生成装置1800は、実施の形態1のCRUD図生成装置100と同一の処理手順により、CRUD図113を生成する。CRUD図生成装置1800は、過去に生成したCRUD図113をCRUD図履歴DB1824に格納する。ある局面において、CRUD図履歴DB1824は、CRUD図生成装置1800内にあってもよいし、外部の装置内にあってもよい。
不具合潜在パターン入力部1801は、通常の不具合潜在パターン111に加えて、ソースコード112の更新前後の差分を対象とした不具合潜在パターン1811の入力を受け付ける。
CRUD図比較部1807は、CRUD図履歴DB1824から、ソースコード112が改変される前のCRUD図113と、ソースコード112が改変された後のCRUD図113とを取得してその差分を出力する。そして、CRUD図比較部1807は、不具合潜在パターン1811に基づいて、差分に含まれる大域変数に起因する不具合潜在箇所を特定する。CRUD図比較部1807は、不具合潜在箇所を強調表示したCRUD図の差分ファイルを生成して出力する。
図23は、不具合潜在パターン1811の一例を示す図である。不具合潜在パターン1811は、要素として、ID1901と、分類1902と、対象1903と、条件1904とを含む。
ID1901は、各々の不具合を一意に示す。分類1902は、不具合の分類を示す。一例として、分類1902は、「不具合」および「警告」を含む。各不具合は、その危険度等に基づいて分類され得る。対象1903は、その分析対象を示す。対象1903は、例えば、関数(比較)、大域変数(追加)を含み得る。関数(比較)は更新された関数であり(追加または削除も含み得る)、大域変数(追加)は新たに追加された大域変数である。
条件1904は、不具合潜在箇所を検出する際の条件を示す。図23に示す例において、条件1904は、「新規追加変数参照」、「参照回数変化」および「参照箇所変化」を含む。新規追加変数参照は、新しく追加された変数を参照することを示し、参照回数変化は、変数を参照する回数が変化したことを示す。また、参照箇所変化は、変数を新規に参照、または、参照しなくなった関数が存在することを示す。
図24は、CRUD図の差分ファイル1815の一例を示す図である。CRUD図の差分ファイル1815は、要素として、差分種別2001と、大域変数2002と、関数2003~2006とを含む。関数2003~2006は、一例であり、ある局面において、CRUD図の差分ファイル1815は、任意の数の関数を要素として含んでもよい。
差分種別2001は、ソースコード112の変更の前後における差分の種類を示す。「追加」は、ソースコード112の更新により、大域変数が追加されたことを示す。「変更」は、ソースコード112の更新により、大域変数のCRUD処理の実行回数に変化が生じたことを示す。「変更なし」は、「変更」にも「追加」にも該当しないことを示す。図24に示す例では、大域変数2002「g_val_02」において、CRUD処理の実行回数が変化しており、大域変数2002「g_val_03」が新たに追加されている。また、大域変数「g_val_04」において、CRUD処理の実行回数が変化しており、大域変数「g_val_04」は関数「funcB」から新たに参照され(2回Readされ)、関数「funcC」から更新されなくなっている(Updateされなくなっている)。
CRUD図の差分ファイル1815の2行目を例に説明すると、関数「funcB, funcC」は、大域変数2002「g_val_02」に対するCRUD処理の実行回数に変化が生じているため、不具合潜在箇所として強調表示される。
また、CRUD図の差分ファイル1815の3行目を例に説明すると、大域変数2002「g_val_03」はソースコード112の更新により追加されている。そして、関数「funcB, funcD」は、新たに追加された大域変数2002「g_val_03」に対してCRUD処理を実行するため、不具合潜在箇所として強調表示される。
さらに、CRUD図の差分ファイル1815の4行目を例に説明すると、関数「funcB」は大域変数2002「g_val_04」に対するCRUD処理が新規に追加されており、また、関数「funcC」は大域変数「g_val_04」に対するCRUD処理が削除されているため、不具合潜在箇所として強調表示されている。
新しく参照された(または参照されなくなった)大域変数と、当該大域変数を新しく参照する(または参照しなくなった)関数とが明確になることにより、排他処理の確認または大域変数の影響範囲の確認等が容易になる。CRUD図生成装置1800は、CRUD図の差分ファイル1815をユーザに提示することで、ソースコード112の不具合解析の工数を削減し得る。
図25は、CRUD図生成装置1800におけるCRUD図の差分ファイル1815を生成する処理手順の一例を示す図である。ある局面において、CPU201は、図25の処理を行うためのプログラムを2次記憶装置203から1次記憶装置202に読み込んで、当該プログラムを実行してもよい。他の局面において、当該処理の一部または全部は、当該処理を実行するように構成された回路素子の組み合わせとしても実現され得る。ステップS2105において、CPU201は、CRUD図履歴DB1824から、ソースコード112の更新前後のCRUD図113を取得する。
ステップS2110において、CPU201は、ソースコード112の更新前後で大域変数の数に差分があるか否かを判定する。CPU201は、ソースコード112の更新前後で大域変数の数に差分があると判定した場合(ステップS2110にてYES)、制御をステップS2115に移す。そうでない場合(ステップS2110にてNO)、CPU201は、制御をステップS2120に移す。
ステップS2115において、CPU201は、差分のある大域変数およびCRUD情報を差分箇所として抽出する。ステップS2120において、CPU201は、全ての大域変数の確認を完了するまでループ内の処理を繰り返し実行する。
ステップS2125において、CPU201は、ソースコード112の更新後のCRUD図113から、大域変数を取得する。ステップS2130において、CPU201は、全ての関数のCRUD情報の確認を完了するまでループ内の処理を繰り返し実行する。
ステップS2135において、CPU201は、ステップS2125で取得した大域変数のCRUD情報と、ソースコード112の更新前のCRUD図に含まれる同一変数のCRUD情報とを比較する。または、CPU201は、ソースコード112の更新後のCRUD図113から取得した関数のCRUD情報と、ソースコード112の更新前のCRUD図に含まれる同一関数のCRUD情報とを比較してもよい。
ステップS2140において、CPU201は、ステップS2135の比較で差分があるか否かを判定する。CPU201は、ステップS2135の比較で差分があると判定した場合(ステップS2140にてYES)、制御をステップS2145に移す。そうでない場合(ステップS2140にてNO)、CPU201は、制御をステップS2130に移す。
ステップS2145において、CPU201は、差分箇所として差分に関係する大域変数および関数を抽出する。ステップS2150において、CPU201は、不具合抽出処理を実行する。より具体的には、CPU201は、不具合潜在パターン1811に基づいて、ステップS2145で抽出された差分に含まれる潜在的な不具合を特定する。
ステップS2155において、CPU201は、ステップS2145で抽出された差分に基づいて、CRUD図の差分ファイル1815を生成して出力する。CPU201は、ステップS2150で特定した不具合に基づいて、CRUD図の差分ファイル1815の潜在的な不具合箇所を強調表示に変更する。
以上説明したように、本実施の形態に従うCRUD図生成装置1800は、ソースコード112の更新前後における差分に基づいて、CRUD図の差分ファイル1815を作成する機能を備える。当該機能により、ユーザは、CRUD図の差分ファイル1815を参照することで、ソースコード112の更新に基づく不具合箇所を特定しやすくなる。なお、各々の実施の形態に記載された内容は適宜組み合わせて使用されてもよい。
今回開示された実施の形態は全ての点で例示であって制限的なものではないと考えられるべきである。本開示の範囲は上記した説明ではなくて請求の範囲によって示され、請求の範囲と均等の意味及び範囲内で全ての変更が含まれることが意図される。また、実施の形態および各変形例において説明された開示内容は、可能な限り、単独でも、組合わせても、実施することが意図される。