以下,本実施の形態について,図を用いて説明する。
図1は,本実施の形態による静的解析装置の構成例を示す図である。
静的解析装置10は,プログラミング言語で記述されたソースプログラムに対する静的解析を行い,ソースプログラムの欠陥を指摘する。ソースプログラムは,ソースコードや原始プログラムなどとも呼ばれる。静的解析は,ソースプログラムの状態で,プログラムを実行せずに,プログラムの欠陥を抽出する解析手法である。静的解析装置10には,ディスプレイ20等の表示装置や,キーボード/マウス30等の入力装置が接続されている。
静的解析装置10は,ソースプログラム記憶部11,欠陥情報生成部12,欠陥情報記憶部13,欠陥指摘画面出力部14,ヒント情報生成部15,条件設定画面出力部16,条件入力受付部17,条件情報記憶部18を備える。
ソースプログラム記憶部11は,プログラミング言語で記述されたソースプログラムのファイルを記憶する,コンピュータがアクセス可能な記憶部である。
欠陥情報生成部12は,ソースプログラムから欠陥箇所を抽出し,抽出された欠陥箇所の情報を収集して欠陥情報を生成する。このとき,ソースプログラムから抽出される欠陥箇所には,欠陥であるか否かを確定できないと判定された箇所も含まれる。欠陥情報生成部12は,ソース解析部121,ソース情報記憶部122,欠陥判定抽出部123を備える。
ソース解析部121は,ソースプログラム記憶部11に記憶されたソースプログラムに対して字句解析,構文解析等の解析を行い,ソースプログラムの解析結果であるソース情報を生成する。
ソース情報記憶部122は,ソース解析部121により生成されたソース情報を記憶する,コンピュータがアクセス可能な記憶部である。本実施の形態では,ソース情報として,制御フロー,データフロー等が生成され,ソース情報記憶部122に記憶される。
欠陥判定抽出部123は,ソース情報記憶部122に記憶されたソース情報に基づいて,ソースプログラム上の欠陥の可能性がある箇所を欠陥に関する指摘を行う箇所の候補とし,その候補に対して欠陥の種類に応じた詳細な探索を行い,欠陥であるか否かの判定を行う。
欠陥判定抽出部123による判定結果は,大きく分けて,欠陥である,欠陥でない,欠陥であるか否かを確定できないの3通りに分類される。欠陥判定抽出部123は,欠陥の可能性がある箇所について行った探索で,未確定の要素がなく,欠陥であるか否かの答えが得られた場合に,それぞれ欠陥である,欠陥でないと判定する。欠陥判定抽出部123は,欠陥の可能性がある箇所について行った探索で,復帰値が未確定である関数などの未確定要素を含むために欠陥であるか否かの答えが得られない場合に,欠陥であるか否かが確定できないと判定する。なお,以下では,欠陥であることを×,欠陥でないことを○,欠陥であるか否かを確定できないことを△で示す。
本実施の形態の静的解析装置10では,欠陥判定抽出部123は,×と判定した箇所と△と判定した箇所とを指摘する欠陥箇所として抽出し,抽出された欠陥箇所の情報を収集して欠陥情報に記録する。△と判定した箇所については,欠陥判定抽出部123は,欠陥を確定できない理由についても欠陥情報に記録する。
欠陥情報記憶部13は,ソースプログラムから抽出された欠陥箇所に関する情報が記録された欠陥情報を記憶する,コンピュータがアクセス可能な記憶部である。欠陥情報記憶部13には,欠陥箇所の情報として,△と判定された箇所,すなわち,ソースプログラムに対して行われた静的解析において,未確定要素を含むために欠陥であるか否か確定できないと判定されたソースプログラム中の箇所の情報も記憶されている。
欠陥指摘画面出力部14は,欠陥情報記憶部13に記憶された欠陥情報に基づいて,ユーザに対してソースプログラムの欠陥箇所を指摘する欠陥指摘画面を,ディスプレイ20等の表示装置に表示させる制御を行う。このとき,欠陥指摘画面出力部14は,共通の未確定要素を含む複数の△と判定された箇所について,それら複数の箇所のそれぞれを示す情報と,共通の未確定要素を示す情報とを対応付けて,欠陥指摘画面をディスプレイ20等の表示装置に表示させる。
以下,本実施の形態では,△と判定された箇所の指摘を,欠陥未確定の指摘と呼ぶ。また,欠陥を確定できない理由を,未確定理由と呼ぶ。未確定理由には,欠陥を確定できない理由の要因となる未確定要素が含まれる。例えば,「関数の復帰値が未確定である」という未確定理由には,「関数の復帰値」という未確定要素が含まれる。
ヒント情報生成部15は,ユーザから条件設定する旨の指示を受けたときに,ユーザによる未確定理由を解消する条件の入力を支援するヒント情報を生成する。ヒント情報は,欠陥未確定の指摘が欠陥である(×)ことを示す指摘に変換される条件の情報や,欠陥未確定の指摘が欠陥でない(○)ことを示す指摘に変換される条件の情報などである。欠陥未確定の指摘が欠陥である(×)ことを示す指摘に変換される条件は,欠陥であると判定される未確定要素の範囲である。また,欠陥未確定の指摘が欠陥でない(○)ことを示す指摘に変換される条件は,欠陥でないと判定される未確定要素の範囲である。
例えば,ヒント情報生成部15は,関数の復帰値が未確定要素である欠陥未確定の指摘について,欠陥情報記憶部13に記憶された欠陥情報を参照して,その欠陥未確定の指摘が欠陥でない(○)ことを示す指摘に変換される関数の復帰値の範囲を,ヒント情報として求める。また,ヒント情報生成部15は,関数の復帰値が未確定要素である欠陥未確定の指摘について,欠陥情報記憶部13に記憶された欠陥情報を参照して,その欠陥未確定の指摘が欠陥である(×)ことを示す指摘に変換される関数の復帰値の範囲を,ヒント情報として求める。
条件設定画面出力部16は,ユーザから条件設定する旨の指示を受けたときに,ユーザが未確定理由を解消する条件を入力する条件設定画面を,ディスプレイ20等の表示装置に表示させる制御を行う。このとき,条件設定画面出力部16は,条件設定画面に,生成されたヒント情報を掲載する。条件設定画面にヒント情報が掲載されることにより,ユーザは,設定する条件を判断し易くなる。本実施の形態による条件設定画面では,未確定理由を解消する条件が,未確定理由ごとにまとめて入力できるようになっている。
条件入力受付部17は,欠陥未確定の指摘について,未確定理由ごとにまとめて,その未確定理由を解消する条件の入力を受け付ける。欠陥未確定の指摘の未確定理由を解消する条件は,例えば,欠陥未確定とされた箇所に含まれる未確定要素を制限する条件となる。条件入力受付部17は,共通の未確定要素を含む欠陥未確定とされた箇所ごとに,その共通の未確定要素を制限する条件の入力を受け付ける。
ユーザは,例えば,キーボード/マウス30等の入力装置を用いて,条件設定画面上で未確定理由を解消する条件を入力する。条件入力受付部17は,ユーザによる未確定理由を解消する条件の入力を受け付け,受け付けた条件を未確定理由に対応付けて条件情報記憶部18に記憶された条件情報に記録する。
条件情報記憶部18は,未確定理由と,ユーザにより入力された,その未確定理由を解消する条件との対応が記録された条件情報を記憶する,コンピュータがアクセス可能な記憶部である。
上述の欠陥指摘画面出力部14は,指摘変換部141を備える。指摘変換部141は,条件情報記憶部18に記憶された条件情報を参照し,共通の未確定要素を含む複数の箇所のそれぞれにおいて,その共通の未確定要素がユーザにより入力された条件を満たす場合に欠陥であるか否かを再判定する。指摘変換部141は,再判定の結果に基づいて,欠陥未確定の指摘を,欠陥であることを示す指摘または欠陥でないことを示す指摘に変換する。
欠陥指摘画面出力部14は,欠陥未確定の指摘を変換した結果を含む欠陥指摘画面を,ディスプレイ20などの表示装置に表示させる制御を行う。例えば,欠陥指摘画面出力部14は,欠陥未確定の指摘から変換された欠陥であることを示す指摘,すなわち再判定で未確定要素がユーザにより入力された条件を満たす場合に欠陥であると判定したソースプログラム中の箇所を示す情報を含む欠陥指摘画面を表示させる。
欠陥判定抽出部123によるソースプログラムを解析した情報のみでの欠陥の判定では,対象のソースプログラムだけでは値が確定できない関数の復帰値などの未確定要素を含む箇所について,欠陥であるか否かを確定することができない。ただし,プログラム開発者であるユーザは,そのような未確定要素となる関数の復帰値などをあらかじめ想定してソースプログラムの設計を行っており,ユーザが未確定要素となる関数の復帰値の範囲などを特定できるケースもある。このような場合に,特定できる関数の復帰値の範囲などを未確定要素を制限する条件としてユーザに入力させ,入力された条件で欠陥であるか否かの判定を行うことで,確定できなかった欠陥を,欠陥であるかまたは欠陥でないかに確定できる。
このように,本実施の形態による静的解析装置10は,ソースプログラムの静的解析結果として欠陥未確定の指摘を含めてユーザに提示する際に,それらの解析結果を確認するユーザを支援する解析支援機能を有する。
例えば,静的解析装置10の解析支援機能によって,複数の欠陥未確定の指摘と,それらの欠陥未確定の指摘に共通の未確定要素とを対応付けて,ユーザに提示することが可能となる。また,例えば,静的解析装置10の解析支援機能によって,ユーザにより入力された共通の未確定要素を制限する条件で,共通の未確定要素を持つ複数の欠陥未確定の指摘を,それぞれ欠陥であることを示す指摘と欠陥でないことを示す指摘に変換して,ユーザに提示することが可能となる。
本実施の形態の静的解析装置10が有する解析支援機能によって,ソースプログラムの静的解析において,欠陥であるか否かを確定できないと判定された箇所の指摘をユーザに対して提示する際に,それらの指摘を確認するユーザの手間を軽減することが可能となる。
図2は,本実施の形態による静的解析装置のハードウェア構成例を示す図である。
図1に示す本実施の形態の静的解析装置10は,CPU(Central Processing Unit )101,主記憶となるメモリ102,入出力インタフェース103,記憶装置104,入力装置105,出力装置106を備えるコンピュータ100によって実現される。記憶装置104は,例えばHDD(Hard Disk Drive )などである。出力装置は,例えば図1に示すディスプレイ20等の表示装置などである。入力装置105は,例えば図1に示すキーボード/マウス30などである。
図1に示す静的解析装置10および静的解析装置10が備える各機能部は,コンピュータ100が備えるCPU101,メモリ102等のハードウェアと,ソフトウェアプログラムとによって,実現することが可能である。コンピュータ100が実行可能なプログラムは,記憶装置104に記憶され,その実行時にメモリ102に読み出され,CPU101により実行される。
なお,コンピュータ100は,可搬型記録媒体から直接プログラムを読み取り,そのプログラムに従った処理を実行することもできる。また,コンピュータ100は,サーバコンピュータからプログラムが転送されるごとに,逐次,受け取ったプログラムに従った処理を実行することもできる。さらに,このプログラムは,コンピュータ100で読み取り可能な記録媒体に記録しておくことができる。
図3は,本実施の形態の静的解析装置による静的解析処理フローチャートである。
静的解析装置10において,ユーザは,キーボード/マウス30を用いて,ソースプログラム記憶部11に記憶されているソースプログラムを指定した,静的解析の実行を指示する。
欠陥情報生成部12は,ソースプログラムから,△と判定された箇所を含む欠陥箇所を抽出する(ステップS10)。本実施の形態では,静的解析装置10は,解析対象のソースプログラムの欠陥箇所として,×と判定された箇所と△と判定された箇所とを,ユーザに対して提示する。欠陥情報生成部12は,ソースプログラムを解析して×と判定された箇所と△と判定された箇所とを欠陥箇所として抽出し,抽出された欠陥箇所の情報を収集して欠陥情報を生成する。欠陥情報は,欠陥情報記憶部13に記憶される。
欠陥指摘画面出力部14は,抽出した欠陥箇所の指摘を出力する。本実施の形態では,欠陥指摘画面出力部14は,欠陥情報記憶部13に記憶された欠陥情報に基づいて,ソースプログラムから抽出した欠陥箇所を指摘する欠陥指摘画面を,ディスプレイ20等の表示装置に出力する(ステップS11)。このとき,欠陥指摘画面出力部14は,欠陥未確定の指摘について未確定理由ごとにまとめた情報を含む欠陥指摘画面を出力する。
ユーザは,欠陥指摘画面において,未確定理由を指定して,その未確定理由を解消する条件の設定を指示する。
ヒント情報生成部15は,欠陥情報記憶部13に記憶された欠陥情報に基づいて,条件の設定が指示された未確定理由を解消する条件の入力を支援するヒント情報を生成する(ステップS12)。本実施の形態では,ヒント情報として,条件の設定が指示された未確定理由を持つ欠陥未確定の指摘ごとに,それぞれ欠陥であることを示す指摘に変換される条件の情報と,欠陥でないことを示す指摘に変換される条件の情報とを生成する。
条件設定画面出力部16は,ユーザに指定された未確定理由を解消する条件を設定する条件設定画面を,ディスプレイ20に出力する(ステップS13)。本実施の形態では,条件設定画面に,欠陥未確定の指摘ごとに生成されたヒント情報が提示される。
ユーザは,キーボード/マウス30を用いて,条件設定画面において,未確定理由を解消する条件を入力する。
条件入力受付部17は,ユーザによる未確定理由を解消する条件の入力を受け付ける(ステップS14)。すなわち,条件入力受付部17は,欠陥未確定の指摘について,未確定理由ごとにまとめて,その理由を解消する条件の入力を受け付ける。入力された条件は,未確定理由に対応付けられて,条件情報記憶部18に記憶された条件情報に記録される。
欠陥指摘画面出力部14の指摘変換部141は,欠陥未確定の指摘を,ユーザにより入力された未確定理由を解消する条件で,欠陥であることを示す指摘または欠陥でないことを示す指摘に変換する(ステップS15)。
欠陥指摘画面出力部14は,欠陥未確定の指摘を変換した結果を含む,抽出した欠陥箇所の指摘を出力する。ここでは,欠陥指摘画面出力部14は,ソースプログラムから抽出した欠陥箇所を指摘する欠陥指摘画面をディスプレイ20に出力するときに(ステップS16),変換された欠陥未確定の指摘については変換した結果に基づいた欠陥指摘画面への提示を行う。
静的解析装置10では,ユーザが条件の設定を指示するごとに,ステップS12〜ステップS16の処理が繰り返される。ユーザが未確定理由を解消する条件を設定するごとに,欠陥未確定の指摘が,欠陥であることを示す指摘または欠陥でないことを示す指摘に変換され,欠陥指摘画面でユーザに提示される欠陥未確定の指摘の数が減る。欠陥でないことを示す指摘を欠陥指摘画面に表示しないことにすれば,その分だけ欠陥指摘画面でユーザに提示される欠陥箇所の指摘の数が減ることになる。
このように,本実施の形態の静的解析装置10では,×と判定された箇所の指摘だけではなく,欠陥未確定の指摘もユーザに対して提示することで,欠陥未確定の指摘に含まれる欠陥が指摘され,ソースプログラムの静的解析の成果が上がる。このとき,ユーザによる未確定理由ごとの条件の設定によって,欠陥未確定の指摘を未確定理由ごとにまとめて減らすことができるので,欠陥未確定の指摘を確認するユーザの負担も少ない。
以下では,本実施の形態の静的解析装置10による処理について,より具体的な例を挙げて説明する。
図4は,本実施の形態によるソースプログラムの例(1)を示す図である。
図4に示すソースプログラム110aは,C言語で記述されたソースプログラムの一例である。ここでは,図4に示すソースプログラム110aが,静的解析の対象プログラムとして,ソースプログラム記憶部11に記憶されている。以下,図4に示すソースプログラム110aの静的解析を行う例を説明する。
静的解析装置10において,欠陥情報生成部12は,図4に示すソースプログラム110a上の欠陥を抽出する。プログラムの欠陥は,一般にバグや誤りなどとも呼ばれる。
欠陥情報生成部12において,ソース解析部121は,図4に示すソースプログラム110aを解析し,ソース情報を生成する。生成されたソース情報は,ソース情報記憶部122に記憶される。
図5は,本実施の形態によるソース解析処理フローチャートである。
ソース解析部121は,静的解析の対象として指定されたソースプログラムの字句解析を実施する(ステップS100)。字句解析は,ソースプログラムの記述を単語に分解する解析である。
ソース解析部121は,ソースプログラムの字句解析結果に基づいて,ソースプログラムの構文解析を実施する(ステップS101)。構文解析は,字句解析によって単語に分解されたものの意味を解析する。
ソース解析部121は,制御フローを生成する(ステップS102)。制御フローは,ソースプログラムの各制御の構造を示す情報である。
ソース解析部121は,データフローを生成する(ステップS103)。データフローは,ソースプログラムにおける変数の更新や参照等を示す情報である。
生成された制御フローやデータフローは,ソース情報として,ソース情報記憶部122に記憶される。
図6は,本実施の形態による制御フローの例を示す図である。
図6に示す制御フローは,図4に示すソースプログラム110aを解析して得られる制御フローの例を示している。図6に示す制御フローでは,ソースプログラム110aの制御の流れが,〔1〕〜〔15〕の制御で示されている。以下の説明で,〔〕付きの数字は,図6に示す制御フローにおける各制御を示す。
図7,図8は,本実施の形態によるデータフローの例を示す図である。
図7,図8には,図6に示す制御フローを簡略化したものが示されている。図7,図8において,矢印が,ソースプログラム110aのデータフローを示している。図7に示す実線の矢印が,変数更新の流れを示しており,図8に示す破線の矢印が,定義と参照の関係を示している。
図7において,実線矢印で示された変数更新の流れは,次の通りである。
〔a〕:〔10〕の変数(x)は,〔8〕の代入結果である。
〔b〕:〔12〕の変数(x)は,〔8〕の代入結果である。
〔c〕:〔13〕の変数(index2)は,〔12〕のforループの結果である。
〔d〕:〔14〕の変数(y)は,〔10〕の代入結果である。
〔e〕:〔15〕の変数(index3)は,〔14〕のforループの結果である。
図8において,破線矢印で示された定義と参照の関係は,次の通りである。
〔f〕:〔8〕の関数(getnum)は,未定義である。
〔g〕:〔11〕の変数(array1)は,〔1〕で定義されている。
〔h〕:〔13〕の変数(array2)は,〔2〕で定義されている。
〔i〕:〔15〕の変数(array3)は,〔3〕で定義されている。
なお,図7,図8には,以下で説明する欠陥箇所の抽出に用いるデータフローの一部のみが示されている。
欠陥情報生成部12において,欠陥判定抽出部123は,ソース情報記憶部122に記憶されたソース情報に基づいて,ソースプログラム上の欠陥の可能性がある箇所の詳細な探索を行い,欠陥であるか否かを判定する。ここでは,欠陥判定抽出部123は,×と判定された箇所と△と判定された箇所とを,指摘を行う欠陥箇所として抽出する。
欠陥判定抽出部123は,様々な種類の欠陥を抽出する。例えば,ポインタ変数にNULLを設定しただけでポインタの指す領域をアクセスすると,0番地をアクセスしてしまうため,実行環境によってはエラーが発生する可能性がある。このような欠陥は,0番地参照と呼ばれる。また,変数の参照前にその変数の値が設定されていない場合に,初期化漏れと呼ばれる欠陥となる。また,取得した資源が解放されない場合に,メモリリークと呼ばれる欠陥となる。また,配列の添え字が,宣言された配列の範囲を超えている場合に,配列外参照と呼ばれる欠陥となる。0番地参照,初期化漏れ,メモリリーク,配列外参照以外にも,様々な種類の欠陥がある。
以下では,ソースプログラムから×と判定された箇所と△と判定された箇所とを欠陥箇所として抽出する例として,図6に示す制御フロー,図7,図8に示すデータフローを用いて,配列外参照に関する欠陥箇所を抽出する例を説明する。
配列外参照に関する欠陥箇所の抽出では,配列の参照箇所を起点に配列範囲と添字範囲とを求め,求められた範囲の比較により,欠陥であるか否かの判定が行われる。ソースプログラム110aにおける配列の参照箇所としては,図6の制御フローから,〔11〕の「array1」,〔13〕の「array2」,〔15〕の「array3」が挙げられる。
・〔11〕の「array1」について
〔11〕から図8に示す〔g〕の関係を追った先の〔1〕の定義で,配列範囲:0〜9が求まる。また,〔11〕において添字が定数(10)であるから,添字範囲:10が求まる。
配列範囲:0〜9よりも添字範囲:10の方が大きいため,〔11〕の「array1」については,配列外参照の欠陥である(×)と判定される。
・〔13〕の「array2」について
〔13〕から図8に示す〔h〕の関係を追った先の〔2〕の定義で,配列範囲:0〜14が求まる。
また,〔13〕の添字:index2は,図7に示す〔c〕の関係から,〔12〕のforループの条件に左右されることがわかる。〔12〕のforループの条件から,添字範囲は,0〜変数(x)となる。図7に示す〔b〕から,変数(x)が〔8〕の代入結果すなわちgetnum復帰値であることがわかるので,添字範囲は,0〜getnum復帰値となる。〔8〕から図8に示す〔f〕の関係を追った先で,関数getnumが未定義であることがわかる。関数getnumが未定義であるため,getnum復帰値も確定せず,それにより,添字範囲:0〜getnum復帰値は求まらない。
配列範囲は求まったが添字範囲が求まらないため,〔13〕の「array2」については,欠陥であるか否かが確定できない(△)と判定される。このときの未確定理由は,getnum復帰値が確定できないことである。
・〔15〕の「array3」について
〔15〕から図8に示す〔i〕の関係を追った先の〔3〕の定義で,配列範囲:0〜19が求まる。
また,〔15〕の添字:index3は,図7に示す〔e〕の関係から,〔14〕のforループの条件に左右されることがわかる。〔14〕のforループの条件から,添字範囲は,0〜変数(y)となる。図7に示す〔d〕から,変数(y)が〔10〕の代入結果すなわち変数(x)+10であることがわかるので,添字範囲は,0〜変数(x)+10となる。また,図7に示す〔a〕から,変数(x)は,〔8〕の代入結果すなわちgetnum復帰値であることがわかるので,添字範囲は,0〜getnum復帰値+10となる。〔8〕から図8に示す〔f〕の関係を追った先で,関数getnumが未定義であることがわかる。関数getnumが未定義であるため,getnum復帰値も確定せず,それにより,添字範囲:0〜getnum復帰値+10は求まらない。
配列範囲は求まったが添字範囲が求まらないため,〔15〕の「array3」については,欠陥であるか否かが確定できない(△)と判定される。このときの未確定理由は,getnum復帰値が確定できないことである。
欠陥判定抽出部123は,指摘を行う欠陥箇所として抽出された,×と判定された箇所と△と判定された箇所とについて情報を収集し,欠陥情報に記録する。
図9は,本実施の形態の欠陥判定抽出部による配列外参照欠陥箇所抽出処理フローチャートである。
欠陥判定抽出部123は,配列外参照に関する欠陥箇所の抽出において,ソース情報記憶部122に記憶されたソース情報に基づいて,ソースプログラム上の配列の参照箇所を抽出する(ステップS110)。
欠陥判定抽出部123は,抽出された配列の参照箇所を1つ選択する(ステップS111)。欠陥判定抽出部123は,抽出された配列の参照箇所について,配列範囲を求める(ステップS112)。また,欠陥判定抽出部123は,抽出された配列の参照箇所について,添字範囲を求める(ステップS113)。欠陥判定抽出部123は,求めた配列範囲および添字範囲が確定しているか否かを判定する(ステップS114)。
求めた範囲が確定していなければ(ステップ114のNO),欠陥判定抽出部123は,選択された配列の参照箇所について,欠陥であるか否かが確定できない(△)と判定する(ステップS115)。欠陥判定抽出部123は,選択された配列の参照箇所を指摘する欠陥箇所として情報を収集し,欠陥情報に記録する(ステップS116)。ここで欠陥情報に記録される情報には,未確定理由が含まれる。
求めた範囲が確定していれば(ステップS114のYES),欠陥判定抽出部123は,添字範囲が配列範囲内であるか否かを判定する(ステップS117)。
添字範囲が配列範囲内でなければ(ステップS117のNO),欠陥判定抽出部123は,選択された配列の参照箇所について,欠陥である(×)と判定する(ステップS118)。欠陥判定抽出部123は,選択された配列の参照箇所を指摘する欠陥箇所として情報を収集し,欠陥情報に記録する(ステップS116)。
添字範囲が配列範囲内であれば(ステップS117のYES),欠陥判定抽出部123は,選択された配列の参照箇所について,欠陥でない(○)と判定する(ステップS119)。この場合には,欠陥判定抽出部123は,選択された配列の参照箇所の情報を欠陥情報に記録しない。
欠陥判定抽出部123は,抽出されたすべての配列の参照箇所について処理が終了したかを判定する(ステップS120)。すべての配列の参照箇所について処理が終了していなければ(ステップS120のNO),欠陥判定抽出部123は,ステップS111の処理に戻り,次の配列の参照箇所についての処理に移る。すべての配列の参照箇所について処理が終了していれば(ステップS120のYES),欠陥判定抽出部123は,配列外参照に関する欠陥箇所の抽出処理を終了する。
ここでは,配列外参照に関する欠陥箇所の抽出の例のみを説明したが,欠陥判定抽出部123は,0番地参照,初期化漏れ,メモリリークなど,配列外参照以外の様々な欠陥についても,該当する欠陥箇所の抽出を行う。
欠陥情報生成部12により生成された,ソースプログラムから抽出された欠陥箇所についての情報が記録された欠陥情報は,欠陥情報記憶部13に記憶される。
図10は,本実施の形態による欠陥情報の例(1)を示す図である。
図10に示す欠陥情報130aは,図4に示すソースプログラム110aから抽出された配列外参照に関する欠陥箇所が記録された欠陥情報の例である。図10に示す欠陥情報130aは,ファイル,行番号,指摘番号,メッセージ,判定理由,未確定理由等の情報を持つ。欠陥情報生成部12において,欠陥判定抽出部123は,×と判定された箇所と△と判定された箇所とについて,これらの各情報を収集し,欠陥情報に記録する。
欠陥情報において,ファイルは,静的解析の対象となったソースプログラムのファイル名を示す。図10に示す欠陥情報130aにおいて,ファイルa.cは,図4に示すソースプログラム110aのファイルを示している。静的解析装置10は,複数のソースプログラムをまとめて解析することが可能である。複数のソースプログラムをまとめて解析する場合に,生成される欠陥情報は,複数のソースプログラムから抽出された欠陥の情報となる。
欠陥情報において,行番号は,ソースプログラムにおける抽出された欠陥箇所の行番号を示す。
欠陥情報において,指摘番号は,欠陥の種類と欠陥であるか否かの判定結果とに応じた番号である。指摘番号は,欠陥の種類と欠陥であるか否かの判定結果との組合せに応じてあらかじめ決められている。
例えば,図10に示す欠陥情報130aの例では,欠陥の種類が配列外参照であり,欠陥であるか否かの判定結果が欠陥である(×)とされた欠陥箇所については,指摘番号として“5011”を記録することが決められている。また,例えば,図10に示す欠陥情報130aの例では,欠陥の種類が配列外参照であり,欠陥であるか否かの判定結果が欠陥であるか否かが確定できない(△)とされた欠陥箇所については,指摘番号として“5012”を記録することが決められている。
欠陥判定抽出部123は,欠陥情報に抽出された欠陥箇所の情報を記録する際に,該欠陥箇所の欠陥の種類と,該欠陥箇所の欠陥であるか否かの判定結果から,それらの組合せに応じてあらかじめ決められた指摘番号を欠陥情報に記録する。
欠陥情報において,メッセージは,ディスプレイ20に出力される欠陥指摘画面で提示されるメッセージである。
欠陥情報において,判定理由は,欠陥であるか否かの判定において,×と判定された理由または△と判定された理由を示す情報である。例えば,図10に示す欠陥情報130aにおいて,ファイルa.cの行番号13のレコードでは,添字範囲:10が配列範囲:0〜9外であることを理由に,配列外参照について×と判定されたことが示されている。
欠陥情報において,未確定理由は,△と判定された箇所について,欠陥を確定できない理由を示す。例えば,図10に示す欠陥情報130aにおいて,ファイルa.cの行番号15のレコードでは,getnum復帰値が未確定であることを理由に,欠陥を確定できないことが示されている。
判定理由や未確定理由の情報は,欠陥判定抽出部123による欠陥箇所抽出の過程で生成される。ここで,図4に示すソースプログラム110aの行番号15における,配列array2の参照箇所を例として,判定理由と未確定理由とを生成する例を説明する。
図9に示す配列外参照欠陥箇所抽出処理のフローチャートにおいて,欠陥判定抽出部123は,ステップS114,ステップS115の処理で,配列範囲または添字範囲のいずれかが確定していない場合に,欠陥であるか否かが確定できないと判定している。配列array2の参照箇所の場合には,添字範囲が0〜getnum復帰値であり,その範囲が確定していないので,欠陥であるか否かが確定できないと判定される。
このとき,欠陥判定抽出部123は,範囲が確定していない添字範囲:0〜getnum復帰値を抽出し,判定理由を生成する。なお,本実施の形態では,欠陥判定抽出部123は,後の条件設定時にユーザが容易に比較判断できるように,判定理由に範囲が確定している配列範囲:0〜14も含める。また,欠陥判定抽出部123は,範囲が確定していない添字範囲:0〜getnum復帰値から,その範囲が確定できない要因である未確定要素としてgetnum復帰値を抽出し,getnum復帰値未確定という未確定理由を生成する。
図9に示す配列外参照欠陥箇所抽出処理のフローチャートにおいて,欠陥判定抽出部123は,ステップS116の処理で,生成された判定理由と未確定理由とを,欠陥情報に記録する。図10の欠陥情報130aに示すように,行番号15のレコードに,判定理由“配列範囲:0〜14,添字範囲:0〜getnum復帰値”,未確定理由“getnum復帰値未確定”が記録される。
なお,図10に示す欠陥情報130aにおいて,ファイルa.cの行番号13のレコードは,上述の〔11〕の「array1」について抽出された欠陥箇所の情報である。また,ファイルa.cの行番号15のレコードは,上述の〔13〕の「array2」について抽出された欠陥箇所の情報である。また,ファイルa.cの行番号18のレコードは,上述の〔15〕の「array3」について抽出された欠陥箇所の情報である。
欠陥指摘画面出力部14は,欠陥情報記憶部13に記憶された欠陥情報に基づいて欠陥指摘画面を生成し,生成された欠陥指摘画面を,ディスプレイ20に出力する。
図11は,本実施の形態による欠陥指摘画面の例(1)を示す図である。
図11に示す欠陥指摘画面145aは,欠陥指摘画面出力部14が,欠陥情報記憶部13に記憶された欠陥情報130aに基づいて生成し,ディスプレイ20に出力する欠陥指摘画面の一例である。図11に示す欠陥指摘画面145aは,指摘番号一覧,未確定理由一覧,指摘一覧の3つの一覧を有している。
欠陥指摘画面において,指摘番号一覧は,欠陥情報記憶部13に記憶された欠陥情報に記録された各欠陥箇所の指摘を,指摘番号ごとに集計した情報の一覧である。指摘番号一覧において,件数は,同じ指摘番号を持つ欠陥箇所の指摘の集計結果である。
欠陥指摘画面において,未確定理由一覧は,欠陥情報記憶部13に記憶された欠陥情報に記録された各欠陥箇所の指摘を,未確定理由ごとに集計した情報の一覧である。すなわち,未確定理由一覧は,欠陥未確定の指摘を未確定理由ごとにまとめた情報の一覧となる。未確定理由一覧において,件数は,同じ未確定理由を持つ欠陥未確定の指摘の集計結果である。条件設定は,その未確定理由に対して,未確定理由を解消する条件が設定されているか否かを示している。条件設定が“未”であれば,未確定理由を解消する条件がまだ設定されていない。条件設定が“済”であれば,未確定理由を解消する条件が設定されている。
欠陥指摘画面において,指摘一覧は,指摘番号一覧または未確定理由一覧において,選択された項目に属する欠陥箇所の指摘の一覧である。
図11に示す欠陥指摘画面145aは,指摘番号一覧において,指摘番号5011の項目が選択された状態の欠陥指摘画面の例を示している。図11に示す欠陥指摘画面145aでは,指摘番号5011に該当する1件の×と判定された箇所の指摘が提示されている。図11の欠陥指摘画面145aに示すように,指摘一覧では,欠陥箇所の指摘ごとに,欠陥情報130aに記録された各情報が提示される。
図12は,本実施の形態による欠陥指摘画面の例(2)を示す図である。
図11に示す欠陥指摘画面145aにおいて,ユーザが,未確定理由一覧のgetnum復帰値未確定の項目を選択すると,欠陥指摘画面出力部14は,図12に示す欠陥指摘画面145bをディスプレイ20に表示する。図12に示す欠陥指摘画面145bでは,指摘一覧に,未確定理由がgetnum復帰値未確定である3件の欠陥未確定の指摘が提示されている。
図12に示すように,本実施の形態では,共通の未確定要素を含む複数の箇所について,それらの複数の箇所のそれぞれを示す情報と,共通の未確定要素を示す情報とを対応付けた欠陥指摘画面145bが表示される。共通の未確定要素を含む複数の箇所の指摘をまとめて提示することにより,これらの指摘を確認するユーザの手間を軽減することができる。
図12に示す欠陥指摘画面145bの未確定理由一覧において,getnum復帰値未確定について,未確定理由を解消する条件は未設定である。図12に示す欠陥指摘画面145bの指摘一覧では,未確定理由を解消する条件の設定が未設定であるため,判定がすべて△のままである。
未確定理由を解消する条件を設定する場合には,ユーザは,未確定理由が選択された状態で,メニュー等により条件の設定を実行する。条件設定画面出力部16は,欠陥情報記憶部13に記憶された欠陥情報から,選択された未確定理由を持つ欠陥箇所の情報を抽出し,未確定理由を解消する条件を入力する条件設定画面を生成する。条件設定画面出力部16は,生成された条件設定画面をディスプレイ20に出力する。
このとき,ヒント情報生成部15が,ユーザによる未確定理由を解消する条件の入力を支援するヒント情報を生成するようにしてもよい。条件設定画面出力部16は,生成されたヒント情報を含む条件設定画面を,ディスプレイ20に出力する。
図13は,本実施の形態による条件設定画面の例(1)を示す図である。
図13に示す条件設定画面160aは,未確定理由がgetnum復帰値未確定である欠陥未確定の指摘について,条件設定画面出力部16が生成し,ディスプレイ20に出力する条件設定画面の一例である。図13に示す条件設定画面160aにおいて,ユーザは,未確定理由がgetnum復帰値未確定である欠陥未確定の指摘について,まとめて,未確定理由を解消する条件を入力することができる。図13に示す条件設定画面160aは,条件設定の欄と,指摘一覧とを有している。
条件設定画面において,条件設定の欄は,ユーザが未確定理由を解消する条件を入力し,条件設定の実行を指示する欄である。図13に示す条件設定画面160aにおける条件設定の欄では,未確定理由を解消する条件として,getnum復帰値の条件が入力可能である。
条件設定画面において,指摘一覧は,条件を設定する未確定理由を持つ欠陥未確定の指摘の一覧である。指摘一覧において,ヒントの欄には,ヒント情報生成部15により生成されたヒント情報が提示される。図13に示す条件設定画面160aにおいて,ヒントの欄には,getnum復帰値未確定の未確定理由を持つ欠陥未確定の指摘ごとに,判定が○となるgetnum復帰値の範囲と,判定が×となるgetnum復帰値の範囲とが提示されている。ユーザは,これらのヒントを参照して,入力する未確定理由を解消する条件を決定する。
ここで,図13に示す条件設定画面160aの指摘一覧における,ファイルa.cの行番号15に関する欠陥未確定の指摘を例として,ヒント情報の生成を説明する。
ヒント情報生成部15は,図10に示す欠陥情報130aにおいて,getnum復帰値未確定の未確定理由を持つファイルa.cの行番号15のレコードから,判定理由の情報を取得する。図10に示す欠陥情報130aから,判定理由の情報として,配列範囲:0〜14,添字範囲:0〜getnum復帰値が得られる。
ヒント情報生成部15は,得られた判定理由の情報から,判定が○となるgetnum復帰値の範囲を求める。配列範囲が0〜14であるので,添字範囲が配列範囲内となるgetnum復帰値の範囲は,0〜14となる。同様に,ヒント情報生成部15は,得られた判定理由の情報から,判定が×となるgetnum復帰値の範囲を求める。配列範囲が0〜14であるので,添字範囲が配列範囲外となるgetnum復帰値の範囲は,0〜14以外となる。
このように,ヒント情報生成部15は,欠陥情報の判定理由の情報から,欠陥未確定(△)の指摘を欠陥でない(○)ことを示す指摘に変換する条件や,欠陥未確定(△)の指摘を欠陥である(×)ことを示す指摘に変換する条件を生成することができる。
図14は,本実施の形態のヒント情報生成部および条件設定画面出力部による条件設定画面出力処理フローチャートである。
ユーザにより,未確定理由が指定されて,その指定された未確定理由を解消する条件の設定が指示されると,ヒント情報生成部15は,選択された未確定理由を持つ欠陥未確定の指摘を1つ選択する(ステップS130)。
ヒント情報生成部15は,欠陥情報記憶部13に記憶された欠陥情報から,選択された欠陥未確定の指摘における判定理由の情報を取得する(ステップS131)。
ヒント情報生成部15は,取得された判定理由の情報から,選択された欠陥未確定の指摘を欠陥である(×)ことを示す指摘に変換する条件の情報を生成する(ステップS132)。また,ヒント情報生成部15は,取得された判定理由の情報から,選択された欠陥未確定の指摘を欠陥でない(○)ことを示す指摘に変換する条件の情報を生成する(ステップS133)。これらの生成された情報が,ヒント情報となる。
ヒント情報生成部15は,指定された未確定理由を持つすべての欠陥未確定の指摘について,処理が終了したかを判定する(ステップS134)。
すべての欠陥未確定の指摘について処理が終了していなければ(ステップS134のNO),ヒント情報生成部15は,ステップS130に戻って,次の欠陥未確定の指摘についての処理に移る。
すべての欠陥未確定の指摘について処理が終了していれば(ステップS134のYES),条件設定画面出力部16は,生成されたヒント情報を含む条件設定画面を,ディスプレイ20に出力する(ステップS135)。
ディスプレイ20に表示された条件設定画面において,ユーザは,キーボード/マウス30を用いて,未確定理由を解消する条件を入力する。条件入力受付部17は,ユーザによる未確定理由を解消する条件の入力を受け付ける。
図15は,本実施の形態による条件設定画面の例(2)を示す図である。
図13に示す条件設定画面160aにおいて,ユーザが入力条件の欄に条件を入力し,設定ボタンを押下すると,条件設定画面出力部16は,図15に示す条件設定画面160bをディスプレイ20に表示する。図15に示す条件設定画面160bでは,入力された条件に応じて,指摘一覧に提示された各欠陥未確定の指摘における△の判定が,○の判定や×の判定に変換されている。
例えば,ファイルa.cの行番号15に関する欠陥未確定の指摘の判定理由において,getnum復帰値に入力された条件0,5〜14を設定すると,添字範囲:0〜getnum復帰値は,0〜0,5〜14となる。このとき添字範囲は,配列範囲:0〜14の範囲内であるので,図15の条件設定画面160bに示すように,ファイルa.cの行番号15に関する欠陥未確定の指摘の判定は,入力されたgetnum復帰値の条件によって,欠陥でない(○)ことを示す指摘の判定に変換される。
また,ファイルa.cの行番号18に関する欠陥未確定の指摘の判定理由において,getnum復帰値に入力された条件0,5〜14を設定すると,添字範囲:0〜getnum復帰値+10は,0〜10,15〜24となる。このとき添字範囲は,配列範囲:0〜19の範囲を超えているので,図15の条件設定画面160bに示すように,ファイルa.cの行番号18に関する欠陥未確定の指摘の判定は,入力されたgetnum復帰値の条件によって,欠陥である(×)ことを示す指摘の判定に変換される。
また,ファイルb.cの行番号30に関する欠陥未確定の指摘の判定理由において,getnum復帰値に入力された条件0,5〜14を設定すると,除数は,0〜10,15〜24となる。このとき,除数が0となってしまう可能性があるので,図15の条件設定画面160bに示すように,ファイルb.cの行番号30に関する欠陥未確定の指摘の判定は,入力されたgetnum復帰値の条件によって,欠陥である(×)ことを示す指摘の判定に変換される。
図15に示す条件設定画面160bの指摘一覧において,ファイルb.cの行番号30に関する欠陥未確定の指摘は,0除算についての欠陥箇所の指摘である。図15の条件設定画面160bに示すように,配列外参照と0除算のように異なる欠陥の欠陥未確定の指摘についても,同じ未確定理由を持つ欠陥未確定の指摘であれば,ユーザによる1回の未確定理由を解消する条件の入力で,まとめて変換することができる。個々の欠陥未確定の指摘ごとや欠陥の種類ごとに,未確定理由を解消する条件を設定する必要がないので,ユーザの負担は少ない。
条件入力受付部17により受け付けられた未確定理由を解消する条件は,未確定理由に対応付けられて,条件情報記憶部18に記憶された条件情報に記録される。
図16は,本実施の形態による条件情報の例を示す図である。
図16に示す条件情報180は,getnum復帰値未確定の未確定理由を解消する条件が記録された条件情報の例を示している。図16に示す条件情報180において,入力条件は,ユーザにより入力された未確定理由を解消する条件である。図16に示す条件情報180では,getnum復帰値未確定の未確定理由に対応付けて,その未確定理由を解消する条件としてgetnum復帰値の条件0,5〜14が記録されている。
指摘変換部141は,欠陥指摘画面出力部14が欠陥情報に基づいた欠陥指摘画面を出力する際に,条件情報で条件が対応付けられている未確定理由を持つ欠陥未確定の指摘を,その条件で変換する。欠陥指摘画面出力部14は,条件で変換された欠陥未確定の指摘については,その変換結果を用いて欠陥指摘画面を生成し,出力する。
図17は,本実施の形態による欠陥指摘画面の例(3)を示す図である。
図17に示す欠陥指摘画面145cは,図11に示す欠陥指摘画面145aに対してgetnum復帰値未確定の未確定理由を解消する条件が設定された後の,欠陥指摘画面の例である。図17の欠陥指摘画面145cに示すように,未確定理由一覧のgetnum復帰値未確定の項目において,条件設定が,未確定理由を解消する条件が設定されていることを示す“済”となっている。
図15の条件設定画面160bに示すように,getnum復帰値未確定の未確定理由を持つ指摘番号5012の2件の欠陥未確定(△)の指摘は,設定された条件によって,1件の欠陥でない(○)ことを示す指摘と,1件の欠陥である(×)ことを示す指摘とに変換される。この変換により,欠陥指摘画面でユーザに提示される指摘番号5012の欠陥未確定(△)の指摘が2件減る。図17に示すように,欠陥指摘画面145cの指摘番号一覧の指摘番号5012の項目の件数が,図11に示す欠陥指摘画面145aの20件から2件減って18件となっている。減った欠陥未確定(△)の指摘のうち1件は,指摘番号5011の欠陥である(×)ことを示す欠陥に変換されている。そのため,図17に示すように,欠陥指摘画面145cの指摘番号一覧の指摘番号5011の項目の件数が,図11に示す欠陥指摘画面145aの1件から増えて2件となっている。
また,図15の条件設定画面160bに示すように,getnum復帰値未確定の未確定理由を持つ指摘番号5042の欠陥未確定(△)の指摘は,設定された条件によって,欠陥である(×)ことを示す指摘に変換される。この変換により,欠陥指摘画面でユーザに提示される指摘番号5042の欠陥未確定(△)の指摘が1件減る。図17に示すように,欠陥指摘画面145cの指摘番号一覧の指摘番号5042の項目の件数が,図11に示す欠陥指摘画面145aの1件から減って,なくなっている。そのかわりに,図17に示す欠陥指摘画面145cの指摘番号一覧では,指摘番号5041の項目が増えている。図17に示す欠陥指摘画面145cにおいて,指摘番号5041は,指摘番号5042が0除算について△と判定された箇所の指摘番号であるのに対して,0除算について×と判定された箇所の指摘番号である。
なお,本実施の形態では,欠陥でない(○)ことを示す欠陥に変換されたものについては,欠陥指摘画面上での指摘を行わない。図17に示す欠陥指摘画面145cでは,欠陥未確定(△)の指摘が欠陥でない(○)ことを示す欠陥に変換された分だけ,図11に示す欠陥指摘画面145aに比べて欠陥箇所の指摘数が減っている。
図17に示す欠陥指摘画面145cは,指摘番号一覧において,指摘番号5011の項目が選択された状態の欠陥指摘画面の例を示している。図17に示す欠陥指摘画面145cでは,指摘番号5011に該当する2件の×と判定された箇所の指摘が提示されている。そのうちの1件の指摘は,欠陥未確定の指摘から変換された欠陥であることを示す指摘である。
図18は,本実施の形態の欠陥指摘画面出力部による欠陥指摘画面出力処理フローチャートである。
欠陥指摘画面出力部14は,欠陥情報記憶部13に記憶された欠陥情報に記録された欠陥箇所から,指摘する欠陥箇所を1つ選択する(ステップS140)。
欠陥指摘画面出力部14において,指摘変換部141は,選択された欠陥箇所の指摘が,欠陥未確定の指摘であるかを判定する(ステップS141)。
欠陥未確定の指摘であれば(ステップS141のYES),指摘変換部141は,条件情報記憶部18に記憶された条件情報で,選択された欠陥未確定の指摘の未確定理由に応じた未確定理由を解消する条件が設定されているかを判定する(ステップS142)。
未確定理由を解消する条件が設定されている場合には(ステップS142のYES),指摘変換部141は,条件情報から,選択された欠陥未確定の指摘の未確定理由に対応付けられた,未確定理由を解消する条件を取得する(ステップS143)。指摘変換部141は,取得された未確定理由を解消する条件で,選択された欠陥未確定の指摘を変換する(ステップS144)。
欠陥未確定の指摘でない場合(ステップS141のNO),または未確定理由を解消する条件が設定されていない場合には(ステップS142のNO),指摘変換部141は,選択された欠陥箇所の指摘の変換を行わない。
欠陥指摘画面出力部14は,指摘するすべての欠陥箇所について処理が終了したかを判定する(ステップS145)。
指摘するすべての欠陥箇所について処理が終了していなければ(ステップS145のNO),欠陥指摘画面出力部14は,ステップS140に戻って,次の欠陥箇所の処理に移る。
指摘するすべての欠陥箇所について処理が終了していれば(ステップS145のYES),欠陥指摘画面出力部14は,出力する欠陥箇所の指摘を集計する(ステップS146)。ここでは,例えば,図17に示す欠陥指摘画面145cの例において,指摘番号一覧の各指摘番号ごとの欠陥箇所の指摘の件数が集計される。このとき,欠陥指摘画面出力部14は,欠陥未確定の指摘が未確定理由を解消する条件で変換された結果に基づいて,集計を行う。
欠陥指摘画面出力部14は,欠陥指摘画面を生成する(ステップS147)。このとき,欠陥指摘画面出力部14は,未確定理由を解消する条件が設定された欠陥未確定の指摘については,未確定理由を解消する条件で変換された結果を含む欠陥指摘画面を生成する。
欠陥指摘画面出力部14は,生成された欠陥指摘画面を,ディスプレイ20に出力する(ステップS148)。出力される欠陥指摘画面は,未確定理由を解消する条件で欠陥未確定の指摘が変換された結果を含むものとなる。
図19は,本実施の形態の指摘変換部による指摘変換処理フローチャートである。
ここでは,図18のステップS144の処理において,配列外参照についての欠陥未確定の指摘を変換する例を説明する。
指摘変換部141は,変換する対象の欠陥未確定の指摘の判定理由において,未確定理由となる要素に対して,設定された未確定理由を解消する条件を適用する(ステップS150)。例えば,未確定理由となる要素が判定理由の添字範囲におけるgetnum復帰値である場合に,そのgetnum復帰値に,設定されたgetnum復帰値の条件を適用する。
指摘変換部141は,未確定理由を解消する条件適用後に,添字範囲が配列範囲内であるかを判定する(ステップS151)。
添字範囲が配列範囲内であれば(ステップS151のYES),指摘変換部141は,対象の欠陥未確定(△)の指摘を,欠陥でない(○)ことを示す指摘に変換する(ステップS152)。
添字範囲が配列範囲内でなければ(ステップS151のNO),指摘変換部141は,対象の欠陥未確定(△)の指摘を,欠陥である(×)ことを示す指摘に変換する(ステップS153)。
ここまで説明したように,本実施の形態の静的解析装置10は,欠陥であることを示す指摘だけではなく,欠陥未確定の指摘の出力も行う。これにより,より多くの欠陥の可能性がある箇所の指摘が可能となる。
このとき,ユーザにより入力された未確定理由を解消する条件で,欠陥未確定の指摘が欠陥であることを示す指摘や欠陥でないことを示す指摘に変換される。そのため,欠陥未確定の指摘を出力しつつも,出力される欠陥未確定の指摘の数を減らすことが可能である。
また,欠陥未確定の指摘については未確定理由ごとにまとめた情報がユーザに提示され,ユーザは,未確定理由ごとにまとめて,その未確定理由を解消する条件を入力する条件を入力できる。これにより,欠陥未確定の指摘について,1つ1つ調べて欠陥を判断するといったユーザの負担を軽減することができる。
ここまで,主に配列外参照の欠陥を指摘する例について説明したが,本実施の形態の静的解析により抽出された欠陥箇所の指摘は,当然他の様々な種類の欠陥でも実施可能である。以下では,さらに0番地参照の欠陥の例と,型の範囲を超える代入の欠陥の例とを紹介する。
まず,0番地参照に関する欠陥を指摘する例を説明する。0番地参照は,上述したように,ポインタ変数にNULLを設定しただけでポインタの指す領域をアクセスすることで,0番地をアクセスしてしまう欠陥である。
図20は,本実施の形態によるソースプログラムの例(2)を示す図である。
図20に示すソースプログラム110bは,0番地参照について欠陥であるか否かを確定できない箇所を含むソースプログラムの一例である。
ここでは,欠陥情報生成部12は,図20に示すソースプログラム110bの静的解析を行い,欠陥情報を生成する。
図21は,本実施の形態による欠陥情報の例(2)を示す図である。
図21に示す欠陥情報130bは,図20に示すソースプログラム110bから抽出された0番地参照に関する欠陥箇所が記録された欠陥情報の例である。
図21に示す欠陥情報130bにおいて,ファイルc.cは,図20に示すソースプログラム110bのファイルを示している。図21に示す欠陥情報130bにおいて,ファイルc.cの行番号2のレコードで示される欠陥箇所の情報は,0番地参照について欠陥であるか否かを確定できないとされた箇所の情報である。その未確定理由は,getpointerの復帰値が,図20に示すソースプログラム110bの解析だけでは特定できないということである。
欠陥指摘画面出力部14は,図21に示す欠陥情報130bに基づいて,欠陥指摘画面をディスプレイ20に出力する。
図22は,本実施の形態による欠陥指摘画面の例(4)を示す図である。
図22に示す欠陥指摘画面145dは,図21に示す欠陥情報130bに基づいて生成され,ディスプレイ20に出力された欠陥指摘画面の一例である。図22に示す欠陥指摘画面145dでは,未確定理由一覧においてgetpointer復帰値未確定の項目が選択され,指摘一覧に,getpointer復帰値未確定の未確定理由を持つ,0番地参照に関する欠陥未確定の指摘が提示されている。
図23は,本実施の形態による条件設定画面の例(3)を示す図である。
図23に示す条件設定画面160cは,図22に示す欠陥指摘画面145dにおいて,getpointer復帰値未確定が選択された状態で,ユーザに条件設定が指示されたときに,ディスプレイ20に出力される条件設定画面の例である。
ユーザは,図23に示す条件設定画面160cにおいて,getpointer復帰値未確定の未確定理由を解消する条件として,getpointer復帰値の条件を入力する。条件入力受付部17は,ユーザによるgetpointer復帰値の条件の入力を受け付ける。
図24は,本実施の形態による条件設定画面の例(4)を示す図である。
図24に示す条件設定画面160dは,図23に示す条件設定画面160cにおいてgetpointer復帰値の条件が入力された後の条件設定画面の例を示している。図24に示す条件設定画面160dでは,ユーザによりgetpointer復帰値の条件notNULLが入力され,getpointer復帰値未確定の未確定理由を解消する条件として設定されている。
図24の条件設定画面160dにおいて,指摘一覧では,ファイルc.cの行番号2に関する欠陥未確定の指摘の判定理由において,getpointer復帰値に入力された条件notNULLが設定される。このとき,変数pが参照するgetpointer復帰値はNULL以外となるので,図24の条件設定画面160dに示すように,ファイルc.cの行番号2に関する欠陥未確定の指摘の判定は,欠陥でない(○)ことを示す指摘の判定に変換される。
ユーザにより入力され,設定されたgetpointer復帰値の条件は,getpointer復帰値未確定の未確定理由と対応付けられて,条件情報記憶部18に記憶された条件情報に記録される。欠陥指摘画面出力部14において,指摘変換部141は,条件情報に基づいて,getpointer復帰値未確定の未確定理由を持つ欠陥未確定の指摘を,欠陥であることを示す指摘や欠陥でないことを示す指摘に変換する。欠陥指摘画面出力部14は,getpointer復帰値未確定の未確定理由を持つ欠陥未確定の指摘については,設定されたgetpointer復帰値の条件で変換された結果を用いて欠陥指摘画面を生成し,ディスプレイ20に出力する。
図25は,本実施の形態による欠陥指摘画面の例(5)を示す図である。
図25に示す欠陥指摘画面145eは,図22に示す欠陥指摘画面145dに対してgetpointer復帰値未確定の未確定理由を解消する条件が設定された後の,欠陥指摘画面の例である。図25の欠陥指摘画面145eに示すように,未確定理由一覧のgetpointer復帰値未確定の項目において,条件設定が,未確定理由を解消する条件が設定されていることを示す“済”となっている。
図24の条件設定画面160dに示すように,getpointer復帰値未確定の未確定理由を持つ指摘番号5022の欠陥未確定(△)の指摘は,設定された条件によって,欠陥でない(○)ことを示す指摘に変換される。この変換により,欠陥指摘画面でユーザに提示される指摘番号5022の欠陥未確定(△)の指摘が1件減る。図25に示す欠陥指摘画面145eでは,指摘番号一覧の指摘番号5022の項目の件数が図22に示す欠陥指摘画面145dの1件から減って0件となってしまったため,指摘番号5022の項目がなくなっている。
なお,本実施の形態の説明を簡単にするために,図22に示す欠陥指摘画面145dは0番地参照についての欠陥未確定の指摘1件のみの欠陥指摘画面としていたため,図25に示す欠陥指摘画面145eは,欠陥箇所の指摘がない欠陥指摘画面となっている。実際の欠陥指摘画面には,関連する複数のソースプログラムに対する,複数の欠陥の種類についての静的解析の結果として抽出された多数の欠陥箇所の指摘が提示されるので,欠陥箇所の指摘がない欠陥指摘画面となることはまずない。
次に,型の範囲を超える代入に関する欠陥を指摘する例を説明する。型の範囲を超える代入は,代入式において左式の型の幅よりも右式の型の幅が大きい場合に,正しい値が代入されない欠陥である。
図26は,本実施の形態によるソースプログラムの例(3)を示す図である。
図26に示すソースプログラム110cは,型の範囲を超える代入について欠陥であるか否かを確定できない箇所を含むソースプログラムの一例である。
ここでは,欠陥情報生成部12は,図26に示すソースプログラム110cの静的解析を行い,欠陥情報を生成する。
図27は,本実施の形態による欠陥情報の例(3)を示す図である。
図27に示す欠陥情報130cは,図26に示すソースプログラム110cから抽出された型の範囲を超える代入に関する欠陥箇所が記録された欠陥情報の例である。
図27に示す欠陥情報130cにおいて,ファイルd.cは,図26に示すソースプログラム110cのファイルを示している。図27に示す欠陥情報130cにおいて,ファイルd.cの行番号5のレコードで示される欠陥箇所の情報は,型の範囲を超える代入について欠陥であるか否かを確定できないとされた箇所の情報である。その未確定理由は,dataの画面入力値が,図26に示すソースプログラム110cの解析だけでは特定できないということである。
欠陥指摘画面出力部14は,図27に示す欠陥情報130cに基づいて,欠陥指摘画面をディスプレイ20に出力する。
図28は,本実施の形態による欠陥指摘画面の例(6)を示す図である。
図28に示す欠陥指摘画面145fは,図27に示す欠陥情報130cに基づいて生成され,ディスプレイ20に出力された欠陥指摘画面の一例である。図28に示す欠陥指摘画面145fでは,未確定理由一覧においてdataの画面入力値未確定の項目が選択され,指摘一覧に,dataの画面入力値未確定の未確定理由を持つ,型の範囲を超える代入に関する欠陥未確定の指摘が提示されている。
図29は,本実施の形態による条件設定画面の例(5)を示す図である。
図29に示す条件設定画面160eは,図28に示す欠陥指摘画面145fにおいて,dataの画面入力値未確定が選択された状態で,ユーザに条件設定が指示されたときに,ディスプレイ20に出力される条件設定画面の例である。
ユーザは,図29に示す条件設定画面160eにおいて,dataの画面入力値未確定の未確定理由を解消する条件として,dataの画面入力値の条件を入力する。条件入力受付部17は,ユーザによるdataの画面入力値の条件の入力を受け付ける。
図30は,本実施の形態による条件設定画面の例(6)を示す図である。
図30に示す条件設定画面160fは,図29に示す条件設定画面160eにおいてdataの画面入力値の条件が入力された後の条件設定画面の例を示している。図30に示す条件設定画面160fでは,ユーザによりdataの画面入力値の条件0〜65535が入力され,dataの画面入力値未確定の未確定理由を解消する条件として設定されている。
図30の条件設定画面160fにおいて,指摘一覧では,ファイルd.cの行番号5に関する欠陥未確定の指摘の判定理由において,dataの画面入力値に入力された条件0〜65535が設定される。このとき,代入式の右辺の範囲は左辺の範囲を超えているので,図30の条件設定画面160fに示すように,ファイルd.cの行番号5に関する欠陥未確定の指摘の判定は,欠陥である(×)ことを示す指摘の判定に変換される。
ユーザにより入力され,設定されたdataの画面入力値の条件は,dataの画面入力値未確定の未確定理由と対応付けられて,条件情報記憶部18に記憶された条件情報に記録される。欠陥指摘画面出力部14において,指摘変換部141は,条件情報に基づいて,dataの画面入力値未確定の未確定理由を持つ欠陥未確定の指摘を,欠陥であることを示す指摘や欠陥でないことを示す指摘に変換する。欠陥指摘画面出力部14は,dataの画面入力値未確定の未確定理由を持つ欠陥未確定の指摘については,設定されたdataの画面入力値の条件で変換された結果を用いて欠陥指摘画面を生成し,ディスプレイ20に出力する。
図31は,本実施の形態による欠陥指摘画面の例(7)を示す図である。
図31に示す欠陥指摘画面145gは,図28に示す欠陥指摘画面145fに対してdataの画面入力値未確定の未確定理由を解消する条件が設定された後の,欠陥指摘画面の例である。図31の欠陥指摘画面145gに示すように,未確定理由一覧のdataの画面入力値未確定の項目において,条件設定が,未確定理由を解消する条件が設定されていることを示す“済”となっている。
図30の条件設定画面160fに示すように,dataの画面入力値未確定の未確定理由を持つ指摘番号5052の欠陥未確定(△)の指摘は,設定された条件によって,欠陥である(×)ことを示す指摘に変換される。この変換により,欠陥指摘画面でユーザに提示される指摘番号5052の欠陥未確定(△)の指摘が1件減り,変換結果として指摘番号5051の欠陥である(×)ことを示す指摘が増える。図31に示す欠陥指摘画面145gでは,指摘番号一覧の指摘番号5052の項目の件数が図28に示す欠陥指摘画面145fの1件から減って0件となってしまったため,指摘番号5052の項目がなくなり,指摘番号5051の項目が増えている。また,図31に欠陥指摘画面145gの指摘一覧には,欠陥未確定(△)の指摘から変換された,欠陥である(×)ことを示す指摘が提示されている。
なお,型の範囲を超える代入の例でも,0番地参照の例と同様に,本実施の形態の説明を簡単にするために,型の範囲を超える代入の欠陥のみの指摘が提示された欠陥指摘画面の例を挙げている。
以上,本実施の形態について説明したが,本発明はその主旨の範囲において種々の変形が可能であることは当然である。
例えば,本実施の形態では,C言語で記述されたソースプログラムの静的解析の例が示されているが,静的解析の対象となるソースプログラムを記述するプログラミング言語が,JavaやFortranなどの他のプログラミング言語であってもよい。なお,Javaは,米国サンマイクロシステムズ社の商標である。