(58)【調査した分野】(Int.Cl.,DB名)
前記1または2以上の警告のグループは、前記アプリケーションコードのシングルコード認証のために形成される請求項1に記載のアプリケーションコードの静的解析中に発生した複数の警告をグループ化する方法。
前記1または2以上の警告のグループは、前記アプリケーションコードのシングルコード認証のために形成される請求項5に記載のアプリケーションコードの静的解析中に発生した複数の警告をグループ化するシステム。
特定のグループにおける前記複数の類似する警告の前記代表的な警告のレビューは、前記特定のグループにおける前記代表的な警告以外の前記複数の類似する警告のレビューを保証し、前記各警告の前記レビューは前記各警告に対応する前記修正ポイントにおける前記変数の値を参照することにより実行される請求項9に記載のアプリケーションコードの静的解析中に発生した複数の警告をグループ化するシステム。
【発明を実施するための形態】
【0015】
アプリケーションコードの静的解析中に発生した警告をグループ化するシステムおよび方法を説明する。まず、警告はアプリケーションコードの解析で発生する。発生した警告は、警告の類似性に基づいてさらに分類またはグループ化される。類似性に基づいて警告をグループ化するために、種々のコンストレイント(制限)(constraints)が満たされる必要がある。そのコンストレイントは、警告の構造的かつ意味的に類似する
関心のある式(EOIs)を含んでいる。警告は、フォワードフロー(forward flow)またはバックワードフロー(backward flow)において互いに到達可能である。警告のEOIsからの変数は、警告のプログラムポイント間で修正されない。EOIの値のための少なくとも一つの警告は、他の警告のEOIsからの値を含む。
【0016】
また、代表的な警告は、代表的な警告のレビューが各グループにおける代表的な警告以外の警告のレビューを保証するように、警告の各グループから計算される。代表的な警告が安全であると分かった場合、代表的な警告以外の警告もまた安全であり、レビューの必要はない。しかしながら、代表的な警告が安全でないと分かった場合、各グループにおける代表的な警告以外の警告は、個別にレビューされなければならない。
【0017】
別の実施形態において、警告の
関心のある式(EOIs)が同じ順番で現れる同じオペレーターを有し、EOIsにおけるポジションによって関連付けられるEOI変数が同じ修正ポイントからの値を得るのなら、発生した警告はグループ化される。形成されたグループにおける警告の一つは、EOI変数の修正ポイントによって提供された値を検討し、レビューされる。そして、レビューされた警告が安全であれば、レビューされた警告以外の、同じグループからの警告もまた安全であり、レビューの必要はない。他の場合において、レビューされた警告が安全でないとき、グループにおける各警告は個別にレビューされる必要がある。
【0018】
静的解析中に発生した警告をグループ化するシステムおよび方法の態様は、いくつもの異なるコンピューターシステム、環境および/または構成で実施されてもよいが、実施形態は以下の具体的なシステムで説明される。
【0019】
図1を参照して、
図1は、本発明の実施形態に係る、アプリケーションコードの静的解析中に発生した1または2以上の警告をグループ化するシステム102のネットワーク実施例100が示す。一つの実施形態において、システム102は、静的解析中に発生した警告をグループ化する。一つの実施形態において、システム102は、警告を発生するために、アプリケーションコードを解析する。発生した警告は、警告の類似性に基づいて特定される。類似性は、1または2以上のコンストレイントに基づいている。特定された警告は、類似する警告および同様の警告と称されてもよい。類似性に基づく警告は取り替え可能である。また、警告の1または2以上のグループが形成される。警告の1または2以上のグループのそれぞれは、類似する警告を含んでいる。また、システム102は、警告の各グループから代表的な警告を計算する。その結果、各グループにおける代表的な警告以外の警告は、代表的な警告のレビュー判断(review judgment)に従う。そして、代表的な警告のレビューは、各グループにおける代表的な警告以外の警告のレビューを保証する。
【0020】
システム102の別の実施形態において、特定された類似する警告の
関心のある式(EOIs)が同じ順番で現れる同じオペレーターを有し、類似する警告のEOIからのEOI変数が同じ修正ポイントからの値を得るように、類似する警告は発生した警告間で特定される。EOI変数は、EOIにおける位置によって関連付けられている。また、システム102は、警告の1または2以上のグループを形成し、警告の1または2以上のグループのそれぞれは、類似する警告を含んでいる。形成された各グループにおける類似する警告のうちの一つの警告のレビューは、形成された各グループにおけるレビューされた警告以外の類似する警告のレビューを保証する。その一つの警告は、修正ポイントによってEOI変数に提供される値を考慮し、レビューされる。警告がレビューで安全であると分かれば、その警告以外の類似する警告も安全であり、個別にレビューされる必要はない。その警告がレビューで安全でない場合、グループにおける全ての類似する警告は個別にレビューされなければならない。
【0021】
本発明は、システム102がサーバー上で実行されることを考慮して説明されているが、システム102は、ラップトップコンピューター、デスクトップコンピューター、ノート型コンピューター、ワークステーション、メインフレームコンピューター、サーバー、ネットワークサーバーなどの種々のコンピューターシステムで実行される。システム102は、1または2以上のユーザーデバイス104−1、104−2・・・104−N(以下、これらをまとめてユーザー104またはユーザーデバイス104にあるアプリケーションという)を通して多くのユーザーによってアクセスされる。ユーザーデバイス104は、特に限定されないが、ポータブルコンピューター、パーソナルデジタルアシスタント、携帯用デバイス、ワークステーションなどが挙げられる。ユーザーデバイス104は、ネットワーク106を介してシステム102に通信可能に連結されている。
【0022】
一つの実施形態において、ネットワーク106は、ワイヤレスネットワーク、有線ネットワークまたはそれらの組合せであってもよい。ネットワーク106は、イントラネット、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、インターネット等の異なる種類のネットワークの一つとして実行される。ネットワーク106は、専用ネットワークまたは共有ネットワークのいずれかであってもよい。共有ネットワークは、種々のプロトコルを使用する異なるタイプのネットワークの接続(association)を表す。例えば、種々のプロトコルは、互いに通信する、ハイパーテキスト転送プロトコル(HTTP)、伝送制御プロトコル/インターネットプロトコル(TCP/IP)、ワイヤレスアプリケーションプロトコル(WAP)などである。また、ネットワーク106は、ルーター、ブリッジ、サーバー、コンピューターデバイス、ストレージデバイス等を含む種々のネットワークデバイスを含んでいる。
【0023】
図2を参照すると、
図2は、本発明の実施形態に係るシステム102を示す。一つの実施形態において、システム102は、少なくとも一つのプロセッサー202と、入力/出力(I/O)インターフェース204と、メモリー206とを含んでいる。少なくとも一つのプロセッサー202は、1または2以上の、マイクロプロセッサー、マイクロコンピューター、マイクロコントローラー、デジタルシグナルプロセッサー、中央処理装置、ステートマシーン(state machines)、ロジック回路および/または操作上の命令に基づく信号をコントロールするいずれのデバイスなどとして実行される。他の性能として、少なくとも一つプロセッサー202は、メモリー206に保存されたコンピューター読み取り可能な命令をフェッチして実行するように構成されている。
【0024】
I/Oインターフェース204は、種々のソフトウェアおよびハードウェアインターフェース(例えば、ウェブインターフェース、グラフィカルユーザーインターフェースなど)を含んでいる。I/Oインターフェース204は、クライアントデバイス104を介して、またはクライアントデバイス104と直接に、ユーザーとシステム102とを交信させる。また、I/Oインターフェース204は、システム102が他のコンピューターデバイス(例えば、図示されていない、ウェブサーバーおよび外部データサーバー)と通信することを可能にしている。I/Oインターフェース204は、有線ネットワーク(例えば、LAN、ケーブルなど)およびワイヤレスネットワーク(例えば、WLAN、セル方式、通信衛星など)を含む多種多様のネットワークおよびプロトコルタイプ内で多重通信を促進することができる。I/Oインターフェース204は、多くのデバイスを、互いに、または別のサーバーに接続するための1または2以上のポートを含んでいてもよい。
【0025】
メモリー206は、技術分野で知られている、いずれのコンピューター読み取り可能媒体も含む。例えば、それは、スタティックランダムアクセスメモリ(SRAM)およびダイナミックランダムアクセスメモリ(DRAM)のような揮発性メモリ、および/または、読み取り専用メモリ(ROM)、消去可能ROM、フラッシュメモリ、ハードディスク、光学ディスクおよび磁気テープのような非揮発性メモリなどを含む。
【0026】
モジュール208は、ルーティン、プログラム、オブジェクト、コンポーネント、データ構造等を含む。それは、特定のタスクを実行するか、特定の抽象データタイプを実装する。一つの実施形態において、モジュール208は、解析モジュール212と、特定モジュール214と、グループ化モジュール216と、計算モジュール218と、その他のモジュール220とを含んでいる。その他のモジュール220は、システム102のアプリケーションおよび機能を補うプログラムまたはコードされた命令を含んでいる。
【0027】
データ210は、とりわけ、1または2以上のモジュールによって所有され、受信され、発生されたデータを保存するレポジトリ(repository)として作用する。データ210は、また、システムデータベース222と、他のデータ224とを含んでいる。他のデータ224は、他のモジュール220における1または2以上のモジュールの実行の結果として発生されたデータを含んでいる。
【0028】
一つの実施形態において、まず、ユーザーは、I/Oインターフェース204を介してシステム102にアクセスするクライアントデバイス104を使用する。ユーザーは、システム102を使用するために、I/Oインターフェース204を使用するクライアントデバイスを登録する。システム102のワークは、
図3と
図4で詳細に説明される。システム102は、アプリケーションコードの静的解析中に発生した警告のグループ化を提供するように構成されている。アプリケーションコードの静的解析中に発生した警告のグループ化を提供するために、システム102は、まず、警告を発生するためのアプリケーションコードを解析する。具体的に、本実施形態において、アプリケーションコードは、モジュール212を解析することによって解析される。
【0029】
また、特定モジュール214は、複数の警告から類似する警告を特定するように構成されている。類似する警告は、構造的かつ意味的に類似する
関心のある式(EOI)を有する。また、類似する警告は、互いに連絡可能である。類似する警告のEOIからの変数は、類似する警告のプログラムポイント間で修正されない。そして、類似する警告のうちの少なくとも一つの警告のEOIによって評価される値は、その一つの警告以外の類似する警告のEOIからの値を含んでいる。
【0030】
構造的に類似するEOIsは、異なる値に評価(判断)するかもしれないので、類似する警告は、構造的に似ているだけでなく、意味的にも似ているべきである。例えば、“v+a”(aはローカル変数)と“v+a”(aはグローバル変数)のような2つのEOIを検討する。上記EOIは、類似するとして扱われない。なぜなら、それらは、異なる値に評価し、したがって、上記EOIで発生した警告は類似するとして考えられることができないからである。また、さらなる例として、それらのEOIs“v+l”と“l+v”で発生した警告は、類似するとして扱われることができない。なぜなら、これらのEOIは、それらが同じ値に評価したとしても、異なる構造を有するからである。類似する警告を特定するために、警告は、意味的に類似するだけでなく、構造的にも類似するべきである。
【0031】
具体例として、以下に示されるプログラムを検討する。
#define SIZE 10
int rColors[SIZE], gColors[SIZE], bColors[SIZE];
1. void func(int r, int g, int b)
2. {
3. // ‘n’と’factor’の値は知られていない。
4. ...
5. factor = getDivFactor();
6. if((r/factor > rval1) && ...)
7. rColors[n] = r;
8.
9. if((g/factor > gval1) && ...)
10. gColors[n] = g;
11.
12. if((b/factor > bval1) && ...)
13. bColors[n] = b;
14.
15. gradient = getGradient(
rColors[n],gColors[n],bColors[n]);
16. ...
17. }
【0032】
上述されたプログラムにおいて、3ゼロ除算(Zero Division)(ZD)と6配列インデックス範囲外(Array Index Out of Bound)(AIOB)警告が存在する。なぜなら、分母‘factor’と配列インデックス‘n’の値は、それぞれ、静的に未知であるからである。表記ZDnと表記AIOBnは、それぞれ、ライン‘n’でZDとAIOBポイントを示すために使用される。2以上のそのようなポイントがシングルラインに存在する場合、プログラムにおけるポイントは、左から右に見られるポイントの位置と区別され、接頭上付き文字として示される。例えば、ライン15からの第1および第2のAIOBポイントは、それぞれ、
1AIOB
15および
2AIOB
15として示される。上記プログラムにおいて、全てのZD警告は、それ自身で類似する警告である。なぜなら、ZD警告は、同じ分母式‘factor’を有し、分母式‘factor’の値は、ZD
6ポイントとZD
12ポイントとの間で修正されない。上記例において、分母式だけがEOIsとして考えられる。なぜなら、もしそれが、値‘0’の評価につながるのなら、分母式は、チェックすることによって与えられるZD警告ポイントをレビューするために十分であるからである。
【0033】
また、グループ化モジュール216は、警告の1または2以上のグループを形成するように構成されている。そのような警告の1または2以上のグループのそれぞれは、類似する警告を含む。上述されたプログラムにおいて、ZD警告は、類似する警告であるので、ともにグループ化されている。システム102は、シングルコード認証のために、静的解析によって発生した類似する警告のグループ化を実行する。
【0034】
また、計算モジュール218は、類似する警告のグループのそれぞれから代表的な警告を計算するように構成されている。その結果、類似する警告のグループにおける代表的な警告以外の警告は、代表的な警告のレビュー判断に従う。代表的な警告のレビューの間、代表的な警告が安全であると分かることは、グループにおける代表的な警告以外の類似する警告のレビューを保証する。他の場合において、代表的な警告が安全でないと分かれば、グループにおける類似する警告の全ては個別にレビューされる必要がある。計算モジュール218は、情報計算のフォワードフローにおいて各グループから代表的な警告を計算するため、マストリーチングエクスプレッションズ(Must Reaching Expressions)(MREs)の計算と、情報計算のバックワードフローにおいて各グループから代表的な警告を計算するため、マストライブエクスプレッションズ(Must Live Expressions)(MLEs)の計算とをさらに実行する。代表的な警告は、リーダー警告(Leader Warnings)(LW)として示され、各グループにおける代表的な警告以外の警告は、フォロワー警告(Follower Warning)(FW)として示される。上述されたプログラムコードにおいて、ZD警告のグループから、ZD
6は、LWとして安全に選択されてもよい。なぜなら、他の警告は、LWのレビュー判断に従うように観測されるからである。
【0035】
形成された類似する警告のグループからの警告は、そのEOIが同じグループから、すなわち、もし下記が存在するのなら任意の警告のための他の警告ポイントに正確に到達し(Must Reaching Expression-MRE)、または、正確に生存する(Must Live Expression-MLE)場合に限り、LWとして選択される。
−警告Wに類似するとして特定された他の警告から1また2以上のMRE/MLEが存在する。WはFWでなければならない。
−警告Wに類似するとして特定された他の警告からMRE/MLEが存在しない。正確にWはFWでなければならない。
【0036】
また、上述したプログラムを参照すると、ZD
6警告は、LWとして選択されてもよい。なぜなら、ZD
6の分母式(dominator expression)は後のZDポイントに正確に到達するからである。すなわち、ZD
9とZD
12に対する全てのパスは、ZD
6を含み、分母変数‘factor’はその間で修正されない。したがって、ZD
9とZD
12(FWs)の分母によって求められる値は、ZD
6の分母によって求められる値に含まれている。この場合において、ZD
6警告はレビューで安全であると分かり、FWsは安全であると保証される。ZD
6警告が安全でなければ、FWsが安全でない。後者の場合において、FWsは、必ずしも安全でないと観測される必要はない。なぜなら、FWsが安全でないことを防止するいくつかの付加チェックが存在するからである。
【0037】
一般に、欠陥/安全でないとして発生した警告を見つける可能性はとても低い。LWとFWsとの間の与えられたレビュー判断関係と、欠陥として発生した警告を見つける可能性に関し、レビューのためのリーダー警告(LWs)のみが存在することが観測される。したがって、類似する警告の提案されたグループ化は、レビュー中、ユーザーがFWsに注目することを避け、レビューの低減につながる。
【0038】
また、上述したプログラムを参照すると、プログラムにおける6 AIOBポイントは、AIOB警告である。なぜなら、それらのインデックス値は静的に知られることができないからである。AIOB警告は、類似する警告としてまた観測されてもよい。なぜなら、AIOB警告のインデックスは、同じであり、ライン7と16との間で修正されないからである。AIOB警告のうちのいずれか2つのAIOB警告は、2つのAIOB警告の関連する配列インデックス(array index)および配列サイズが(array size)同じである場合に限り、類似する警告である。配列インデックスのみがAIOB警告の認証との関連でEOIとして考えられ、そのインデックスチェックのための範囲(bound)(配列サイズ)を得ることが要求されているので、インデックスされた配列がEOIから除外される。配列サイズにアクセスされた配列から焦点をシフトする理由は、類似する警告として、警告の最大可能数を特定することである。配列がEOIの一部として扱われると、警告
1AIOB
15および
2AION
15は、類似する警告として特定されないかもしれない。
【0039】
類似する警告として特定されたAIOB警告は、シングル警告としてそれをレビューするためにグループ化される。グループ化されたAIOB警告に関し、AIOB
7は、LWとして計算されない。なぜなら、AIOB
7のインデックスは、他のAIOBポイントに正確に到達しないし、レビュー判断関係の要求された保証はこの選択と与えられないからである。同様に、AIOB
9およびAION
12警告は、LWとして考慮されない。しかしながら、
1AIOB
15または同じラインからの他の警告は、グループのLWとしてとられる。なぜなら、この選択は、LWとFWsとの間の要求されたレビュー判断関係を保証するからである。
1AIOB
15のインデックスによって評価された値は、他のAIOBのインデックスによって評価された値を含む。これは、
1AIOB
15のインデックス(n)が前のAIOBポイントで正確に生存しているということを観測することによって保証される。すなわち、計算されたFWsを通るパスが
1AIOB
15(LW)を通り、インデックス‘n’が中間で修正されないということを観察することによって保証される。警告
1AIOB
15のレビューは、形成されたグループにおける他の警告のレビューを保証する。
【0040】
上述されたプログラムは、単一変数とEOIs(ZD用のfactor, AIOB用のn)を考慮するだけである。しかし、類似する警告として特定された警告は、仮にそれらのEOIsが(var1+var2-var3)または(arr1[0]+arr[i])のような複素式(complex expression)であるとしても、グループ化される。アプリケーションレベルでの類似する警告として特定される警告のグループ化は、発生した警告の数を減らし、レビュープロセス中の多重認証サイクルを回避し、レビューを低減する。
【0041】
計算モジュール218は、リーダー警告の計算のためのMREsとMLEsを計算する。マストリーチングエクスプレッション(MRE)は、以下のように規定される。Pに来る全てのパスがP
Eを通り、P
EとPとの間のセグメントパスが‘e’のいくつかのr−値のl−値アカーレンス(occurrence)を含まない場合、プログラムポイントP
Eからの式‘e’は、プログラムポイントPでのMREである。すなわち、P
EはPに先行し、P
Eで‘e’によって得られた値は、それがPで得られるのなら、‘e’の値を含む。上述されたプログラムからのMREsのいくつかの例は、以下の通りである。
−ZD
6の分母は、ZD
9への各パスとしてZD
9とZD
12でMREである。ZD
12は、ZD
6を通り、変数‘factor’は中間で修正されない。
−ZD
9の分母は、ZD
12でMREである。しかし、ZD
9がZD
6に先行しないので、ZD
6でMREであることができない。
−AIOB
7(またはAIOB
10、AIOB
13)のインデックスnは、他のいずれのAIOBポイントでMREでない。なぜなら、それらを含むことなくパスが存在するからである。
【0042】
また、MREsは、データフロー解析(Data Flow Analysis)(DFA)を使用して効率的に計算される。DFAは、アプリケーションにける種々のプログラムポイントで値または値のセットとしてフロー情報を収集する。ファンクションサマリーに基づくアプローチは、コンテクストおよびフローセンシティブ態様(context and flow sensitive manner)で、要求されたMREsを計算するために解決するDFAに使用される。MREs計算のための以下に示されたデータフロー形式化は、フォワードフロー解析を表し、同時にシングル認証機能性をターゲットとする。例えば、ZD警告とAIOB警告をグループ化するための要求されたMREsは、別々に計算されなければならない。利用できる式とは違って、考慮されたEOIsは、それらがIR表現(入力ソースプログラム用に作られた抽象構文木)であるように、実際の式である。以下のデータフロー方程式は、CFG(制御フローグラフ)におけるノード‘n’のために示される。
【0044】
‘Out
n’のための方程式は、キルコンポーネント(kill component)がGen
n+In
nから計算されるので、標準DFA方程式から誘導される。この変化は、MREsが”val=arr[val]“のような同じプログラムポイントで発生され、消される(killed)ように、組み込まれる(具現化される)。インデックス‘val’は、このプログラムポイント後、MREとして流出することを期待されていない。
【0045】
より効率的にMREsを計算するために、以下のポイントが考慮される。
−警告のみの解析と共にプログラムポイントを考慮する。安全または安全でないとして特定されたPOIsがMRE計算から無視される。
−MREs計算からの関数呼び出しおよび揮発性関数を含むEOIsを無視する。なぜなら、計算されたLWとFWsのレビュー判断で要求された保証がそれらの存在とともに与えられることができないからである。
−修正された変数の情報は、分離“May-Kill/Modified”データフロー問題として計算されるべきである。
−配列が計算する消された情報に含まれるとき、保守的なアプローチが採られるべきである。(arr[0]+b)のような関数は、‘i’の値が未知であるとき、“arr[i]=n”プログラムポイント後に到達されるべきでない。
【0046】
マストライブエクスプレッション(Must Live Expression)(MLE)は、以下のように規定される。Pを通る全てのパスがP
Eを通り、PとP
Eとの間のセグメントパスが‘e’のいくつかのr−値のl−値アカーレンスを含まない場合、プログラムポイントP
Eからの式‘e‘は、プログラムポイントPでMLEである。すなわち、PがP
Eに先行し、P
Eで‘e‘によって得られた値は、それがPで得られるのなら、‘e‘の値を含む。上述されたプログラムからのMLEsのいくつかの例は、以下の通りである。
−
1AIOB
15のnのインデックスは、AIOB
7からの全てのパスがはまた
1AIOB
15を通り、それらのインデックスnが中間で修正されないように、AIOB
7でMLEである。同様に、ライン15での警告からのインデックスは、AIOB
7、AIOB
10、AIOB
13でMLEsである。
−AIOB
13のインデックスは、AIOB
7とAIOB
10警告でMLEである。なぜなら、AIOB
7とAIOB
10を通り、AIOB
13を通らないパスが存在するからである。
【0047】
また、MLEsは、データフロー解析(DFA)を使用して効率的に計算される。MLEs計算のための形式化は、In
nの方程式における変化のみを有し、MREs計算のための形式化と同様である。この変化は、情報計算のバックワードフローを考慮するために組み込まれ(具現化される)、以下に示される。
効率的なMREs計算のために与えられる考慮が、MLEs計算のために同様にあってもよい。
【0048】
計算モジュール218は、不要なMRE/MLEの特定を避けるために、最適化をさらに実行する。説明されたDFAは、MRE/MLEが各警告ポイントで発生することを示す。DFAを解いている間、警告ポイントが他の警告ポイントから流れ込むMRE/MLEを観測すると、現在の警告用のMRE/MLEは発生する必要がない。そのようなMRE/MLEの発生は、効率的な目的のために回避される。なぜなら、各警告は明確にFWであり、この計算はいずれの値も加えない。これは、DFAで計算されるデータを低減するだけでなく、LWsとFWsの計算が以下に説明されるように速くなる。
【0049】
任意の警告Wで、他のどの類似する警告ポイントからもMRE/MLEが存在しない場合、WはLWである。最初に、発生した各警告は、FWなしにそれ自身のグループを有するLWとしてレビューされる。警告のグループ化から最大の利益を成し遂げるために、LWsの数は最小であるべきである。LWsの数は、これらの初期のLWsを他のLWと関連付けることによって、すなわち、それらをFWsに変換することによって、低減される。このタイプのグループ化の後、全ての警告は、シングルグループに属していなければならず、同時にLWとFWであることができない。また、正確に形成された類似する警告のグループは、ゼロを含むいくつものFWsと1つのLWとを正確に含んでいる。
【0050】
以下、類似する警告のグループ化の後計算されるLWsのセットを示すために、表記LWoを使用する。一つの実施形態において、計算モジュール218は、要求されたLWoを計算するためにグラフに基づくアプローチを実行する。最初に、ツリーの数が発生された警告の数と等しくなるように、(警告を示している)1つのノードのみを有するツリーとして、発生した警告に示す。警告ポイントWで、MREs/MLEsは計算され、警告W
Lから発生された各MRE/MLEにとって、有向辺は、Wに相当する頂点(vertex)に関連する頂点W
Lから加えられる。そのような辺(edge)は、以下の二つの点が当てはまる場合にのみ加えられる必要がある。
−WとW
Lの警告のEOIs(および配列サイズのような他の要求される情報)が類似する場合。
−WLに相当する頂点に入ってくる辺がない場合。
【0051】
第1のコンストレイントとは、類似する警告のみとして特定された警告を関連付けるために要求される。そして、両方の警告(WとW
L)がFWsであるように保証されるように、第2のコンストレイントは、不必要(冗長)な辺の付加を避けるよう要求される。W
Lが入ってくる辺を有するとき、それはLWであることができない。MREとMLEが生じるように、一度、辺の付加が完了すると、結果として得られるフォレストはLWsとそれらに関連付けられたFWsを示す。ここで、フォレストにおける各ツリーは、類似するように特定された警告のグループである。入ってくる辺なしに頂点は、グループのLWであり、LWから走査されることができる全ての頂点は、グループのFWsである。したがって、形成されたグループの数は、フォレストにおけるツリーの数である。最初に、効率的な目的のために、LWs(LWo)は、MREsを使用して計算され、それから、MLEsはこれらのLWsのみのために計算される。計算されたMLEsを後で使用して、MREsにより手に入れられた前のLWoは、より小さいLWsを得るためにさらに改良される。
【0052】
具体的実施例として、上述したプログラムを検討する。フォレストにおける頂点は、警告を示すために使用されている同じ表記を有する任意の警告に相当して示されている。まず、これらすべての頂点は、入ってくる辺(incoming edge)または出ていく辺(outgoing edge)を有しない。有向辺は、ZDのためのMREsの結果を使用して説明されるように加えられ、AIOBと手に入れられたフォレストは
図3に示される。以下は、
図3に示されるフォレストから得られた観測である。
・ZD
6のインデックスは、ZD
9とZD
12に対するMREであり、したがって、ZD
6からZD
9とZD
12にそれぞれの辺がある。
・ZD
9のインデックスがZD
12に対するMREに対するインデックスであるとしても、それぞれの辺は、ZD
9のための頂点が(エッジ付加の第2のコンストレイントにより)入ってくる辺を有しているので、加えられない。
【0053】
図3におけるフォレストは、シングルLWのようなZD
6と、FWsのようなZD
9とZD
12を有するZDに期待されるようなLW
Oを表す。AIOBのためのLW
Oは、1つの警告の代わりにレビュー用のLWsとして4つの警告を表しているので、期待値ではない。これは、MREsが期待されたLWoを計算するために常に十分ではなく、それはMLEsを使用する改良を要求するからである。MLEsは、MREsを使用して得られるLWsのためにのみ計算され、エッジはそれらの計算結果により付け足される。MLEsを使用して得られた、改良されたLWoは、
図4に示される。
図4は、要求されるようなLWとしてのシングルAIOB警告を示している。
【0054】
本発明の別の実施形態において、システム102は、修正ポイントに基づくグループ化(MPG)を使用する静的解析中に発生した複数の警告のグループ化を提供する。まず、解析モジュール212は、複数の警告を発生するためにアプリケーションコードを解析するように構成されている。また、特定モジュール214は、複数の警告から類似する警告を特定するように構成されている。その結果、類似する警告の
関心のある式(EOIs)は同じ順番で現れる同じオペレーターを有し、EOIsにおける位置によって関連付
けられるEOI変数がアプリケーションコードにおける同じ修正ポイントから値を得る。グループ化モジュール216は、複数の警告の1または2以上のグループを形成するように構成されている。その各グループは、類似する警告を含んでいる。レビューされた警告がEOI変数の修正ポイントによって提供される値を考慮することで安全であることがわかるとき、形成されたグループにおける類似する警告のうちの一つの警告のレビューは、レビューされた警告以外のグループにおける類似する警告のレビューを保証する。また、グループ化モジュール214は、各MPGグループに対して、修正ポイントを関連付け、報告する。関連付けられた修正ポイントは、グループにおける類似する警告からのEOI変数の修正ポイントである。
【0055】
グループ化モジュール216は、類似する警告の1または2以上のグループを形成するために到達定義(Reaching Definitions)の計算をさらに実行する。グループからの警告が関連付けられた修正ポイントからEOI変数値を考慮するレビューで安全であると分かると、同じグループから他の警告をレビューする必要がない。他の場合において、レビュー後にグループから選択された警告が安全であると分からないと、グループから各警告を個別にレビューする必要がある。
【0056】
具体的実施例として、以下に示されるプログラムを検討する。
int arr[10];
void func(const int* baseAddr, const int* currPtr)
{ // valは、0から9の値の割り当てを得る。
int val = currPtr - baseAddr;
switch (switchVar)
{
case 1: func1(val); break;
case 2: func2(val); break;
case 3: func3(val); break;
default: break;
}
}
void func1(int p1)
{
if(...) arr[p1] = ...;
else if (...) arr[p1] = ...;
}
void func2(int p2)
{
if(...) arr[p2] = ...;
else if (...) arr[p2] = ...;
}
void func3(int p3)
{
if(...) arr[p3] = ...;
else if (...) arr[p3] = ...;
}
【0057】
上記プログラムは、一例を示している。Val変数の値(0から9)は、ポインタの算術演算を使用して計算され、配列インデックス使用のための多数の関数(multiple functions)に送られる。最も静的な解析ツールは、警告のようなこれらのAIOBポイントを報告する。なぜなら、varのための値は静的に決定されない。各警告のレビューは、それぞれのインデックス変数(p1、p2、p3)によってとられる値を見つけることを要求し、したがって、警告ポイントからval(ポインタの算術演算のもの)の定義ポイントにマニュアルで走査することを要求する。ユーザーは、警告が発見された値に基づいて安全であるか安全でないか決定する。こうして、すべての警告をまとめて(collectively)レビューすることは相当な努力を必要とする。
【0058】
そのような状況において、特定モジュール214は、警告を特定する。警告のEOI変数は同じ修正(または定義)ポイントから値を得る。グループ化モジュール216は、レビューの努力が最小化されるように、特定された警告をグループ化する。そのような修正ポイントともに、レビューの観点(review perspective)からの他のパラメーターは、シングルグループにおいてそれらを扱うためにマッチすべきである。EOIsが多数の変数を含む複素式であるとき、EOIsは、オペレーターの同じ順番を観察しなければならず、EOIsにおけるそれらの位置によって関連付けられた変数は、同じ修正ポイントを見つけなければならない。
【0059】
例えば、
・配列サイズは、MPGを使用するAIOB警告をグループ化するためにマッチすべきである。
・v+l、v、v−lのようなEOIsを有する警告は、EOIsが構造の点で異なるので、MPGを使用してグループ化されない。
・EOIsのようなa+b+c & a+b+cを有する警告は、各変数(a、b、c)が同じ修正ポイントから値を得る場合に限り、MPGを使用してグループ化される。
【0060】
V
Wは、MPGグループ化警告ポイントでEOIによって得られる変数のセットである。レビュー中、ユーザーは、たいてい、修正ポイントで割り当てられているEOI変数の値を参照し、レビューの下、EOIを評価する。修正ポイントから得られた変数の値を考慮して得ると、V
Mは、同じEOIのための値のセットである。今、直観的に、MPGグループ化警告にとって、V
W≦V
Mは明らかである。ユーザーがMPGグループ化警告がV
Mを考慮して安全であると観測すると、グループ化された警告の全ての安全性が明確に保証される。この状況において、他のMPGグループ化警告の個別のレビューは、不必要であり、避けられる。他の状況において、警告がV
Mを使用して安全として特定されなければ、全てのMPGグループ化警告はユーザーによって個別にレビューされなければならない。
【0061】
上記プログラムにおけるAIOB警告は、MPGのようにグループ化される。なぜなら、それらの配列サイズは等しく、インデックスは同じ修正ポイントから値を得るからである。レビュー中、ユーザーは、valの報告された修正ポイントを直接見るインデックス変数用の要求された値を見つける。ここで、ユーザーは、変数valの値が配列範囲[0..9]であり、したがって、インデックスは範囲内にある。これにより、警告のMPGグループから選択された警告は、安全であるとわかり、他の警告のレビューは省略される。
【0062】
本発明の他の実施形態において、システム102は、計算モジュール218によって計算されたLWs用のMPGにのみ基づく警告のグループ化を実行するように構成されている。各グループからのFWsは、FWsのレビュー判断がLWのそれと同じであるので、無視される。MPGに基づくLWsのグループ化は、高効率につながり、警告のマニュアルレビューに要求される努力をさらに低減する。
【0063】
図5と6を参照して、
図5と6は、本発明の実施形態に係る、静的解析中に発生した1または2以上の警告をグループ化する方法500と600を示す。方法500と600は、コンピューター実行可能な命令の一般的状況を説明する。一般的に、コンピューター実行可能な命令は、ルーティーン、プログラム、オブジェクト、コンポーネント、データ構造、手順、モジュール、関数等を含む。それらは、特別な機能を実行し、または特別なアブストラクトデータタイプを実行する。方法500と600は、分散コンピューティング環境で実行されてもよい。その機能はコミュニケーションネットワークを介してリンクされた遠隔処理デバイスによって実行される。分散コンピューティング環境において、コンピューター実行可能な命令は、メモリーストレージデバイスを含む、ローカルコンピューターストレージ媒体とリモートコンピューターストレージ媒体との両方に位置される。
【0064】
方法500が説明する順番は、限定と解釈されない。記載された方法ブロックのいずれも方法500または代替方法を実行するために、いずれにおいても組み合わせられることができる。加えて、個々のブロックは、本発明の主旨や範囲を逸脱することなく、方法500から除去されてもよい。また、方法は、適切なハードウェア、ソフトウェア、ファームウェアまたはそれらの組合せにおいて実行されることができる。しかし、説明を簡単にするために、以下に記載される実施形態において、方法500は、上述されたシステム102において実行されるとして説明される。
【0065】
ブロック502で、アプリケーションコードが解析される。一つの実施例において、アプリケーションコードは、解析モジュール212によって警告を発生するために解析される。
【0066】
ブロック504で、警告から類似する警告が特定される。一つの実施例において、類似する警告は、特定モジュール214によって特定される。
【0067】
ブロック506で、警告の1または2以上のグループのそれぞれは、類似する警告が形成されることを含む。一つの実施例において、1または2以上のグループは、グループ化モジュール216によって形成される。
【0068】
静的解析中に発生した1または2以上の警告をグループ化する方法およびシステムの実施例が構造的特徴および/または方法に対して説明されたが、本発明は、説明された、特別な特徴または方法に必ずしも限定されない。むしろ、特別な特徴および方法は、静的解析中に発生した1または2以上の警告をグループ化する方法およびシステムの一例に過ぎない。