JP5403362B2 - パターン検査システム、パターン検査装置、方法およびパターン検査用プログラム - Google Patents

パターン検査システム、パターン検査装置、方法およびパターン検査用プログラム Download PDF

Info

Publication number
JP5403362B2
JP5403362B2 JP2009525465A JP2009525465A JP5403362B2 JP 5403362 B2 JP5403362 B2 JP 5403362B2 JP 2009525465 A JP2009525465 A JP 2009525465A JP 2009525465 A JP2009525465 A JP 2009525465A JP 5403362 B2 JP5403362 B2 JP 5403362B2
Authority
JP
Japan
Prior art keywords
call
pattern
pointer analysis
graph
abstract
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.)
Expired - Fee Related
Application number
JP2009525465A
Other languages
English (en)
Other versions
JPWO2009017231A1 (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.)
NEC Corp
Original Assignee
NEC 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 NEC Corp filed Critical NEC Corp
Priority to JP2009525465A priority Critical patent/JP5403362B2/ja
Publication of JPWO2009017231A1 publication Critical patent/JPWO2009017231A1/ja
Application granted granted Critical
Publication of JP5403362B2 publication Critical patent/JP5403362B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • G06F9/449Object-oriented method invocation or resolution

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)
  • Magnetic Resonance Imaging Apparatus (AREA)
  • Testing, Inspecting, Measuring Of Stereoscopic Televisions And Televisions (AREA)

Description

本発明は、パターン検査システム、パターン検査方法およびパターン検査用プログラムを記録した記憶媒体に関し、特にコンテキストを考慮したポインタ解析結果を用いて高い精度でパターンを検査できるパターン検査システム、パターン検査装置、パターン検査方法およびパターン検査用プログラムに関する。
一般に、この種のパターン検査システムは、プログラム実行時に当該プログラムの中で適切なパターンで関数呼出しが発生するか否かを検査する。
関連するパターン検査システムの例として、実際にプログラムを実行させることなく、プログラムのソースコードを解析し実行時の振る舞いを解析する検査システムの一例が、特許文献1と非特許文献1にそれぞれ記載されている。また、プログラム実行時にプログラムの振る舞いを監視し検査する検査システムの一例が、特許文献2に記載されている。
このように、パターンを検査する方法としては、プログラムを実行せずに解析する方法と実行中に監視して検出する方法の2種類が存在する。このうち、特許文献2に記載されているような実行時にプログラムの動作を監視して異常を検出する方法は、プログラムの実行速度の低下を招くという問題点を有している。
以下、関連する技術としてプログラムを実行させることなく解析する検査システムについてより詳細に述べる。
この種の検査システムは、プログラムと、関数呼出しパターンの規則とを入力として受け付けると、与えられたプログラムが実行時に与えられた関数呼び出しのパターンを守るか否かを、プログラムを解析することにより判定し、その判定結果を出力する。
このような検査システムは、プログラムの構文を解析する構文解析部と、関数内の制御フローを生成する関数内制御フローグラフ生成部と、関数間にまたがった制御フローグラフを生成する関数間制御フローグラフ生成部と、与えられたパスが妥当かどうかを検査するパス検査部と、関数間制御フローグラフとパス検査部とを用いてパターンが守られているか否かを検査するデータフロー解析部とから構成される。
図2の例を用いて、より具体的に検査システムの動作を説明する。図2のプログラム例は、オブジェクト指向型言語で記述したプログラムのソースコードである。
構文解析部は、プログラムのソースコードを解析して、プログラムを構成する文や、式、制御構造など各要素を、プログラミング言語の文法に従って判別する。関数内制御フローグラフ生成部は、各メソッド毎に関数内制御フローグラフを生成する。
関数内制御フローグラフは、プログラムの各文をノードとし、プログラムの制御の流れに従ってノードを有向辺で接続した有向グラフである。図2のプログラム例の場合は、メソッドmainとfuncのそれぞれについて関数内制御フローグラフを生成する。
関数間制御フローグラフ生成部は、各メソッドの関数内制御フローグラフをメソッド呼出に従って接続した関数間制御フローグラフを生成する。図2の例では、mainメソッドからfuncメソッドが呼び出されている。そのためmain中のfuncメソッド呼出を行う文に対応した関数内制御フローグラフのノードから、funcメソッドの開始ノード(entry)に対して有向辺を張り、funcメソッドの終端ノード(exit)から対応する呼出しの戻り場所に有向辺を張る。2つの呼出しがあるため、図2では経路1、経路2、経路3、経路4の合計4本の有向辺が追加される。
データフロー解析部は、このようにして得られた関数間制御フローグラフを用いてパターンを検査する。関数間制御フローグラフでは、例えば、経路1から経路4、あるいは、経路3から経路2、のように実際のプログラムの実行ではありえない経路が存在する。これらの経路は、関数呼出しに対応する正しい戻り場所に戻らないような経路であり、プログラム実行時には発生する可能性がない経路であるため、検査精度を低下させる要因となる。
そこで、データフロー解析部は、経路が与えられると、その経路に登場する関数呼出しノードと戻りノードが適切に対応しているか否かを判定するパス検査部を用いて、パス検査部が妥当と判定した経路についてのみ検査する。データフロー解析部は、データフロー解析を用いて、すべての妥当な経路について発生しうる関数呼出しのパターンを解析すると、与えられたパターン定義に従うか否かを検査する。従わないものが有る場合は、その旨を表示する。
特開2004−145381号公報(図1) 特開2002−333992号公報(図1) トーマス・レプ(ThomasReps)、他2名、"プリサイス インタープロシーデュラル データフロー アナリシス ヴィア グラフ リーチャビリティ"(Precise InterproceduralDataflow Analysis via Graph Reachability)、米国、1995年、エーシーエム ピー・オー・ピー・エル’95予稿集(ACMPOPL’95)、49−61頁
第1の問題点は、上述した関連する検査システムでは、オブジェクト指向型言語により記述されたプログラムの関数(メソッド)間に跨った関数(メソッド)呼出しパターンを検査できないことである。
その理由は、オブジェクト指向型言語では、特定のオブジェクトに対して発行されるメソッド呼出順序を検査する必要があるが、上述した関連のパス検査システムは、関数呼出しの順番のみを考慮し、その関数がどの対象(メモリ上に記録されたデータ)に対して作用を与えるかを何ら考慮していないためである。
したがって、上述した関連する検査システムは、プログラム中に登場する各参照変数(ポインタ変数)が実行時にどのオブジェクトを指すかを判別できない。その結果、オブジェクト指向型言語を検査すると、正しいプログラムであるにもかかわらず誤りがあると判断する、または誤ったプログラムを正しいと判断する、などの誤った判定が多発し、意味のある検査が実行できない。
例えば、図2の例で、1行目で生成されるRのオブジェクトと、3行目で生成されるRのオブジェクトがある。関連の検査システムは、funcの中で呼び出されるreleaseメソッド呼出が、1行目で生成されたオブジェクトを参照するのか3行目で生成されたオブジェクトを参照するのかを区別できない。
第2の問題点は、特定の実行経路で、当該経路に登場するメソッド中に登場する参照変数が、特定のオブジェクトを参照するかどうかを判定できないことである。
その理由は、上述した関連する検査システムは、関数呼出しの対応関係のみしか考慮していないためである。
図2の例において、検査システムは、経路1と経路2、および経路3と経路4の2通りであることを発見するが、前記の経路に含まれるfunc内の参照変数pが当該経路の場合にどのオブジェクトを参照するのかを区別できない。
パターンを精度良く検査するためには、経路1からfuncが呼出される場合は
p は1行目で生成されたR型のオブジェクトを指し、経路3からfuncが呼出される場合は p は3行目で生成されたR型のオブジェクトを指すことを検査システムが発見できる必要がある。
(発明の目的)
本発明の目的は、オブジェクト指向型言語で記述されたプログラムを対象に、当該プログラムを実行する際に生成されるオブジェクトに対して発行されるメソッド呼出パターンを、プログラムを実行することなしに、関数間に跨って検査できるパターン検査システムを提供することにある。
本発明の他の目的は、特定のオブジェクトに対して発行されるメソッド呼出パターンを精度良く検査するパターン検査システムを提供することにある。
本発明の第1のパターン検査システムは、オブジェクト指向型言語で記述されたプログラムを対象に、当該プログラムを実行する際に生成されるオブジェクトに対して発行されるメソッド呼出パターンを検査するパターン検査システムであって、プログラムのコンテキストを考慮したポインタ解析結果を用いることにより、検査対象オブジェクトに対して検査に間係するメソッド呼出を行う呼出場所を識別する手段を含む。
本発明の第2のパターン検査システムは、オブジェクト指向型言語で記述されたプログラムを対象に、当該プログラムを実行する際に生成されるオブジェクトに対して発行されるメソッド呼出パターンを検査するパターン検査システムであって、プログラムのプログラム情報に記録された抽象オブジェクトからパターン定義に記述された検査対象クラス名を参照して検査に関係する抽象オブジェクトを抽出する抽出手段と、プログラムのコンテキストを考慮したポインタ解析結果を用いて、抽象オブジェクトに対して検査に関係するメソッド呼出を行うメソッド呼出場所を判定する判定手段と、関数間に跨った制御フローグラフを作成しデータフロー解析を行ってメソッド呼出パターンがパターン定義に従っているか検査する検査手段とを含む。
本発明の第1のパターン検査装置は、オブジェクト指向型言語で記述されたプログラムを対象に、当該プログラムを実行する際に生成されるオブジェクトに対して発行されるメソッド呼出パターンを検査するパターン検査装置であって、プログラムのコンテキストを考慮したポインタ解析結果を用いることにより、検査対象オブジェクトに対して検査に間係するメソッド呼出を行う呼出場所を識別する手段を含む。
本発明の第2のパターン検査装置は、オブジェクト指向型言語で記述されたプログラムを対象に、当該プログラムを実行する際に生成されるオブジェクトに対して発行されるメソッド呼出パターンを検査するパターン検査装置であって、プログラムのプログラム情報に記録された抽象オブジェクトからパターン定義に記述された検査対象クラス名を参照して検査に関係する抽象オブジェクトを抽出する抽出手段と、プログラムのコンテキストを考慮したポインタ解析結果を用いて、抽象オブジェクトに対して検査に間係するメソッド呼出を行うメソッド呼出場所を判定する判定手段と、関数間に跨った制御フローグラフを作成しデータフロー解析を行ってメソッド呼出パターンがパターン定義に従っているか検査する検査手段とを含む。
本発明の第1のパターン検査方法は、オブジェクト指向型言語で記述されたプログラムを対象に、当該プログラムを実行する際に生成されるオブジェクトに対して発行されるメソッド呼出パターンを検査するパターン検査方法であって、プログラムのコンテキストを考慮したポインタ解析結果を用いることにより、検査対象オブジェクトに対して検査に間係するメソッド呼出を行う呼出場所を識別するステップを有する。
本発明の第2のパターン検査方法は、オブジェクト指向型言語で記述されたプログラムを対象に、当該プログラムを実行する際に生成されるオブジェクトに対して発行されるメソッド呼出パターンを検査するパターン検査システムであって、プログラムのプログラム情報に記録された抽象オブジェクトからパターン定義に記述された検査対象クラス名を参照して検査に関係する抽象オブジェクトを抽出するステップと、プログラムのコンテキストを考慮したポインタ解析結果を用いて、抽象オブジェクトに対して検査に間係するメソッド呼出を行うメソッド呼出場所を判定するステップと、関数間に跨った制御フローグラフを作成しデータフロー解析を行ってメソッド呼出パターンがパターン定義に従っているか検査するステップを有する。
本発明の第1のパターン検査プログラムを格納するコンピュータ読み取り可能な記録媒体は、コンピュータ上で実行され、オブジェクト指向型言語で記述されたプログラムを対象に、当該プログラムを実行する際に生成されるオブジェクトに対して発行されるメソッド呼出パターンを検査するパターン検査プログラムを格納するコンピュータ読み取り可能な記録媒体であって、パターン検査プログラムが、プログラムのコンテキストを考慮したポインタ解析結果を用いることにより、検査対象オブジェクトに対して検査に間係するメソッド呼出を行う呼出場所を識別する処理をコンピュータに実行させる。
本発明の第2のパターン検査プログラムを格納するコンピュータ読み取り可能な記録媒体は、コンピュータ上で実行され、オブジェクト指向型言語で記述されたプログラムを対象に、当該プログラムを実行する際に生成されるオブジェクトに対して発行されるメソッド呼出パターンを検査するパターン検査プログラムを格納するコンピュータ読み取り可能な記録媒体であって、パターン検査プログラムが、プログラムのプログラム情報に記録された抽象オブジェクトからパターン定義に記述された検査対象クラス名を参照して検査に関係する抽象オブジェクトを抽出する処理と、プログラムのコンテキストを考慮したポインタ解析結果を用いて、抽象オブジェクトに対して検査に間係するメソッド呼出を行うメソッド呼出場所を判定する処理と、関数間に跨った制御フローグラフを作成しデータフロー解析を行ってメソッド呼出パターンがパターン定義に従っているか検査する処理をコンピュータに実行させる。
第1の効果は、関数内、または関数間に跨って特定の抽象オブジェクトに対して発行されるメソッドのパターンを検査できることにある。
その理由は、プログラム中に登場する参照変数が、プログラム実行時にどの抽象オブジェクトを参照するかを考慮して、検査対象となる特定の抽象オブジェクトに対して発行されるメソッド呼出の呼出パターンを検査するためである。
第2の効果は、パターン検査の誤検出率を削減できることにある。
その理由は、展開したコールグラフ中の各メソッドに登場する参照変数が検査対象の抽象オブジェクトを参照するか否かを、コンテキストを考慮したポインタ解析結果を用いて判定し、実際に参照する場合にのみ、そのメソッド呼出が発生するものとして扱うためである。
本発明の第1の実施の形態によるパターン検査システムの構成を示すブロック図である。 サンプルプログラムとその関数間に跨る制御フローグラフの例を示す図である。 本発明の第1の実施の形態によるパターン定義の構成例を示す図である。 本発明の第1の実施の形態によるポインタ解析結果の構成例を示す図である。 本発明の第1の実施の形態による抽象オブジェクトの構成例を示す図である。 本発明の第1の実施の形態によるメソッド呼出場所の構成例を示す図である。 本発明の第1の実施の形態による有向グラフの構成例を示す図である。 本発明の第2の実施の形態によるポインタ解析結果の構成例を示す図である。 本発明の第2の実施の形態によるコンテキスト抽象オブジェクトの構成例を示す図である。 本発明の第1の実施の形態による動作を示すフローチャートである。 本発明の第1の実施の形態によるコールグラフ展開部の動作の詳細を示すフローチャートである。 本発明の第1の実施の形態による検査用グラフ生成部の動作の詳細を示すフローチャートである。 本発明の第1の実施の形態によるオブジェクト・センシティブなポインタ解析結果を用いた検査用グラフ生成部の動作の詳細を示すフローチャートである。 本発明の第1の実施の形態によるCFA型のポインタ解析結果を用いた検査用グラフ生成部の動作の詳細を示すフローチャートである。 本発明の第2の実施の形態によるオブジェクト・センシティブなポインタ解析結果を用いた検査用グラフ生成部の動作の詳細を示すフローチャートである。 本発明の第2の実施の形態によるCFA型のポインタ解析結果を用いた検査用グラフ生成部の動作の詳細を示すフローチャートである。 本発明の第1の実施の形態によるパターン検査装置のハードウェア構成を示すブロック図である。
次に、本発明の実施の形態について図面を参照して詳細に説明する。
(第1の実施の形態)
図1を参照すると、本発明の第1の実施の形態によるパターン検査システムは、プログラム制御により動作するパターン検査装置11と、情報を記憶する記憶装置12と、キーボードなどの入力装置13と、ディスプレイ装置や印刷装置などの出力装置14と、オブジェクト指向言語で記述されたプログラムを格納するファイルなどの検査対象プログラム15を記憶するプログラム記憶部20と、検査パターンを格納したファイルなどのパターン定義16を記憶するパターン定義記憶部21とを含む。
検査対象プログラム15は、JavaやC#などのオブジェクト指向型言語で記述されたプログラムであり、そのコード形式はコンパイル前のソースコードあるいはコンパイル後の実行コードのどちらでも良い。
パターン定義16は、あるオブジェクトに対して発行されるメソッド呼出パターン規則を記述したものであり、パターン検査システム利用者が独自に定義しても良いし、あらかじめパターン検査システムに組み込んでおいても良い。
パターン定義16の一例を図3に示す。パターン定義16は検査対象クラス名51aと、検査対象メソッド51bと、検査パターン51cとから構成される。検査対象クラス名51aは、当該呼出しパターンを守るべきオブジェクトのクラスを示す。検査対象メソッド51bは、パターンに関係するメソッドの集合を示す。検査パターン51cは、前記メソッドが前記オブジェクトに対して発行される際に守られるべきパターンを示す。
検査パターン51cは、例えば、有限オートマトンとして記述できる。有限オートマトンは、状態と、状態を結ぶ辺、および辺に対して割り当てられるラベルとからなり、1つの開始状態、複数の受理状態を持つ。ある状態から別の状態への遷移はメソッド呼出により発生するため、前状態と後状態とメソッドの3つ組により有限オートマトンの遷移関係を表現できる。
ある実行系列で特定のオブジェクトに対して発行されるメソッド呼出の列が検査パターンを表現した前記有限オートマトンにより受理されれば、当該実行系列は前記オブジェクトに対してメソッド呼出パターンの規則を守っていると判断する。
パターン検査装置11を構成する各要素について、図1、図4、5、6、7を用いて、その概略を説明する。
前処理部111は、検査対象プログラム15を解析してパターン検査に必要な各種のプログラム情報をプログラム情報記憶装置121に保存し、さらに検査対象プログラム15に対してコンテキストを考慮したポインタ解析を適用し、そのポインタ解析結果52をポインタ解析結果記憶装置122に保存する。
プログラム情報は、プログラム中でメソッド呼出が発生する場所を記録したメソッド呼出場所54(図6参照)や、オブジェクトが生成される場所と生成されるオブジェクトの型とを関係付けて記録した抽象オブジェクト53(図5参照)や、メソッド呼出の関係を記録したコールグラフ(図7の有向グラフ55参照)などを含む。コールグラフは、図7に示すような有向グラフ55の構成により表現できる。コールグラフにおけるノードはメソッドに対応する。あるメソッドAがメソッドBを呼出す場合、コールグラフの有向辺はメソッドAとBのペア(A,B)を含む。
ポインタ解析結果52の構成例を図4に示す。ポインタ解析結果52は、変数とコンテキストと抽象オブジェクトの3つ組から成る。変数がコンテキストで抽象オブジェクトを参照する可能性がある場合に、その3つ組がポインタ解析結果に含まれる。
リソース識別部112は、プログラム情報記憶装置121からオブジェクトの生成場所を示す抽象オブジェクト53に関する情報を読み込み、パターン定義16により指定された検査対象となるオブジェクトの生成場所を識別する。
検査対象となるオブジェクトの集合を特にリソースと呼ぶ。識別されたリソースは抽象オブジェクト53と1対1に対応付けられる。リソース識別部112は、リソースの集合、すなわち、検査対象とするべき抽象オブジェクト53の集合を得ると、その集合に含まれる抽象オブジェクト53を1つずつコールグラフ展開部113に送り、パターン検査部115より当該抽象オブジェクト53に対する検査が完了した通知を得ると、まだ処理していない抽象オブジェクト53を再びコールグラフ展開部113に送る。すべての抽象オブジェクト53を処理した段階で検査処理が完了となる。
コールグラフ展開部113は、リソース識別部112から1つの抽象オブジェクト53を受け取ると、プログラム情報記憶装置121からコールグラフを読み込み、読み込んだコールグラフを展開する。
このコールグラフ展開部113は、一般的なパターン検査システムのパス検査部と同様に、メソッド呼出の対応関係をとるための役割を果たす。展開したコールグラフと、リソース識別部112より送られた抽象オブジェクト53とが検査用グラフ生成部114に送られる。
さらに、コールグラフ展開部113は、プログラム情報記憶装置121からメソッド呼出場所54を読み込み、前記抽象オブジェクトに対して発行されるパターン検査に関係があるメソッド呼出場所54の集合を、前記抽象オブジェクト53に対応するパターン定義を参照して計算し、その結果を検査用グラフ生成部114に送付する。
検査用グラフ生成部114は、抽象オブジェクト53と、展開したコールグラフと、検査に関係するメソッド呼出場所54の集合とを受け取ると、ポインタ解析結果記憶装置122からポインタ解析結果52を読み込む。
検査用グラフ生成部114は、展開したコールグラフ中に登場する検査に関係するメソッド呼出場所54の変数が、展開したコールグラフにより与えられるコンテキストで前記抽象オブジェクト53を参照するか否かを、ポインタ解析結果52を用いて判定する。
そして、前記抽象オブジェクト53を参照すると判定された展開したコールグラフのノードとメソッド呼出場所54の組み合わせが、パターン検査部115に送られる。また、展開したコールグラフもパターン検査部115に送られる。
パターン検査部115は、展開したコールグラフと、展開したコールグラフのノードとメソッド呼出場所54の組み合わせの集合とを受け取ると、関数間制御フローグラフを構築し、データフロー解析により前記抽象オブジェクト53に対して発行されるメソッド呼出のパターンが、パターン定義51により定義される規則に従うか否かを判定し、その判定結果を出力装置14を用いて出力する。
なお、図1に示すパターン検査装置11の構成においては、本発明の特徴的な構成要素のみを示し、その他の構成要素については説明を分かりやすくするために省略している。
ここで、パターン検査装置11のハードウェア構成の説明をする。
図17は、第1の実施の形態によるパターン検査装置11のハードウェア構成を示すブロック図である。
図17を参照すると、パターン検査装置11は、一般的なコンピュータ装置と同様のハードウェア構成によって実現することができ、CPU(Central Processing Unit)301、RAM(Random Access Memory)等のメインメモリであり、データの作業領域やデータの一時退避領域に用いられる主記憶部302を備えている。
また、ネットワーク上で情報の送受信を行う通信制御部303、液晶ディスプレイ、プリンタやディスプレイ装置等の表示部304、キーボードやマウス等の入力部305、周辺機部と接続してデータの送受信を行うインタフェース部306、ROM(Read Only Memory)、磁気ディスク、半導体メモリ等の不揮発性メモリ等から構成される補助記憶部307、本情報処理装置の上記各構成要素を相互に接続するシステムバス308等を備えている。例えば、補助記憶部307として、本実施の形態による記憶装置12を含むことが可能である。
本実施の形態によるパターン検査装置11は、その動作を、上述した各構成要素による機能を実現するプログラムを組み込んだ、LSI(Large Scale Integration)等のハードウェア部品からなる回路部品を実装してハードウェア的に実現することは勿論として、上記した各構成要素の各機能を提供するプログラムを、コンピュータ処理装置上のCPU301で実行することにより、ソフトウェア的に実現することができる。
すなわち、CPU301が、補助記憶部307に格納されているプログラムを、主記憶部302にロードして実行し、パターン検査装置11の動作を制御することにより、上述した各機能をソフトウェア的に実現する。
次に、図1及び図10のフローチャートを参照して本実施の形態の全体の動作について詳細に説明する。
まず、入力装置13を用いて、検査対象プログラム15とパターン定義16とがパターン検査装置11に読み込まれる(ステップS11)。
次に、前処理部111は、検査対象プログラム15に対して字句解析、構文解析などの基本的な解析を適用し、抽象オブジェクト53やメソッド呼出場所54、また、メソッド内部の関数内制御フローグラフなどをプログラム情報記憶装置121に記録する(ステップS12)。
関数内制御フローグラフは、プログラムの最小実行単位である文をノードとし、メソッド内の制御フローに従って各ノードを接続した有向グラフであり、例えば、有向グラフ55の構成をとる。1つの実施例では、Javaであれば、スート(Soot (http://www.sable.mcgill.ca/soot/index.html))という解析基盤を用いることで前記プログラム情報を得られる。なお、抽象オブジェクト53やメソッド呼出場所54に含まれる「場所」はプログラム中の最小実行単位となる文を一意に示す識別子とする。
さらに、前処理部111は、コンテキストを考慮したポインタ解析をプログラム15に適用し、その結果得られるポインタ解析結果52の集合をポインタ解析結果記憶装置122に格納する(ステップS12)。1つの実施例では、Javaであれば、コンテキストを考慮したポインタ解析結果はPaddle (http://www.sable.mcgill.ca/paddle/)という解析基盤を用いることで得られる。
また、前処理部111は、前記ポインタ解析により得られるメソッド呼出の関係を表現したコールグラフをプログラム情報記憶装置121に記録する(ステップS12)。
次に、リソース識別部112は、プログラム情報記憶装置121から抽象オブジェクト53の集合を読み込む。前記抽象オブジェクト53のうち、その型がパターン定義16に含まれる検査対象クラス名と一致するような抽象オブジェクト53を抽出する(ステップS13)。
また、他の実施の形態では、リソース識別部112が、前記抽象オブジェクト53のうち、その型がパターン定義16に含まれる検査対象クラス名と一致するか、検査対象クラスのサブクラスの名前と一致するような抽象オブジェクト53を抽出するようにしても良い。
このステップS13により抽出された抽象オブジェクト53の集合は、パターン定義16によりパターンが定義されている検査するべきオブジェクト(リソース)を示している。なお、抽象オブジェクト53に対応するパターン定義51とは、当該抽象オブジェクト53の型に合致する検査対象クラス名を持つパターン定義16を示すものとする。
次に、リソース識別部112は、得られた抽象オブジェクト53の集合から、まだ処理していない抽象オブジェクト53を1つ選択しコールグラフ展開部113に渡す(ステップS14)。すべての抽象オブジェクト53の処理が完了したら、全体の処理を終了する。
コールグラフ展開部113は、プログラム情報記憶装置121からコールグラフを読み込むと、読み込んだコールグラフから展開したコールグラフを生成する(ステップS15)。
ここで、コールグラフ展開部113によるコールグラフの展開処理(ステップS15)について図11のフローチャートを用いてより詳細に説明する。図11のフローチャートはステップS15の処理の詳細を示している。
まず、コールグラフ展開部113は、プログラム情報記憶装置121からメソッド呼出場所54の集合を読み込み、ポインタ解析結果記憶装置122からポインタ解析結果52の集合を読み込むと、メソッド呼出場所54の集合から、受け付けた抽象オブジェクト53に関係するもののみを抽出する。
メソッド呼出場所54が抽象オブジェクト53に関係するか否かは次のように判定する。
すなわち、メソッド呼出場所54に含まれる変数と与えられた抽象オブジェクト53との組み合わせが前記ポインタ解析結果52の集合に含まれており、かつ前記メソッド呼出場所54に含まれるメソッド名が、前記抽象オブジェクト53に対応するパターン定義16の検査対象メソッドの集合に含まれているのならば、当該メソッド呼出場所54は前記抽象オブジェクト53と関係する、と判定する。
なお、ポインタ解析結果52の集合に、ある変数と抽象オブジェクトとの組み合わせが含まれるか否かの判定は、前記変数と任意のコンテキスト(空のコンテキストを含む)と前記抽象オブジェクトとの3つ組がポインタ解析結果52の集合に含まれているか否かを判定することと等価とする。
前記抽出したメソッド呼出場所54の集合を、抽象オブジェクト53の検査に関係するメソッド呼出場所54の集合、あるいは単に、検査に関係するメソッド呼出場所54の集合、と記述する。検査に関係するメソッド呼出場所54を含むメソッドを検査に関係するメソッドと判断し、収集する(ステップS51)。
次に、読み込んだコールグラフから検査に関係する部分グラフを抽出する(ステップS52)。
なお、パターン検査に必ずしも本ステップが必要ではなく、ステップS51からステップS53に処理を移しても良い。ただし、一般に、コールグラフを展開すると膨大な規模の有向グラフとなるため、不要な部分を本ステップにおいて取り除いておくことが計算時間の短縮や消費メモリ量の削減につながり、好ましい。
受け付けた抽象オブジェクト53に含まれる場所を含むメソッドと、前記抽象オブジェクト53の検査に関係するメソッドとを「関心があるメソッド」と呼ぶ。部分グラフは有向グラフであり、例えば、図7に示すような有向グラフ55の構成を持つ。部分グラフの頂点には、関心があるメソッドと、コールグラフの中で関心があるメソッドに到達するすべてのメソッドを含める。有向グラフ中のあるノードから到達可能なノードの集合を算出する方法は広く知られている。
次に、コールグラフの有向辺に含まれる(メソッド1、メソッド2)のペアのうち、メソッド2が部分グラフの頂点のメソッド集合に含まれるようなペアを、部分グラフの有向辺に含める。こうして得られた部分グラフは、コールグラフのエントリ・ポイントから関心があるメソッドに到達する任意の経路に含まれるすべてのノード(メソッド)と、その経路に対応する有向辺とを含む。
次に、ステップS52で得られた部分グラフ、あるいはステップS52の処理を省略する場合はコールグラフ、を展開する(ステップS53)。
再帰的なメソッド呼出を含む場合、部分グラフ、またはコールグラフは循環を含む有向グラフになる。そのため、本実施の形態では、グラフ中の各Strongly
Connected Component(SCC)を1つのノードに縮退した非循環有向グラフに変換し、各ノードへの入力辺が1つになるようにノードを複製する。
その後、前記複製したグラフに含まれるStrongly Connected Componentの要素を元の接続関係を維持するように復元して、展開したグラフを得る。
このような展開方法は、例えば、非特許文献:Ondrej
Lhotak著、Program Analysis Using Binary Decision Diagrams、米国、2006年、McGill大学、博士論文、104-106頁(online:
http://plg.uwaterloo.ca/~olhotak/pubs/thesis-olhotak-phd.ps)に記載されており、当該技術分野の専門家には広く知られている。
展開したコールグラフの頂点は、メソッドと識別子のペアの集合から成る。展開したコールグラフでは、1つのノードに複数のメソッドが対応するため、識別子により同じメソッドに対応する異なるノードを識別する。識別子は、したがって、同じメソッドに対応するノードの間で唯一の値をとるものとする。有向辺は、メソッドと識別子のペアを要素とするペアの集合である。
以上がステップS15のコールグラフ展開処理の動作の詳細である。
次に、検査用グラフ生成部114は、コールグラフ展開部113より展開したコールグラフと、抽象オブジェクト53と、前記抽象オブジェクト53の検査に関係するメソッド呼出場所54の集合とを受け付けると、ポインタ解析結果記憶装置122からポインタ解析結果52を読み込み、検査用グラフを生成する(ステップS16)。
この検査用グラフを生成するための動作の詳細を図12のフローチャートを用いて説明する。
まず、検査用グラフ生成部114は、展開したコールグラフの中から、まだ処理していない未処理のノードを1つ選択する(ステップS61、S62)。
次に、検査に関係するメソッド呼出場所の集合の中から、まだ処理していないメソッド呼出場所を1つ選択する(ステップS63、S64)。処理していないメソッド呼出場所がない場合はステップS61に戻る。
選択したノードを構成するメソッドが前記メソッド呼出場所を含む場合、ステップS66の処理に移り、含まない場合はステップS63に戻る(ステップS65)。
展開したコールグラフに選択したノードの親ノードが存在する場合はステップS67に、存在しない場合はステップS68に処理を移す(ステップS66)。親ノードが存在するとは、展開したコールグラフの有向辺に(親ノード、選択ノード)なるペアが含まれることを示す。
親ノードが存在する場合は、当該ノードのコンテキストで前記メソッド呼出場所の変数が前記抽象オブジェクトを参照するか否かを判定する(ステップS67)。本判定処理の詳細は後述する。参照すると判定された場合はステップS68に、そうでない場合はステップS63に戻る。
ステップS68では、当該ノードと当該メソッド呼出場所54のペアをリソース利用箇所と呼ぶ集合に追加する。リソース利用箇所に含まれるノードとメソッド呼出場所のペアは次の性質を有する。
すなわち、当該ノードにより与えられるコンテキストにおいてメソッド呼出場所54に含まれる変数は前記抽象オブジェクト53を参照し、かつメソッド呼出場所54では、検査に関係するメソッド呼出が発生する、という性質である。
ステップS61で、すべてのノードの処理が終了すると、検査用グラフ生成部114は、作成したリソース利用箇所(展開したコールグラフのノードとメソッド呼出場所54の組み合わせの集合)と展開したコールグラフと、前記抽象オブジェクト53と、をパターン検査部115に渡してステップS16の処理を終える。なお、ステップS16が始まる段階でのリソース利用箇所は空の集合とする。
最後に、パターン検査部115は、リソース利用箇所と展開したコールグラフを受け取ると、関数間に跨った制御フローグラフを生成し、当該制御フローグラフに対してデータフロー解析をにより、前記抽象オブジェクトに対応したパターン定義51の検査パターンが守られているか否かを検査し、その結果を、出力装置14を用いて表示する(ステップS17)。
パターン検査部115のパターン検査方法についてより詳細に説明する。
関数間に跨った制御フローグラフは以下のような方法で作成する。
(1)展開したコールグラフの各ノードを構成する各メソッドの関数内制御フローグラフをプログラム情報記録装置121から読み込む。
(2)展開したコールグラフのすべての有向辺(ノードA,ノードB)について、Aを構成するメソッドの関数内制御フローグラフ内に登場する全てのBを構成するメソッドのメソッド呼出場所からBを構成するメソッドの関数内制御フローグラフのエントリノードに有向辺を引く。
(3)Bを構成するメソッドの関数内制御フローグラフのすべての終端ノードからAを構成するメソッドの関数内制御フローグラフの対応するBを構成するメソッドのメソッド呼出の戻り場所への有向辺を引く。
例えば、上記において、ノードAを構成するメソッドをm1とし、ノードBを構成するメソッドをm2とすると、m1の関数内制御フローグラフ内に登場する全てのm2メソッド呼出場所からm2の関数内制御フローグラフのエントリノードに有向辺を引き、m2の関数内制御フローグラフのすべての終端ノードからm1の関数内制御フローグラフの対応するm2メソッド呼出の戻り場所への有向辺を引くことで、関数間に跨った制御フローグラフが作成される。
関数間に跨った制御フローグラフの作成方法は一般的なパターン検査システムとほぼ同様であるが、一般的なシステムでは、展開していないコールグラフから関数間に跨った制御フローグラフを生成するのに対して、本発明の第1の実施の形態によるパターン検査システムでは、展開したコールグラフから関数間に跨った制御フローグラフを生成する点が異なっている。
得られた関数間に跨った制御フローグラフのうち、当該抽象オブジェクト53に含まれる場所に対応するノードを、検査対象オブジェクトを生成するノードとして記録する。また、前記リソース利用箇所に含まれるノードとメソッド呼出場所54の組により決定されるノードを当該抽象オブジェクト53に対してパターンに関係するメソッド呼出を行うノードとして記録する。それ以外のノードは検査に関係しないノードとして記録する。
なお、展開したコールグラフのノードとメソッド呼出場所54が与えられると、まず、関数間に跨った制御フローグラフから前記展開したコールグラフのノードに対応する部分グラフ(前記ノードを構成するメソッドに対応した関数内の制御フローグラフ)が識別され、次に、前記部分グラフからメソッド呼出場所54に含まれる場所に対応するノードが識別される。
これにより、当該抽象オブジェクト53を生成するノードと、当該抽象オブジェクト53に対してパターンに関係するメソッド呼出を行うノードと、それ以外の検査に関係しないノードの3種類のノードを含む有向グラフ(関数間に跨った制御フローグラフ)が得られる。
そこで、前記パターン定義16に定義された有限オートマトンが、前記有向グラフの各ノードでどのような状態を取り得るかをデータフロー解析により計算する。有向グラフの終端ノードで有限オートマトンが受理状態以外の状態を取る場合にはパターンに違反すると判定する。
また、有限オートマトンに定義されていない遷移が発生した場合もパターン違反と見なしても良い。このようなデータフロー解析による判定方法については、当該技術分野の当業者に広く知られている。
以上の動作により、プログラム実行時に生成される特定のオブジェクトに対して発行されるメソッドのパターンが与えられたパターンの規則に従うか否かを判定できる。
次に、検査用グラフ生成部114の処理である、図12に示したフローチャートのステップS67の詳細な動作を図13、図14に示すフローチャートを用いて説明する。
本ステップでは、検査対象である当該抽象オブジェクト53を参照する可能性がある当該メソッド呼出場所54の変数が、展開したコールグラフにおける当該ノードにより与えられるコンテキストにおいて当該抽象オブジェクト53を参照するか否かを、ポインタ解析結果52を用いて判定する。判定方法は利用するポインタ解析の種類に依存する。
第1の実施の形態ではオブジェクト・センシティブ(object
sensitive)と呼ばれる種類のポインタ解析を利用する。この種のポインタ解析は、例えば、非特許文献:アナ・ミラノバ(Ana Milanova)、他2名、“パラメタライズド
オブジェクト センシティビティ フォー ポインツ・トゥー アナリシス フォー ジャヴァ”(Parameterized Object Sensitivity
for Points-to Analysis for Java)、米国、2005年、エーシーエム トランザクション オン ソフトウェア エンジニアリング アンド メソドロジー(ACM
Transaction on Software Engineering and Methodology)、14巻、1号、1−41頁に記載されている。
この種のポインタ解析結果では、コンテキストが抽象オブジェクトの列により表現される。したがって、オブジェクト・センシティブなポインタ解析結果は、変数、コンテキストとしての抽象オブジェクト、抽象オブジェクトと3つ組により構成される。コンテキストとしての抽象オブジェクトは、当該変数が登場するメソッドのレシーバ・オブジェクトである。なお、1つの実施例では、Javaであれば、そのようなポインタ解析結果はPaddle(http://www.sable.mcgill.ca/paddle/)という解析基盤を用いることで得られる。
図13のフローチャートはオブジェクト・センシティブなポインタ解析結果を用いた場合に、判定に利用する関数の動作を示しており、再帰呼出を含む。前記関数は当該ノードから探索的に展開したコールグラフの親ノードをたどってパスが妥当か否かを判定する。ステップS67では、前記関数 validPath に対して、当該ノードと、当該メソッド呼出場所54の変数と、当該抽象オブジェクト53と、空のリストと、深さを示す数値を与え、その結果が真であれば妥当であると判断し、偽であれば妥当でないと判断する。
深さを示す数値は探索の深さを指定するために用いられる。全てを探索する場合は深さを0未満の値にすればよい。良い精度を得るためには0未満の値を指定することが好ましい。性能を考慮すると3程度の深さを指定すると好ましい。
図13のフローチャートを用いて関数の動作の詳細を説明する。関数の引数は、展開したコールグラフ中の特定のノードを示すnode、変数var、抽象オブジェクトa、履歴history、最大の深さdepthである。本関数はnodeにより指定されたコンテキストでvarがaを参照するか否かを判定する。
最初に、履歴を示すリストhistoryにnodeを追加する(ステップSA1)。
次に、展開したコールグラフ中にnodeの親ノードが存在するか否かを判定し、存在しない場合はコンテキストが得られないのでステップSA12に移る。存在する場合はステップSA3に移る(ステップSA2)。
ステップSA3では、探索の深さを調べる。depthの値が0と等しければステップSA12に移り、そうでない場合はステップSA4に移る。
ステップSA12では、変数varが抽象オブジェクトaを参照するか否かをポインタ解析結果を用いて判定する。varと任意のコンテキスト(空のコンテキストを含む)とaの3つ組がポインタ解析結果の集合に含まれていれば真を返し、そうでないならば偽を返す。
ステップSA4では、nodeの親ノードのうち処理していないものがあれば1つを選択してステップSA5に移る。すべての親ノードを処理した場合は偽を返す。
ステップSA5では前記親ノードがhistoryに含まれるならばステップSA4に戻る。そうでないならばステップSA6に移る。
ステップSA6では、当該nodeを構成するメソッドがstaticメソッドであるか否かを判定し、staticメソッドならばステップSA8に移り、そうでない場合にはステップSA7に移る。
ステップSA8では、前記親ノードと、変数varと、抽象オブジェクトaと、履歴historyと、depth-1
を再帰的に本関数に適用し、その結果が真ならば真を返し、偽ならばステップSA4に戻る。
なお、staticメソッドの場合、レシーバ・オブジェクトが存在しない。この時、staticメソッドを呼出すメソッドのレシーバ・オブジェクトをコンテキストとして利用するようなポインタ解析を本実施の形態では想定している。
また別の実施の形態として、staticメソッドの場合はコンテキストを空とするオブジェクト・センシティブなポインタ解析を利用することもできる。この種のポインタ解析を用いた実施の形態では、ステップSA8の動作が次のように変わる。つまり、ステップSA8で、変数varが抽象オブジェクトaを参照するか否かをポインタ解析結果を用いて判定する。そして、varと任意のコンテキスト(空のコンテキストを含む)とaの3つ組がポインタ解析結果の集合に含まれていれば真を返し、そうでないならばステップSA4に戻る。
ステップSA7では、前記親ノードを構成するメソッドに含まれるメソッド呼出場所54のうち、当該nodeを構成するメソッドをメソッド名として持つようなメソッド呼出場所54を抽出し、それぞれについてステップSA9から始まる処理を適用する。すべての抽出したメソッド呼出場所54の処理を終えた場合はステップSA4に戻る。
ステップSA9では、前記選択されたメソッド呼出場所54の変数が参照する抽象オブジェクトの集合を求め、それぞれについてステップSA10から始まる処理を適用する。前記抽象オブジェクトの集合の要素をすべて処理し終えたらステップSA7に戻る。変数が参照する抽象オブジェクトの集合は、ポインタ解析結果52のうち、前記変数を含むポインタ解析結果52に含まれる抽象オブジェクトを集めることにより得られる。本ステップで選択した抽象オブジェクトをa2と呼ぶ。
ステップSA10では、関数の引数に登場する変数varが、前記選択した抽象オブジェクトa2をコンテキストとして、関数の引数に登場する抽象オブジェクトaを参照するか否かをポインタ解析結果を用いて判定する。参照するならばステップSA11に、そうでないならばステップSA9に移る。例えば、varとa2とaの3つ組がポインタ解析結果の集合に含まれていれば、varはa2のコンテキストでaを参照すると判定する。
ステップSA11では、さらに、前記選択したメソッド呼出場所54に含まれる変数が前記親ノードにより与えられるコンテキストでa2を参照するか否かを判定するために、前記親ノードと前記選択したメソッド呼出場所54に含まれる変数と、a2と、履歴historyと、depth-1を引数として本関数に適用する。関数の返り値が真ならば真を返し、偽ならばステップSA9に戻る。
以上の手続きにより、オブジェクト・センシティブなポインタ解析結果を用いて、当該変数が当該ノードにより与えられるコンテキストで当該抽象オブジェクトを参照するか否かを判定できる。
図12のステップS67の他の実施の形態では、メソッドの呼出場所をコンテキストに利用するCFA型のポインタ解析を利用する。この種のポインタ解析結果は、変数と、メソッド呼出場所と、抽象オブジェクトの3つ組により構成される。1つの実施例では、Javaであれば、そのようなポインタ解析結果はPaddle(http://www.sable.mcgill.ca/paddle/)という解析基盤を用いることで得られる。
図14のフローチャートは、CFA型のポインタ解析結果を用いた場合に、判定に利用する手続き型の関数の動作を示しており、ステップS67での経路の妥当性を判定するために利用する。関数の引数は、展開したコールグラフ中の特定のノードを示すnode、変数var、抽象オブジェクトa、である。ステップS67は、関数validPathに対して、当該ノードと、当該メソッド呼出場所54に含まれる変数と、当該抽象オブジェクト53と、空のリストと、深さを示す数値を与え、その結果が真であれば妥当であると判断し、偽ならば妥当ではないと判断する。深さを示す数値の適切な値は、オブジェクト・センシティブな解析の場合と同様である。
図14のフローチャートを用いて、関数の動作の詳細を説明する。
最初に、展開したコールグラフ中にnodeの親ノードが存在するか否かを判定し、存在しない場合はコンテキストが得られないのでステップSB5に移る。存在する場合はステップSB2に移る(ステップSB1)。
ステップSB5では、変数varが抽象オブジェクトaを参照するか否かをポインタ解析結果を用いて判定する。varと任意のコンテキスト(空のコンテキストを含む)とaの3つ組がポインタ解析結果の集合に含まれていれば真を返し、そうでないならば偽を返す。
ステップSB2では、nodeの親ノードのうち処理していないものがあれば1つを選択してステップSB3に移る。すべての親ノードを処理した場合は偽を返す。
ステップSB3では、前記親ノードを構成するメソッドに含まれるメソッド呼出場所54のうち、当該nodeを構成するメソッドをメソッド名として持つようなメソッド呼出場所54を抽出し、それぞれについてステップSB4の処理を適用する。
ステップSB4では、前記選択されたメソッド呼出場所54をコンテキストとして、ポインタ解析結果を用いて、前記変数varが前記抽象オブジェクトaを参照するか判定する。判定は、varと前記選択されたメソッド呼出場所54とaの3つ組がポインタ解析結果に含まれていればvarは本コンテキストでaを指すと判断する。参照する場合は真を返し、参照しない場合はステップSB3に戻る。
以上の手続きにより、CFA型のポインタ解析結果を用いて、当該変数が当該ノードにより与えられるコンテキストで当該抽象オブジェクトを参照するか否かを判定できる。
なお、オブジェクト・センシティブなポインタ解析も、CFA型のポインタ解析結果も利用するコンテキストの長さに関する指定ができる。前記実施の形態はそれぞれ長さが1の場合の動作を記載したが、長さが1より大きい場合は、親ノードから到達するさらに親のノードを必要なコンテキストの長さに到達するまで探索し、その親ノードの組み合わせについてコンテキストを生成して検査することで、同様に判定できる。
(第1の実施の形態による効果)
次に、本実施の形態の効果について説明する。
本実施の形態では、ポインタ解析結果を用いてメソッド呼出場所に登場する変数がどの抽象オブジェクトを参照するかを調査するように構成されているため、特定の場所で生成されるオブジェクトに対して発行されるメソッド呼出のパターンを検査できる。
また、本実施の形態では、さらに、展開したコールグラフ上のノード中に登場する変数が検査対象の抽象オブジェクトを参照するか否かを、コンテキストを考慮したポインタ解析結果を用いて判定するように構成されているため、より精度良くパターンを検査できる。
(第2の実施の形態)
次に、本発明の第2の実施の形態について詳細に説明する。
第2の実施の形態では、抽象オブジェクトに対してもコンテキストを考慮したポインタ解析を用いる点が第1の実施の形態と相違する。抽象オブジェクトに対してもコンテキストを考慮したポインタ解析の解析結果であるポインタ解析結果56は、例えば、図8に示すような構成を有する。
背景技術において説明した関連するパターン検査システムでは、前述した問題点以外に、特定の経路で生成されたオブジェクトを、特定の経路に登場する参照変数が参照するかどうかを判定できないため、異なる実行経路で生成されるオブジェクトを区別してパターンを検査できないという問題点を有していた。本第2の実施の形態によるパターン検査システムは、このような問題点を解消する。
ポインタ解析結果56は、変数と、コンテキスト1と、抽象オブジェクトと、コンテキスト2の4つ組からなり、コンテキスト1において、変数は、コンテキスト2の場合に生成される抽象オブジェクトを参照すると解釈される。特定のコンテキストで生成されるオブジェクトの集合をコンテキスト抽象オブジェクトと称し、コンテキスト抽象オブジェクト57は、図9に示すような構成を有する。
第2の実施の形態によるパターン検査システムのパターン検査装置11の全体構成は、図1に示した第1の実施の形態と同じであり、パターン検査装置11を構成する各要素の機能が、第1の実施の形態と以下のように相違する。
図1を参照すると、パターン検査装置11の前処理部111が、ポインタ解析結果52ではなく、図8に示すポインタ解析結果56の集合を生成し、検査対象プログラム15から、図9に示すコンテキスト抽象オブジェクト57の集合を生成する点が第1の実施の形態と相違する。
また、リソース識別部112が、パターン検査に関係する抽象オブジェクト53ではなく、パターン検査に関係するコンテキスト抽象オブジェクト57を抽出し、抽出したコンテキスト抽象オブジェクト57の集合の要素一つ一つに対して検査を行う点が第1の実施の形態と相違する。
また、コールグラフ展開部113が、抽象オブジェクト53ではなく、コンテキスト抽象オブジェクト57を用いて検査に関係するメソッド呼出場所54を抽出する点が第1の実施の形態と相違する。
また、検査用グラフ生成部114が、抽象オブジェクト53ではなく、コンテキスト抽象オブジェクト57を用いて変数がコンテキスト抽象オブジェクト57を参照するか否かを識別する点が第1の実施の形態と相違する。
また、パターン検査部115が、抽象オブジェクト53ではなく、コンテキスト抽象オブジェクト57を用いて検査対象とするオブジェクトの生成ノードを判定する点が第1の実施の形態と相違する。
次に、図10のフローチャートを参照して、特に第1の実施の形態と相違する第2の実施の形態の動作を詳細に説明する。
ステップS11の動作は第1の実施の形態と同様である。
ステップS12では、前処理部112は、参照変数だけでなく、参照変数が参照するオブジェクトに対してもコンテキストを考慮したポインタ解析を用いてポインタ解析結果56を生成し、ポインタ解析結果記憶装置122に記録する点が第1の実施の形態と相違する。好ましい実施例として、Javaであれば、ポインタ解析結果56は、Paddle(http://www.sable.mcgill.ca/paddle/)という解析基盤を用いることで得られる。また、ポインタ解析結果56などを用いてコンテキスト抽象オブジェクト57をプログラム情報記憶装置121に記録する点が第1の実施の形態と相違する。
第2の実施の形態では、抽象オブジェクト53ではなく、コンテキスト抽象オブジェクト57に対してどのようなパターンでメソッドが発行されるのかを検査する。
ステップS13では、リソース識別部112が、パターン定義16の検査対象クラス名を用いて、パターン検査を行う必要があるコンテキスト抽象オブジェクト57の集合を抽出する点が第1の実施の形態と相違する。あるコンテキスト抽象オブジェクト57があるパターン定義16に関係するか否かは、コンテキスト抽象オブジェクト57に含まれる型の情報を用いることにより第1の実施の形態の場合と同様に判定する。
ステップS14では、リソース識別部112は、前記抽出したコンテキスト抽象オブジェクト57の集合の要素を一つずつ取り出し、コールグラフ展開部113に渡す点が第1の実施の形態と相違する。
ステップS15の動作をより詳細に示した図11のフローチャートを用いて、第2の実施の形態の動作を説明する。
ステップS51において検査に関係するメソッド呼出場所54とメソッドを識別する際に、抽象オブジェクト53ではなくコンテキスト抽象オブジェクト57を利用し、またポインタ解析結果52ではなくポインタ解析結果56を利用する点が第1の実施の形態と相違する。
メソッド呼出場所54の変数が、渡されたコンテキスト抽象オブジェクト57を参照するならば、当該メソッド呼出場所54は検査に関係する。
メソッド呼出場所54の変数が前記渡されたコンテキスト抽象オブジェクト57を参照するか否かは次のようにして判定する。
(1)メソッド呼出場所54の変数と同じ変数を含むポインタ解析結果56であること。
(2)前記ポインタ解析結果56に含まれる抽象オブジェクトとコンテキスト2の組み合わせが前記コンテキスト抽象オブジェクトと等しいこと。
上記のような条件を満たすポインタ解析結果56が存在すればメソッド呼出場所54は検査に関係する。
ステップS52は前記検査に関係するメソッド呼出場所54の集合を用いて処理する。その動作は第1の実施の形態と同様である。また、ステップS53の動作も第1の実施の形態と同様である。
次に、ステップS16の動作をより詳細に示した図12のフローチャートを用いて、第2の実施の形態の動作を説明する。ここでは、ステップS67の動作のみが第1の実施の形態と相違する。
ステップS67では、利用するポインタ解析結果の種類に依存してその動作が変わる。オブジェクト・センシティブなポインタ解析を用いた場合に利用する第2の実施の形態による判定用の関数の動作を図15に、CFA型のポインタ解析を用いた場合に利用する第2の実施の形態による判定用の関数の動作を図16にそれぞれ示す。
まず、図15に示すフローチャートを用いて、その動作の詳細を説明する。
関数cvalidPathは展開したコールグラフのノードnodeと、変数varと、コンテキスト抽象オブジェクトaと、履歴historyと、最大の深さdepthを引数に持つ。cvalidPathは、nodeにより与えられるコンテキストで変数varがコンテキスト抽象オブジェクトaを参照する場合に真を返し、それ以外の場合に偽を返す。
ステップSC1、SC2,SC3,SC4,SC5,SC6、SC7、は図13に示した第1の実施の形態の関数validPathの動作ステップSA1、SA2,SA3,SA4,SA5,SA6、SA7と、それぞれ同様である。
ステップS8は、再帰的に cvalidPathに、ステップSC4で選択された親ノードと、引数として与えられた変数varと,引数として与えられたコンテキスト抽象オブジェクト57と、history、とdepth-1を引数として適用し、返りが真なら真を返し、偽ならばステップSC4に戻る。
ステップSC9では、ステップSC7で選択されたメソッド呼出場所54の参照変数が参照する抽象オブジェクト53の集合を求め、それぞれについてステップSC10から始まる処理を適用する。
ポインタ解析結果56を用いてメソッド呼出場所54の参照変数が参照する抽象オブジェクト53の集合を求める方法は、次の通りである。
当該メソッド呼出場所54に含まれる変数と同じ変数を含むポインタ解析結果56に含まれる抽象オブジェクト53の集合を算出する。
ステップSC10では、ポインタ解析結果56を用いてステップSC9で選択された抽象オブジェクト53をコンテキストとして、引数で与えられた変数varが、引数で与えられたコンテキスト抽象オブジェクトaを参照するか否かを判定する。
前記変数varと、前記抽象オブジェクト53と、コンテキスト抽象オブジェクトaに含まれる抽象オブジェクトと、コンテキスト抽象オブジェクトaに含まれるコンテキストの4つ組がポインタ解析結果56の集合に含まれるならば、変数varはコンテキスト抽象オブジェクトaを前記抽象オブジェクトのコンテキストで参照すると判断する。参照する場合はステップSC11に進み、そうでない場合はステップSC9に戻る。
ステップSC11では、第1の実施の形態で用いた図13に示す関数validPathを、引数として、ステップSC4で選択された親ノードと、ステップSC7で選択されたメソッド呼出場所54に含まれる変数と、ステップSC9で選択された抽象オブジェクトと、hisotryと、depth-1を用いて適用する。
返り値が真ならば真を返し、偽ならば、ステップSC9に戻る。なお、validPathはポインタ解析52に対して定義されているものであるが、ポインタ解析56はポインタ解析52を包含する情報を有するため、同様に適用可能である。例えば、先に示したように、ポインタ解析結果56を用いて、ある変数が参照する抽象オブジェクトの集合を算出できる。
次に、図16に示すフローチャートを用いてCFA型のポインタ解析を用いた場合に利用する第2の実施の形態による判定用の関数の動作を示す。
cvalidPathは引数として、展開したコールグラフのノードnodeと、変数varと、コンテキスト抽象オブジェクトaを受け取ると、nodeにより与えられるコンテキストで変数varがコンテキスト抽象オブジェクトaを参照する場合に真を返し、それ以外の場合は偽を返す関数である。
ステップSD1,SD2,SD3,は図14に示した第1の実施の形態の関数 validPathの動作ステップSB1,SB2,SB3とそれぞれ同様である。
ステップSD4は、ステップSD3選択されたメソッド呼出場所54をコンテキストとして、ポインタ解析結果56を用いて、変数varがコンテキスト抽象オブジェクトaを参照するか否かを判定し、参照する場合は真を返し、それ以外の場合はステップSD3に戻る。
変数varと、前記メソッド呼出場所54と、引数として与えられたコンテキスト抽象オブジェクトa
に含まれる抽象オブジェクトと、引数として与えられたコンテキスト抽象オブジェクトa に含まれるコンテキストの4つ組が、ポインタ解析結果56に含まれるかを判定し、含まれるならば、varはaを参照すると判定する。
ステップSD5は、変数varがコンテキスト抽象オブジェクトaを参照するか否かをポインタ解析結果56を用いて判定する。varと、任意のコンテキスト(空のコンテキストを含む)と、aに含まれる抽象オブジェクトと、aに含まれるコンテキストとの4つ組がポインタ解析結果56の集合に含まれていれば真を返し、そうでないならば偽を返す。
次に、第2の実施の形態のパターン検査(図10のステップS17)の動作について説明する。
第2の実施の形態のパターン検査部115は、関数間に跨った制御フローグラフを生成後に、検査対象オブジェクトを生成する場所を識別する動作のみが第1の実施の形態と相違する。
第2の実施の形態では、検査対象オブジェクトはコンテキスト抽象オブジェクト57である。生成ノードを識別する方法は抽象オブジェクトのコンテキストとして何を用いるかにより変化する。
ポインタ解析結果56に含まれるコンテキスト1とコンテキスト2に利用するコンテキストの種類の組み合わせは、オブジェクト・センシティブとオブジェクト・センシティブ、オブジェクト・センシティブとCFA型、CFA型とオブジェクト・センシティブ、CFA型とCFA型の4種類が考えられるが、CFA型とオブジェクト・センシティブの組み合わせは意味を成さないため、残る3種類の組み合わせに対する実施の形態を述べる。
まず、参照変数と抽象オブジェクトに対してオブジェクト・センシティブとオブジェクト・センシティブの組み合わせのコンテキストを利用するポインタ解析を用いる実施の形態について説明する。この組み合わせがもっとも好適である。
まず、検査対象のコンテキスト抽象オブジェクト57に含まれる場所を含むメソッドに対応する展開したコールグラフ中の全てのノードについて検査を行う。
この検査方法は次の通りである。当該コンテキスト抽象オブジェクト57に含まれるコンテキストが空の場合は真を返し、そうでない場合は、当該ノードの親ノードと、当該ノードの前記親ノードに含まれる当該ノードを構成するメソッドを呼び出すメソッド呼出場所54の変数varと、当該コンテキスト抽象オブジェクト57に含まれる抽象オブジェクトとを図13に示す関数validPathに適用し、返り値が真になるような親ノードに含まれるメソッド呼出場所54が存在すれば、本検査の結果として真を返し、そうでない場合は偽を返す。検査結果が真になるようなノードについて、当該ノードと前記コンテキスト抽象オブジェクト57に含まれる場所により識別される関数間制御フローグラフ内のノードを、検査対象オブジェクトを生成するノードとして記録する。
次に、参照変数と抽象オブジェクトに対してオブジェクト・センシティブとCFA型の組み合わせのコンテキストを利用するポインタ解析、または、CFA型とCFA型の組み合わせのコンテキストを利用するポインタ解析を用いる実施の形態について述べる。
コンテキスト抽象オブジェクト57に含まれるコンテキストはメソッド呼出場所54である。まず、検査対象のコンテキスト抽象オブジェクト57に含まれる場所を含むメソッドに対応する展開したコールグラフ中の全てのノードについて検査を行う。
この検査方法は次の通りである。当該ノードの親ノードに、当該コンテキスト抽象オブジェクト57に含まれるコンテキストのメソッド呼出場所54に含まれる場所を含むノードが存在すれば真を返し、そうでないならば偽を返す。検査結果が真になるようなノードについて、当該ノードと前記コンテキスト抽象オブジェクト57に含まれる場所により識別される関数間制御フローグラフ内のノードを、検査対象オブジェクトを生成するノードとして記録する。
(第2の実施の形態による効果)
次に、第2の実施の形態による効果について説明する。
背景技術において説明した関連するパターン検査システムでは、特定の経路で生成されたオブジェクトを、特定の経路に登場する参照変数が参照するかどうかを判定できないため、異なる実行経路で生成されるオブジェクトを区別してパターンを検査できないという問題があったが、本第2の実施の形態では、同じ場所で生成されるオブジェクトであっても、コンテキストが異なるものを異なる検査対象オブジェクトとして検査するように構成されているため、異なる実行経路で生成されるオブジェクトを区別してパターンを検査できる。
より詳しくは、抽象オブジェクトに対してコンテキストを考慮したポインタ解析結果を用いて、特定のコンテキストで生成される抽象オブジェクトを参照する参照変数により発行されるメソッド呼出のパターンを検査するためである。
なお、本説明中に登場するdepth-1はdepthという変数の値から1を引いた値という意味である。
なお、オブジェクト・センシティブなポインタ解析結果を利用する場合の検査用グラフ生成部114は、図13用いて説明した動作では、関数validPathの処理にhistoryという履歴を用いたが、最大の深さを指定すれば必ずしも履歴を利用する必要はない。従って、図13のステップSA1、ステップSA5の処理を省略する。
また、図13に示すvalidPathの処理において、履歴として展開したコールグラフのノードを利用するのではなく、展開したコールグラフと抽象オブジェクトの組を利用しても良い。この場合、図13に示す処理のステップSA1とステップSA5の処理を無くし、新たに、ステップSA6とSA8の間に、新しいステップを追加する。この新しいステップでは、当該
node とnull との組み合わせが履歴historyに含まれるか否かを判定し、含まれる場合はステップSA4に戻り、含まれない場合は、履歴hisotryに前記nodeとnullとの組を追加してステップSA8の処理に移る。
さらに、ステップSA10とステップSA11の間に新しいステップを追加する。この新しいステップでは、当該nodeとステップSA9で選択された抽象オブジェクトとの組が履歴historyに含まれるか否かを判定し、含まれる場合はステップSA9に戻り、含まれない場合は、前記nodeと前記抽象オブジェクトとの組とを履歴hisotryに加えてステップSA11の処理に移る。これにより履歴に展開されたグラフのノードと抽象オブジェクトとを履歴に用いたvalidPathの処理を実現することができる。
図15に示すパターン検査部が利用する関数cvalidPathの履歴も同様の修正で展開されたグラフのノードと抽象オブジェクトとの組を履歴に用いることが可能である。
以上好ましい実施の形態と実施例をあげて本発明を説明したが、本発明は必ずしも、上記実施の形態及び実施例に限定されるものでなく、その技術的思想の範囲内において様々に変形して実施することができる。
この出願は、2007年8月2日に出願された日本出願特願2007−201584を基礎とする優先権を主張し、その開示の全てをここに取り込む。
本発明によれば、プログラム中からパターン定義に違反する部位を検出するパターン検査装置や、パターンを検査する機能をプログラム開発環境の警告機能、補完機能といった用途にも適用できる。

Claims (16)

  1. オブジェクト指向型言語で記述された検査対象のプログラムに対してコンテキストを考慮したポインタ解析を実行して、前記プログラム中でメソッドの呼出しが発生する場所を記録したメソッド呼出場所、オブジェクトの生成場所と生成される前記オブジェクトの型とを関係付けて記録した抽象オブジェクト、および前記メソッド呼出しの関係を記録したコールグラフから構成されるプログラム情報を取得してプログラム情報記憶装置に保存し、変数とコンテキストと前記抽象オブジェクトの3つ組から構成されるポインタ解析結果を生成してポインタ解析結果記憶装置に保存する前処理部と、
    前記プログラム情報記憶装置に格納された、前記オブジェクトに対して発行される前記メソッド呼出しのパターン規則を記述し、呼出しパターンを守るべきオブジェクトのクラスを示す検査対象クラス名と、前記パターンに関係するメソッドの集合を示す検査対象メソッドと、前記メソッドが前記オブジェクトに対して発行される際に守られるべき検査パターンから構成されるパターン定義を読み出し、前記プログラム情報記憶装置から前記オブジェクトの生成場所を読み込み、前記検査対象クラス名と一致する検査対象となる前記抽象オブジェクトの生成場所の集合を検査対象として抽出するリソース識別部と、
    前記プログラム情報記憶装置から前記メソッド呼出場所の集合を読み込み、ポインタ解析結果記憶装置から前記ポインタ解析結果の集合を読み込むと、前記メソッド呼出場所の集合から、前記抽象オブジェクトに関係する前記メソッド呼出場所を抽出し、前記コールグラフから前記関係する前記メソッド呼出場所からなる展開したコールグラフを生成するコールグラフ展開部と、
    前記コールグラフ展開部より前記展開したコールグラフと、前記抽象オブジェクトと、前記抽象オブジェクトの検査に関係する前記メソッド呼出場所の集合とを受け付けると、前記ポインタ解析結果記憶装置から前記ポインタ解析結果を読み込み、前記展開したコールグラフの各ノードにより与えられる前記コンテキストで前記メソッド呼出場所に含まれる変数が前記オブジェクトを参照するか否かを判定し、参照すると判定した場合、当該ノードと当該メソッド呼出場所のペアをリソース利用箇所と呼ぶ集合に追加する検査用グラフ生成部と、
    前記リソース利用箇所と前記展開したコールグラフとに基づいて関数間制御フローグラフを構築し、検査対象である前記抽象オブジェクトを参照する可能性がある前記メソッド呼出場所の前記変数が、前記展開したコールグラフにおけるノードにより与えられる前記コンテキストにおいて前記抽象オブジェクトを参照するか否かを、前記ポインタ解析結果を用いて判定するパターン検査部とを備え、
    前記コールグラフ展開部は、
    前記メソッド呼出場所に含まれる変数と前記抽象オブジェクトの組み合わせが前記ポインタ解析結果の集合に含まれているか判定し、含まれている場合に、当該メソッド呼出場所に含まれるメソッド名が、前記抽象オブジェクトに対応する前記パターン定義の検査対象メソッドの集合に含まれていれば、当該メソッド呼出場所は前記抽象オブジェクトに関係すると判定する
    ことを特徴とするパターン検査システム。
  2. オブジェクト・センシティブなポインタ解析によって得られる前記ポインタ解析結果を利用することを特徴とする請求項1に記載のパターン検査システム。
  3. CFA型のポインタ解析による前記ポインタ解析結果を利用することを特徴とする請求項1に記載のパターン検査システム。
  4. 前記前処理部が、抽象オブジェクトに対してもコンテキストを考慮したポインタ解析を行い、
    前記パターン検査部が、関数間に跨った制御フローグラフを生成後に、検査対象オブジェクトを生成する場所を識別することを特徴とする請求項1に記載のパターン検査システム。
  5. オブジェクト指向型言語で記述された検査対象のプログラムに対してコンテキストを考慮したポインタ解析を実行して、前記プログラム中でメソッドの呼出しが発生する場所を記録したメソッド呼出場所、オブジェクトの生成場所と生成される前記オブジェクトの型とを関係付けて記録した抽象オブジェクト、および前記メソッド呼出しの関係を記録したコールグラフから構成されるプログラム情報を取得してプログラム情報記憶装置に保存し、変数とコンテキストと前記抽象オブジェクトの3つ組から構成されるポインタ解析結果を生成してポインタ解析結果記憶装置に保存する前処理部と、
    前記プログラム情報記憶装置に格納された、前記オブジェクトに対して発行される前記メソッド呼出しのパターン規則を記述し、呼出しパターンを守るべきオブジェクトのクラスを示す検査対象クラス名と、前記パターンに関係するメソッドの集合を示す検査対象メソッドと、前記メソッドが前記オブジェクトに対して発行される際に守られるべき検査パターンから構成されるパターン定義を読み出し、前記プログラム情報記憶装置から前記オブジェクトの生成場所を読み込み、前記検査対象クラス名と一致する検査対象となる前記抽象オブジェクトの生成場所の集合を検査対象として抽出するリソース識別部と、
    前記プログラム情報記憶装置から前記メソッド呼出場所の集合を読み込み、ポインタ解析結果記憶装置から前記ポインタ解析結果の集合を読み込むと、前記メソッド呼出場所の集合から、前記抽象オブジェクトに関係する前記メソッド呼出場所を抽出し、前記コールグラフから前記関係する前記メソッド呼出場所からなる展開したコールグラフを生成するコールグラフ展開部と、
    前記コールグラフ展開部より前記展開したコールグラフと、前記抽象オブジェクトと、前記抽象オブジェクトの検査に関係する前記メソッド呼出場所の集合とを受け付けると、前記ポインタ解析結果記憶装置から前記ポインタ解析結果を読み込み、前記展開したコールグラフの各ノードにより与えられる前記コンテキストで前記メソッド呼出場所に含まれる変数が前記オブジェクトを参照するか否かを判定し、参照すると判定した場合、当該ノードと当該メソッド呼出場所のペアをリソース利用箇所と呼ぶ集合に追加する検査用グラフ生成部と、
    前記リソース利用箇所と前記展開したコールグラフとに基づいて関数間制御フローグラフを構築し、検査対象である前記抽象オブジェクトを参照する可能性がある前記メソッド呼出場所の前記変数が、前記展開したコールグラフにおけるノードにより与えられる前記コンテキストにおいて前記抽象オブジェクトを参照するか否かを、前記ポインタ解析結果を用いて判定するパターン検査部とを備え、
    前記コールグラフ展開部は、
    前記メソッド呼出場所に含まれる変数と前記抽象オブジェクトの組み合わせが前記ポインタ解析結果の集合に含まれているか判定し、含まれている場合に、当該メソッド呼出場所に含まれるメソッド名が、前記抽象オブジェクトに対応する前記パターン定義の検査対象メソッドの集合に含まれていれば、当該メソッド呼出場所は前記抽象オブジェクトに関係すると判定する
    ことを特徴とするパターン検査装置。
  6. オブジェクト・センシティブなポインタ解析によって得られる前記ポインタ解析結果を利用することを特徴とする請求項5に記載のパターン検査装置。
  7. CFA型のポインタ解析による前記ポインタ解析結果を利用することを特徴とする請求項5に記載のパターン検査装置。
  8. 前記前処理部が、抽象オブジェクトに対してもコンテキストを考慮したポインタ解析を行い、
    前記パターン検査部が、関数間に跨った制御フローグラフを生成後に、検査対象オブジェクトを生成する場所を識別することを特徴とする請求項5に記載のパターン検査装置。
  9. パターン検査装置によるパターン検査方法であって、
    前記パターン検査装置が、
    オブジェクト指向型言語で記述された検査対象のプログラムに対してコンテキストを考慮したポインタ解析を実行して、前記プログラム中でメソッドの呼出しが発生する場所を記録したメソッド呼出場所、オブジェクトの生成場所と生成される前記オブジェクトの型とを関係付けて記録した抽象オブジェクト、および前記メソッド呼出しの関係を記録したコールグラフから構成されるプログラム情報を取得してプログラム情報記憶装置に保存し、変数とコンテキストと前記抽象オブジェクトの3つ組から構成されるポインタ解析結果を生成してポインタ解析結果記憶装置に保存する前処理ステップと、
    前記プログラム情報記憶装置に格納された、前記オブジェクトに対して発行される前記メソッド呼出しのパターン規則を記述し、呼出しパターンを守るべきオブジェクトのクラスを示す検査対象クラス名と、前記パターンに関係するメソッドの集合を示す検査対象メソッドと、前記メソッドが前記オブジェクトに対して発行される際に守られるべき検査パターンから構成されるパターン定義を読み出し、前記プログラム情報記憶装置から前記オブジェクトの生成場所を読み込み、前記検査対象クラス名と一致する検査対象となる前記抽象オブジェクトの生成場所の集合を検査対象として抽出するリソース識別ステップと、
    前記プログラム情報記憶装置から前記メソッド呼出場所の集合を読み込み、ポインタ解析結果記憶装置から前記ポインタ解析結果の集合を読み込むと、前記メソッド呼出場所の集合から、前記抽象オブジェクトに関係する前記メソッド呼出場所を抽出し、前記コールグラフから前記関係する前記メソッド呼出場所からなる展開したコールグラフを生成するコールグラフ展開ステップと、
    前記コールグラフ展開ステップより前記展開したコールグラフと、前記抽象オブジェクトと、前記抽象オブジェクトの検査に関係する前記メソッド呼出場所の集合とを受け付けると、前記ポインタ解析結果記憶装置から前記ポインタ解析結果を読み込み、前記展開したコールグラフの各ノードにより与えられる前記コンテキストで前記メソッド呼出場所に含まれる変数が前記オブジェクトを参照するか否かを判定し、参照すると判定した場合、当該ノードと当該メソッド呼出場所のペアをリソース利用箇所と呼ぶ集合に追加する検査用グラフ生成ステップと、
    前記リソース利用箇所と前記展開したコールグラフとに基づいて関数間制御フローグラフを構築し、検査対象である前記抽象オブジェクトを参照する可能性がある前記メソッド呼出場所の前記変数が、前記展開したコールグラフにおけるノードにより与えられる前記コンテキストにおいて前記抽象オブジェクトを参照するか否かを、前記ポインタ解析結果を用いて判定するパターン検査ステップとを実行し、
    前記コールグラフ展開ステップで、
    前記メソッド呼出場所に含まれる変数と前記抽象オブジェクトの組み合わせが前記ポインタ解析結果の集合に含まれているか判定し、含まれている場合に、当該メソッド呼出場所に含まれるメソッド名が、前記抽象オブジェクトに対応する前記パターン定義の検査対象メソッドの集合に含まれていれば、当該メソッド呼出場所は前記抽象オブジェクトに関係すると判定する
    ことを特徴とするパターン検査方法。
  10. オブジェクト・センシティブなポインタ解析によって得られる前記ポインタ解析結果を利用することを特徴とする請求項9に記載のパターン検査方法。
  11. CFA型のポインタ解析による前記ポインタ解析結果を利用することを特徴とする請求項9に記載のパターン検査方法。
  12. 象オブジェクトに対してもコンテキストを考慮したポインタ解析を行い、
    数間に跨った制御フローグラフを生成後に、検査対象オブジェクトを生成する場所を識別することを特徴とする請求項9に記載のパターン検査方法
  13. パターン検査装置を構成するコンピュータ上で動作するパターン検査プログラムであって、
    前記コンピュータに、
    ブジェクト指向型言語で記述された検査対象のプログラムに対してコンテキストを考慮したポインタ解析を実行して、前記プログラム中でメソッドの呼出しが発生する場所を記録したメソッド呼出場所、オブジェクトの生成場所と生成される前記オブジェクトの型とを関係付けて記録した抽象オブジェクト、および前記メソッド呼出しの関係を記録したコールグラフから構成されるプログラム情報を取得してプログラム情報記憶装置に保存し、変数とコンテキストと前記抽象オブジェクトの3つ組から構成されるポインタ解析結果を生成してポインタ解析結果記憶装置に保存する前処理
    記プログラム情報記憶装置に格納された、前記オブジェクトに対して発行される前記メソッド呼出しのパターン規則を記述し、呼出しパターンを守るべきオブジェクトのクラスを示す検査対象クラス名と、前記パターンに関係するメソッドの集合を示す検査対象メソッドと、前記メソッドが前記オブジェクトに対して発行される際に守られるべき検査パターンから構成されるパターン定義を読み出し、前記プログラム情報記憶装置から前記オブジェクトの生成場所を読み込み、前記検査対象クラス名と一致する検査対象となる前記抽象オブジェクトの生成場所の集合を検査対象として抽出するリソース識別処理
    記プログラム情報記憶装置から前記メソッド呼出場所の集合を読み込み、ポインタ解析結果記憶装置から前記ポインタ解析結果の集合を読み込むと、前記メソッド呼出場所の集合から、前記抽象オブジェクトに関係する前記メソッド呼出場所を抽出し、前記コールグラフから前記関係する前記メソッド呼出場所からなる展開したコールグラフを生成するコールグラフ展開処理
    記コールグラフ展開処理より前記展開したコールグラフと、前記抽象オブジェクトと、前記抽象オブジェクトの検査に関係する前記メソッド呼出場所の集合とを受け付けると、前記ポインタ解析結果記憶装置から前記ポインタ解析結果を読み込み、前記展開したコールグラフの各ノードにより与えられる前記コンテキストで前記メソッド呼出場所に含まれる変数が前記オブジェクトを参照するか否かを判定し、参照すると判定した場合、当該ノードと当該メソッド呼出場所のペアをリソース利用箇所と呼ぶ集合に追加する検査用グラフ生成処理
    記リソース利用箇所と前記展開したコールグラフとに基づいて関数間制御フローグラフを構築し、検査対象である前記抽象オブジェクトを参照する可能性がある前記メソッド呼出場所の前記変数が、前記展開したコールグラフにおけるノードにより与えられる前記コンテキストにおいて前記抽象オブジェクトを参照するか否かを、前記ポインタ解析結果を用いて判定するパターン検査処理を実行させ、
    前記コールグラフ展開処理で、
    前記メソッド呼出場所に含まれる変数と前記抽象オブジェクトの組み合わせが前記ポインタ解析結果の集合に含まれているか判定し、含まれている場合に、当該メソッド呼出場所に含まれるメソッド名が、前記抽象オブジェクトに対応する前記パターン定義の検査対象メソッドの集合に含まれていれば、当該メソッド呼出場所は前記抽象オブジェクトに関係すると判定する
    ことを特徴とするパターン検査プログラム。
  14. オブジェクト・センシティブなポインタ解析によって得られる前記ポインタ解析結果を利用することを特徴とする請求項13に記載のパターン検査プログラム。
  15. CFA型のポインタ解析による前記ポインタ解析結果を利用することを特徴とする請求項13に記載のパターン検査プログラム。
  16. 象オブジェクトに対してもコンテキストを考慮したポインタ解析を行い、
    数間に跨った制御フローグラフを生成後に、検査対象オブジェクトを生成する場所を識別することを特徴とする請求項13に記載のパターン検査プログラム。
JP2009525465A 2007-08-02 2008-08-01 パターン検査システム、パターン検査装置、方法およびパターン検査用プログラム Expired - Fee Related JP5403362B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2009525465A JP5403362B2 (ja) 2007-08-02 2008-08-01 パターン検査システム、パターン検査装置、方法およびパターン検査用プログラム

Applications Claiming Priority (4)

Application Number Priority Date Filing Date Title
JP2007201584 2007-08-02
JP2007201584 2007-08-02
PCT/JP2008/063895 WO2009017231A2 (ja) 2007-08-02 2008-08-01 パターン検査システム、パターン検査装置、方法およびパターン検査用プログラム
JP2009525465A JP5403362B2 (ja) 2007-08-02 2008-08-01 パターン検査システム、パターン検査装置、方法およびパターン検査用プログラム

Publications (2)

Publication Number Publication Date
JPWO2009017231A1 JPWO2009017231A1 (ja) 2010-10-28
JP5403362B2 true JP5403362B2 (ja) 2014-01-29

Family

ID=40305025

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009525465A Expired - Fee Related JP5403362B2 (ja) 2007-08-02 2008-08-01 パターン検査システム、パターン検査装置、方法およびパターン検査用プログラム

Country Status (3)

Country Link
US (1) US20100199264A1 (ja)
JP (1) JP5403362B2 (ja)
WO (1) WO2009017231A2 (ja)

Families Citing this family (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8776027B2 (en) * 2009-03-06 2014-07-08 Microsoft Corporation Extracting and collecting platform use data
US8689180B2 (en) * 2009-11-03 2014-04-01 International Business Machines Corporation Systems and methods for resource leak detection
US9535663B2 (en) * 2010-09-17 2017-01-03 Oracle International Corporation Pattern-based construction and extension of enterprise applications in a cloud computing environment
JP5656602B2 (ja) * 2010-12-14 2015-01-21 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation ポインタを解析する方法、並びにそのコンピュータ及びコンピュータ・プログラム
US9003371B2 (en) 2010-12-30 2015-04-07 International Business Machines Corporation Recursive method call representation in a plot view of method execution performance
CN102323906B (zh) * 2011-09-08 2014-01-08 哈尔滨工程大学 一种基于遗传算法的mc/dc测试数据自动生成方法
US9202047B2 (en) 2012-05-14 2015-12-01 Qualcomm Incorporated System, apparatus, and method for adaptive observation of mobile device behavior
US9690635B2 (en) 2012-05-14 2017-06-27 Qualcomm Incorporated Communicating behavior information in a mobile computing device
US9747440B2 (en) 2012-08-15 2017-08-29 Qualcomm Incorporated On-line behavioral analysis engine in mobile device with multiple analyzer model providers
US9319897B2 (en) 2012-08-15 2016-04-19 Qualcomm Incorporated Secure behavior analysis over trusted execution environment
US9686023B2 (en) 2013-01-02 2017-06-20 Qualcomm Incorporated Methods and systems of dynamically generating and using device-specific and device-state-specific classifier models for the efficient classification of mobile device behaviors
US10089582B2 (en) 2013-01-02 2018-10-02 Qualcomm Incorporated Using normalized confidence values for classifying mobile device behaviors
US9684870B2 (en) 2013-01-02 2017-06-20 Qualcomm Incorporated Methods and systems of using boosted decision stumps and joint feature selection and culling algorithms for the efficient classification of mobile device behaviors
US9742559B2 (en) 2013-01-22 2017-08-22 Qualcomm Incorporated Inter-module authentication for securing application execution integrity within a computing device
US9501382B2 (en) * 2013-06-25 2016-11-22 Purdue Research Foundation Systems and methods of detecting power bugs
WO2015060832A1 (en) * 2013-10-22 2015-04-30 Mcafee, Inc. Control flow graph representation and classification
US10296737B2 (en) * 2015-12-09 2019-05-21 International Business Machines Corporation Security enforcement in the presence of dynamic code loading
CN105608003B (zh) * 2015-12-17 2018-04-17 西安电子科技大学 基于控制流分析和数据流分析的Java程序静态分析方法
US20240045662A1 (en) * 2022-08-02 2024-02-08 Nvidia Corporation Software code verification using call graphs for autonomous systems and applications

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06348475A (ja) * 1993-06-14 1994-12-22 Nec Corp ポインタ解析システム
JPH07262044A (ja) * 1994-03-25 1995-10-13 Hitachi Ltd イベントトレース解析方法
WO2002046921A1 (fr) * 2000-12-08 2002-06-13 Fujitsu Limited Procede et dispositif pour l'analyse de sequences
JP2003036186A (ja) * 2001-07-25 2003-02-07 Toshiba Corp 別名検索装置、別名検索方法及び別名検索用プログラム
JP2005100402A (ja) * 2003-09-23 2005-04-14 Microsoft Corp オブジェクト指向プログラムのための領域ベースのメモリ管理
JP2005258944A (ja) * 2004-03-12 2005-09-22 Internatl Business Mach Corp <Ibm> プログラム解析装置、その解析方法及びプログラム
JP2006146613A (ja) * 2004-11-19 2006-06-08 Matsushita Electric Ind Co Ltd プログラム変換方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7526755B2 (en) * 2003-10-08 2009-04-28 Microsoft Corporation Plug-in pre- and postconditions for static program analysis
US8332939B2 (en) * 2007-02-21 2012-12-11 International Business Machines Corporation System and method for the automatic identification of subject-executed code and subject-granted access rights

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH06348475A (ja) * 1993-06-14 1994-12-22 Nec Corp ポインタ解析システム
JPH07262044A (ja) * 1994-03-25 1995-10-13 Hitachi Ltd イベントトレース解析方法
WO2002046921A1 (fr) * 2000-12-08 2002-06-13 Fujitsu Limited Procede et dispositif pour l'analyse de sequences
JP2003036186A (ja) * 2001-07-25 2003-02-07 Toshiba Corp 別名検索装置、別名検索方法及び別名検索用プログラム
JP2005100402A (ja) * 2003-09-23 2005-04-14 Microsoft Corp オブジェクト指向プログラムのための領域ベースのメモリ管理
JP2005258944A (ja) * 2004-03-12 2005-09-22 Internatl Business Mach Corp <Ibm> プログラム解析装置、その解析方法及びプログラム
JP2006146613A (ja) * 2004-11-19 2006-06-08 Matsushita Electric Ind Co Ltd プログラム変換方法

Also Published As

Publication number Publication date
JPWO2009017231A1 (ja) 2010-10-28
WO2009017231A2 (ja) 2009-02-05
US20100199264A1 (en) 2010-08-05

Similar Documents

Publication Publication Date Title
JP5403362B2 (ja) パターン検査システム、パターン検査装置、方法およびパターン検査用プログラム
US8762970B2 (en) Method, computer program and computer system for assisting in analyzing program
US7890808B2 (en) Testing software applications based on multiple data sources
CN111104335B (zh) 一种基于多层次分析的c语言缺陷检测方法及装置
CN112035359B (zh) 程序测试方法、装置、电子设备及存储介质
US20090319246A1 (en) Detection program, detecting device, and detecting method
JP6486574B2 (ja) プログラムコード生成装置、プログラムコード生成方法及びプログラムコード生成プログラム
CN115146282A (zh) 基于ast的源代码异常检测方法及其装置
US20100036981A1 (en) Finding Hot Call Paths
KR102114547B1 (ko) 대상 프로그램에 포함된 대상 함수를 테스트하는 방법 및 장치
CN108874656A (zh) 代码测试方法、装置、可读存储介质及计算机设备
JP6723483B2 (ja) テストケース生成装置、テストケース生成方法およびテストケース生成プログラム
US8359579B2 (en) Monitoring dynamic aspect oriented applications at execution time
CN103559127A (zh) 一种缺陷处理方法及缺陷处理器
CN116483888A (zh) 程序评估方法及装置、电子设备和计算机可读存储介质
JP2006259820A (ja) 故障検出改善装置、故障検出改善プログラム、故障検出改善方法
CN112286802B (zh) 一种测试程序性能方法、装置和电子设备
JP7331681B2 (ja) テスト実行プログラム、テスト実行方法、およびテスト実行装置
CN112699376A (zh) 源代码逻辑漏洞检测方法、装置、计算机设备及存储介质
US7689399B1 (en) Automatic extraction of design properties
Zeng et al. A unified framework for evaluating test criteria in model-checking-assisted test case generation
JP4869581B2 (ja) カバレッジ計測システム及びそのプログラム
JP6369102B2 (ja) ソフトウェア試験支援システム
JPH08272623A (ja) プログラム解析装置及びプログラム解析方法
US11782682B2 (en) Providing metric data for patterns usable in a modeling environment

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110712

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130205

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130404

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130424

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130621

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130711

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130909

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20131003

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20131016

LAPS Cancellation because of no payment of annual fees