JP2016122321A - 解析装置、解析方法、および解析プログラム - Google Patents

解析装置、解析方法、および解析プログラム Download PDF

Info

Publication number
JP2016122321A
JP2016122321A JP2014261731A JP2014261731A JP2016122321A JP 2016122321 A JP2016122321 A JP 2016122321A JP 2014261731 A JP2014261731 A JP 2014261731A JP 2014261731 A JP2014261731 A JP 2014261731A JP 2016122321 A JP2016122321 A JP 2016122321A
Authority
JP
Japan
Prior art keywords
command statement
filter rule
program
analysis
call
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.)
Pending
Application number
JP2014261731A
Other languages
English (en)
Inventor
眞男 相見
Masao Aimi
眞男 相見
弓澄 小山内
Yumizumi Osanai
弓澄 小山内
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.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2014261731A priority Critical patent/JP2016122321A/ja
Publication of JP2016122321A publication Critical patent/JP2016122321A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Stored Programmes (AREA)

Abstract

【課題】解析対象を解析して、開発者が意図しない命令文の依存関係を検出すること。
【解決手段】呼び出し先となる第1の命令文と、呼び出し先と呼び出し元との依存関係を規定するフィルタルールおよび呼び出し元となる第2の命令文の組み合わせであるアノテーション属性と、を対応付けた対応情報を記憶する記憶デバイスにアクセス可能なプロセッサが、アノテーション属性を含む解析対象から、第2の命令文を検出する検出処理と、対応情報を参照して、第2の命令文と第2の命令文によって呼び出される呼び出し先の命令文が、検出処理によって検出された第2の命令文を呼び出し元とするフィルタルールに適合するか否かを判定する判定処理と、判定処理によって適合すると判定された判定結果に関する情報を生成する生成処理と、生成処理によって生成された判定結果に関する情報を出力する出力処理と、を実行する。
【選択図】図1

Description

本発明は、プログラムリスト、中間ファイル、またはプログラムのいずれかである解析対象を解析する解析装置、解析方法、および解析プログラムに関する。
インターネット等のオープンネットワークには、オープンソースソフトウェア(OSS)と呼ばれるプログラムリスト付きのソフトウェアが公開されている。OSSのプログラムリストについては、開発者が開発するプログラムリストに自由に組み込むことが可能である。OSSには、ライセンスが指定されていることがあり、例えば、OSSには、GNU Public License(以下、GPL)と呼ばれるライセンスが存在する。GPLには、GPLのファイルを取り込んだファイルはGPLとして配布されなければならないという条項が記載されている。
GPLにはソースコード開示義務が存在するため、プロプライエタリなソフトウェアを開発する際に、GPLのファイルを取り込むことにより、意図しないソースコード開示義務が発生することがある。また、GPLが指定されたOSSだけではなく、このOSSを取り込んだプログラムに対してもGPLが適用される。したがって、当該プログラムについてGPLの条項と違う使い方をすると、ライセンス違反になる。
したがって、ファイル間において呼び出し元と呼び出し先の関係を示す依存関係を抽出して、開発者がどんなOSSを取り込んで、そのOSSにどんなライセンスが設定されているかを解析する必要がある。
背景技術として、プログラムリストのファイル依存関係を抽出するシステムがある(下記特許文献1を参照)。当該システムは、ビルド情報やプログラムリストの文字列を判定し、プログラムリストの関数呼び出し等におけるプログラムリスト相互間の依存関係を判定する。
特開2008−293486号公報
特許文献1のシステムは、関数の特定の呼び出し関係において、開発者が意図しない呼び出しに対する警告を行うことができない。また、特許文献1のシステムは、プログラムリスト、中間ファイル、プログラム等、プログラム開発における全てのファイルに対して依存関係を取得するものではない。
また、特許文献1のシステムは、実行時に命令文が追加、削除等の変更を行うアルゴリズムが記載されたプログラムリストには対応できない。例えば、プログラムリスト上に命令文が記載されているプログラム上の命令文を参照するためのアドレスしか記載されず、命令文を参照するプログラムがある場合、実行時にアドレスが示す先の命令文を変更することでプログラムの挙動を変更することが可能になる。したがって、当該プログラムでは、プログラムリストを検査してもアドレスの値、例えば数値しか取得できない場合、アルゴリズムを記載する命令文は検査できないことになる。
また、アドレスが指し示す先の命令文を検査するための装置および方法を実施したとしても、命令文の追加、削除等の変更の有無を検出するにすぎず、開発者が開発するプログラムリストに対して命令文の変更が、開発者が新たに開発したアルゴリズムによる命令文の変更か、開発者の意図しないアルゴリズムによる命令文の変更かを区別することはできない。
さらに、呼び出し関係におけるファイル間の属性の波及によるファイル相互の影響を判定することができないため、呼び出し関係によっては問題となるライセンス伝播や脆弱性のような検査として用いることができない。
本発明は、プログラムリスト、中間ファイル、またはプログラムのいずれかである解析対象を解析して、開発者が意図しない命令文の依存関係を検出することを目的とする。
本発明は、
本願において開示される発明の一側面となる解析装置は、プロセッサと、前記プロセッサにより実行されるプログラムを記憶する記憶デバイスと、を有し、前記記憶デバイスは、呼び出し先となる第1の命令文と、呼び出し先と呼び出し元との依存関係を規定するフィルタルールおよび呼び出し元となる第2の命令文の組み合わせであるアノテーション属性と、を対応付けた対応情報を記憶し、前記プロセッサは、プログラムリスト、中間ファイル、またはプログラムのいずれかであり、かつ、前記アノテーション属性を含む解析対象から、前記第2の命令文を検出する検出処理と、前記検出処理によって検出された前記第2の命令文と当該第2の命令文によって呼び出される呼び出し先の命令文との依存関係が、前記フィルタルールに適合するか否かを、前記対応情報を参照して判定する判定処理と、前記判定処理によって適合すると判定された判定結果に関する情報を生成する生成処理と、前記生成処理によって生成された判定結果に関する情報を出力する出力処理と、を実行することを特徴とする。
本発明の代表的な実施の形態によれば、プログラムリスト、中間ファイル、またはプログラムのいずれかである解析対象を解析して、開発者が意図しない命令文の依存関係を検出することができる。前述した以外の課題、構成及び効果は、以下の実施例の説明により明らかにされる。
本実施例に係る解析対象の解析例を示す説明図である。 解析対象間の呼び出しの依存関係例1を示す説明図である。 解析対象間の呼び出しの依存関係例2を示す説明図である。 図2および図3に示したプログラムリストの記述例を示す説明図である。 図2および図3に示した中間ファイルの記述例を示す説明図である。 解析結果例および警告例(その1)を示す説明図である。 解析結果例および警告例(その2)を示す説明図である。 解析結果例および警告例(その3)を示す説明図である。 解析装置のハードウェア構成例を示すブロック図である。 命令文情報格納テーブルの記憶内容例を示す説明図である。 インターフェース情報格納テーブルの記憶内容例を示す説明図である。 プログラム情報格納テーブルの記憶内容例を示す説明図である。 フィルタルール情報格納テーブルの記憶内容例を示す説明図である。 解析装置の機能的構成例を示すブロック図である。 解析装置の構文解析で取得される構文解析木の例を示す説明図である。 構文解析部による構文解析処理例を示すフローチャートである。 ディスパッチテーブル登録による依存関係抽出処理(ステップS1700)の詳細な処理手順例を示すフローチャートである。 構文解析木による依存関係抽出処理(ステップS1800)の詳細な処理手順例(前半)を示すフローチャートである。 構文解析木による依存関係抽出処理(ステップS1800)の詳細な処理手順例(後半)を示すフローチャートである。 生成部による解析処理例を示すフローチャートである。 図20に示した依存関係抽出処理(ステップS2006)の詳細な処理手順例を示すフローチャート1である。 図20に示した依存関係抽出処理(ステップS2006)の詳細な処理手順例を示すフローチャート2である。 図20に示した依存関係抽出処理(ステップS2006)の詳細な処理手順例を示すフローチャート3である。 実行部による解析処理の詳細な処理手順例を示すフローチャートである。 図24に示した依存関係抽出処理(ステップS2406)の詳細な処理手順例を示すフローチャート1である。 図24に示した依存関係抽出処理(ステップS2406)の詳細な処理手順例を示すフローチャート2である。 図24に示した依存関係抽出処理(ステップS2406)の詳細な処理手順例を示すフローチャート3である。 メモリマップの一例を示す説明図である。 シンボルテーブルの一例を示す説明図である。
本実施例は、プログラムリスト、中間ファイル、またはプログラム等、プログラム開発における解析対象(単に、「ファイル」と称する場合がある)について呼び出し元と呼び出し先の関係を示す依存関係を抽出して、開発者がどんなOSSを取り込んで、そのOSSにどんなライセンスが設定されているかを解析する。
<解析例>
図1は、本実施例に係る解析対象の解析例を示す説明図である。図1では、解析対象の一例としてプログラムリストを用いて説明する。(A)は、解析対象であるプログラムリストの一例を示す。(B)は、解析対象についての解析結果例を示す。(C)は、解析対象に対する警告情報例を示す。
プログラムリストにおいて、1行目にはアノテーション10([[math])が記述されている。アノテーション10は、当該アノテーション10が挿入されている行の関数14(例としてadd)に対する注釈である。したがって、関数14(add)が出現した場合には、(B)の解析においてアノテーション10が適用される。
アノテーション10の左端のカッコ11aおよび右端のカッコ11bは、アノテーション10の開始と終了を規定する記号である。記号12は、フィルタルールに対応する記号である。関数13は、フィルタルールにしたがって関数14との依存関係が規定される関数である。記号12と関数13との組み合わせにより、アノテーション10に適用される属性(以下、アノテーション属性)が定義される。
フィルタルールは、記号12と関数13との組み合わせにより規定されるアノテーション属性に応じて規定される関数である。たとえば、図1に示したフィルタルールA1()は、『math(関数13)が特定の関数(この場合は例としてadd(関数14))を呼び出す場合は呼び出し遵守となり、それ以外の関数から呼び出される場合は呼び出し違反となる』ことを規定する関数である。フィルタルールが、直接ライセンスの遵守または違反を規定する場合には、呼び出し遵守がライセンス遵守となり、呼び出し違反がライセンス違反となる。
(B)は、(A)のプログラムリストの解析結果画面102である。解析結果画面102には、解析結果120が表示される。解析結果120では、例としてプログラムリスト内の関数群をツリー構造(コールグラフ)で表現する。解析箇所121は、記述箇所111の解析結果である。関数14(add)は、関数13(math)から呼び出されている。したがって、フィルタルールA1()が適用されると、呼び出し遵守と判定される。一方、解析箇所122は、記述箇所112の解析結果である。関数14(add)は、関数(history)から呼び出されている。したがって、フィルタルールA1()が適用されると、属性違反と判定される。
(C)は、(B)の解析結果からの警告画面103である。解析箇所122が属性違反と判定されるため、その旨の内容を示す文字列である警告情報130を有する警告画面103が出力される。このように、プログラムリスト101の作成時にアノテーション10を挿入しておくことで、属性違反となる箇所を特定することができる。
<依存関係例>
図2は、解析対象間の呼び出しの依存関係例1を示す説明図である。中間ファイルはプログラムリストから生成され、プログラムは中間ファイルから生成される。プログラムリスト201〜203は、例えば、入力デバイスを用いて開発者が命令文を記載するファイルとする。プログラムリスト201〜203に記載される命令文は、例えば、構文解析処理、コード生成処理等が実行されるコンパイル処理209〜211により、命令文のアルゴリズムが変更されることなく、コンピュータが実行する命令文に変換される。
コンパイル処理209〜211により、中間ファイル204〜206が生成される。つぎに、例えばコード生成処理や参照等が実行されるリンク処理212〜215により、複数に分けられたファイルの命令文を纏める処理が行われ、中間ファイル204および中間ファイル205からプログラム207が生成される。また、中間ファイル206からプログラム208が生成される。リンク処理212,213は、例えば、中間ファイル204と中間ファイル205とを結合してプログラム207を生成するスタティックリンク処理を指す。スタティックリンク処理では、複数に分かれたファイルが一つのファイルとして結合される。リンク処理214は、例えば、中間ファイル206からプログラム208を生成するスタティックリンク処理を指す。リンク処理215は、例えば、プログラム208の起動時または実行中に、プログラム208と中間ファイル206を結合するダイナミックリンク処理を指す。
なお、図2において、プログラムリスト201〜203、中間ファイル204〜206、およびプログラム207を図示する際に、ファイル名に拡張子(「.(ドット)」以降の文字列)を記載しているが、拡張子はどのような文字列でもよく、また、拡張子はなくてもよく、解析対象のフォーマットは任意の形式でよい。さらに、また、プログラムリスト201〜203、中間ファイル204〜206、およびプログラム207に記載された命令文は必ずしも人間に対して可読なデータでなくてもよい。
図2におけるプログラムリスト201〜203、中間ファイル204〜206、およびプログラム207の相互依存関係は、コンパイル処理209〜211やリンク処理212〜214による依存関係の一例であり、開発者はコンパイル処理209〜211やリンク処理212〜214の一部または全部を省いてもよい。さらに、中間ファイル204〜206やプログラム207の命令文を開発者が入力デバイスによって直接記述して中間ファイル204〜206やプログラム207を作成してもよい。
なお、コンパイル処理の前後には、プリプロセス処理やアセンブル処理等が実行されることもある。また、プリプロセス処理、アセンブル処理、コンパイル処理209〜211、リンク処理212〜214等は、それぞれが別々のプログラムとして実装されていることもあれば、同一のプログラムの処理実装されることもある。プリプロセス処理、アセンブル処理、コンパイル処理209〜211、リンク処理212〜214等の実装の差異によるプログラムを生成する処理の過程の違いは、本実施例の技術を実施する際の実装をプリプロセス処理、アセンブル処理、コンパイル処理209〜211、リンク処理212〜214等の実装に合わせることで吸収することが可能である。
図3は、解析対象間の呼び出しの依存関係例2を示す説明図である。図3は、プログラムが呼び出すプログラムの依存関係が、プログラムの実行中に判明する場合のプログラムの実行例である。図3のプログラム301「main2.exe」は、例えば、プログラム301に記載されたアルゴリズム311の命令文312により、インターネット305、及びインターネット307を介し、Web306よりプログラムリスト302「english.c」をダウンロードする。なお、アルゴリズム311は、例として可読なデータとしたが、実際には機械語等で実装されているものとする。また、命令文312は、例えば、特定のWebに記載されたファイルをダウンロードする処理として、ダウンロードするファイルを選択する処理は行わないとする。
つぎに、命令文313により、ダウンロードしたファイルから中間ファイル303「english.obj」を、例えば、コンパイル処理308により生成し、中間ファイル303からプログラム304を、例えば、リンク処理309により生成する。つぎに、例えば、命令文314によるロード処理310により、プログラム304をプログラム301に読み込み結合する。コンパイル処理308では、構文解析処理やコード生成処理等が実行される。リンク処理309では、コード生成処理等が実行される。ロード処理310では、例えば、ローダ、ダイナミックリンカ等によってプログラムに記載された命令文の読み込み処理が行われ、プログラムの実行中にプログラム相互の命令文を結合する処理が実行される。なお、図3において、プログラムリスト302、中間ファイル303、およびプログラム301を図示する際に、ファイル名に拡張子(「.(ドット)」以降の文字列)を記載しているが、発明の実施にあたり拡張子はどのような文字列でもよく、また、拡張子はなくてもよく、ファイルのフォーマットは任意の形式でよい。
また、図2および図3において、プログラムを開発または実行する環境において、OS、CPU、メモリ、ストレージ等は、任意の構成でよい。開発者は、開発者が構築する任意の環境で動作するプログラムを開発するが、クロスプラットフォームでの開発環境や、開発環境が別のコンピュータである場合、必ずしも開発環境の構成が、プログラムの動作条件に適合していなくともよい。尚、本実施例は開発環境に依存する技術ではないため、プログラムの動作条件による開発環境の違いには依存せずに、本技術を実施することが可能である。
<解析対象の記述例>
図4は、図2および図3に示したプログラムリスト201〜203、302の記述例を示す説明図である。プログラムリスト201には、開発者が関数を記載する際のアルゴリズムとして、関数定義402、関数定義405、関数定義408、および関数定義411が記載されている。関数定義402は、関数404「add」の処理と、関数404に対して付与される属性403「[[math]」がアノテーションとして記載されている。アノテーションについては、図1に説明した通りである。
関数定義405には、関数406「math」が関数407「add」を呼び出すための命令文が記載されている。関数定義408には、関数409「history」が関数410「add」を呼び出すための命令文が記載されている。関数定義411には、関数412「main」が関数413「math」、関数414「history」、関数415「science」、および関数416「geography」を呼び出すための命令文が記載されている。
また、プログラムリスト202「science.c」には、開発者が関数を記載する際のアルゴリズムとして、関数定義418が記載されている。関数定義418には、関数419「science」が関数420「add」を呼び出すための命令文が記載されている。
また、プログラムリスト203「geography.c」には、開発者が関数を記載する際のアルゴリズムとして、関数定義422が記載されている。関数定義422には、関数423「geography」が関数424「add」を呼び出すための命令文が記載されている。
また、プログラムリスト302「english.c」には、開発者が関数を記載する際のアルゴリズムとして、関数定義426が記載されている。関数定義426には、関数427「english」が関数428「add」を呼び出すための命令文が記載されている。
図5は、図2および図3に示した中間ファイル204〜206,208,304の記述例を示す説明図である。中間ファイル204「main1.obj」には、開発者が関数を記載する際のアルゴリズムとして、関数502、関数504、関数507、および関数510が記載されている。関数502は、ラベル503「add」の命令文が記載されている。関数504には、ラベル505「math」の副プログラムが関数506「add」を呼び出すための命令文が記載されている。関数507には、ラベル508「history」の副プログラムが関数509「add」を呼び出すための命令文が記載されている。関数510には、ラベル511「main」の副プログラムが関数512「math」、関数513「history」、関数514「science」、および関数515「geography」を呼び出すための命令文が記載されている。
また、中間ファイル205「science.obj」には、関数517が記載されている。関数517には、ラベル518「science」の副プログラムが関数519「add」を呼び出すための命令文が記載されている。また、中間ファイル206「geography.obj」には、関数521が記載されている。関数521には、ラベル522「science」の副プログラムが関数523「add」を呼び出すための命令文が記載されている。
また、ライブラリであるプログラム208「geography.dll」には、関数525が記載されている。関数525には、ラベル526「geogprahy」の副プログラムが関数527「add」を呼び出すための命令文が記載されている。
また、プログラム304「english.dll」には、関数529が記載されている。関数529には、ラベル530「english」の副プログラムが関数531「add」を呼び出すための命令文が記載されている。
なお、図5では本実施例を説明する際に不要なアルゴリズム、例えば関数間の引数を受け渡すために行うスタックへの格納処理等の処理については説明の記載は省略している。また、図5の例では中間ファイルとプログラムを区別しているが、中間ファイルとプログラムには同じ機械語が記載されることもある。り、中間ファイルとプログラムを逆アセンブル処理した場合、同じ命令文の情報を得ることができる場合もあり、その場合には両者を区別しなくともよい。
<解析結果例および警告例>
図6は、解析結果例および警告例(その1)を示す説明図である。解析結果画面601は、プログラムリスト201〜203の解析結果例である。解析結果画面601は、プログラムリスト201〜203の解析結果603〜605を有する。解析結果603〜605は、コールグラフ606〜609により表現される。
解析箇所611は、図4に示した関数定義405の解析結果である。関数404(add)は、関数406(math)から呼び出されている。したがって、図1に示したフィルタルールA1()が適用されると、呼び出し遵守と判定される。一方、解析箇所612は、図4に示した関数定義408の解析結果である。関数404(add)は、関数409(history)から呼び出されている。したがって、図1に示したフィルタルールA1()が適用されると、属性違反と判定される。
警告画面620は、解析箇所611に応じた警告情報を示す出力画面である。解析箇所612が属性違反と判定されるため、その旨の内容を示す文字列である警告情報621を有する警告画面620が出力される。このように、プログラムリスト101の作成時にアノテーション10を挿入しておくことで、属性違反となる箇所を特定することができる。
図7は、解析結果例および警告例(その2)を示す説明図である。解析結果画面701は、中間ファイル204〜206の解析結果例である。解析結果画面701は、中間ファイル204〜206の解析結果702を有する。解析結果702は、コールグラフ703により表現される。
解析箇所711は、図5に示した関数504の解析結果である。関数504内の関数506(add)は、ラベル505(math)から呼び出されている。したがって、図1に示したフィルタルールA1()が適用されると、呼び出し遵守と判定される。一方、解析箇所712〜714は、図5に示した関数507,514,515の解析結果である。解析箇所712において、図5に示した関数509(add)は、ラベル508で特定される関数507(history)から呼び出されている。したがって、図1に示したフィルタルールA1()が適用されると、属性違反と判定される。
解析箇所713において、図5に示した関数519(add)は、関数517(science)から呼び出されている。したがって、図1に示したフィルタルールA1()が適用されると、属性違反と判定される。
解析箇所714において、図5に示した関数523(add)は、関数521(geography)から呼び出されている。したがって、図1に示したフィルタルールA1()が適用されると、属性違反と判定される。
警告画面720は、解析箇所712〜714に応じた警告情報を示す出力画面である。解析箇所712〜714が属性違反と判定されるため、その旨の内容を示す文字列である警告情報721を有する警告画面720が出力される。このように、プログラムリスト101の作成時にアノテーション10を挿入しておくことで、中間ファイルにおいても、属性違反となる箇所を特定することができる。
図8は、解析結果例および警告例(その3)を示す説明図である。解析結果画面801は、プログラム301の解析結果例である。解析結果画面801は、プログラム301の解析結果802を有する。解析結果802は、コールグラフ803により表現される。
解析箇所811は、図5に示した関数529の解析結果である。関数529内の関数531(add)は、関数529(english)から呼び出されている。したがって、図1に示したフィルタルールA1()が適用されると、属性違反と判定される。
警告画面820は、解析箇所811に応じた警告情報を示す出力画面である。解析箇所811が属性違反と判定されるため、その旨の内容を示す文字列である警告情報821を有する警告画面820が出力される。このように、プログラムリスト101の作成時にアノテーション10を挿入しておくことで、中間ファイルにおいても、属性違反となる箇所を特定することができる。
<解析装置のハードウェア構成例>
図9は、解析装置のハードウェア構成例を示すブロック図である。解析装置900は、プロセッサ901と、記憶デバイス902と、入力デバイス903と、出力デバイス904と、通信インターフェース(通信IF905)と、を有する。プロセッサ901、記憶デバイス902、入力デバイス903、出力デバイス904、および通信IF905は、バスにより接続される。プロセッサ901は、解析装置900を制御する。記憶デバイス902は、プロセッサ901の作業エリアとなる。また、記憶デバイス902は、各種プログラムやデータを記憶する非一時的なまたは一時的な記録媒体である。記憶デバイス902としては、たとえば、ROM(Read Only Memory)、RAM(Random Access Memory)、HDD(Hard Disk Drive)、フラッシュメモリがある。入力デバイス903は、データを入力する。入力デバイス903としては、たとえば、キーボード、マウス、タッチパネル、テンキー、スキャナがある。出力デバイス904は、データを出力する。出力デバイス904としては、たとえば、ディスプレイ、プリンタがある。通信IF905は、ネットワークと接続し、データを送受信する。
<テーブルの記憶内容例>
つぎに、解析装置900で用いられるテーブルの記憶内容例について、図10〜図13を用いて説明する。以後の説明では「テーブル」形式によって説明するが、これら情報は必ずしもテーブルによるデータ構造で表現されていなくても良く、リスト、DB、キュー等のデータ構造やそれ以外で表現されていても良い。そのため、データ構造に依存しないことを示すために「テーブル」、「リスト」、「DB」、「キュー」等について単に「情報」と呼ぶことがある。また、各情報の内容を説明する際に、「識別情報」、「識別子」、「名」、「名前」、「ID」という表現を用いることが可能であり、これらについてはお互いに置換が可能である。
図10は、命令文情報格納テーブル1000の記憶内容例を示す説明図である。命令文情報格納テーブル1000は、命令文1001とアノテーション属性1002の組み合わせである命令文情報がエントリとして生成されるテーブルである。命令文情報は、どの命令文1001にどのアノテーション属性1002が付与されているかを示す情報である。
命令文1001は、値として、「add」などの関数を格納するフィールドである。アノテーション属性1002は、値として、アノテーションとして規定された属性を格納するフィールドである。図1に示したアノテーション10を例に挙げると、命令文1001の値「add」に対して、アノテーション属性1002の値「[math」が対応付けられる。
図11は、インターフェース情報格納テーブル1100の記憶内容例を示す説明図である。インターフェース情報格納テーブル1100は、インターフェース1101と属性1102の組み合わせであるインターフェース情報をエントリとしてあらかじめ用意されるテーブルである。インターフェース情報は、どのインターフェース1101にどの属性1102が付与されているかを示す情報である。
インターフェース1101は、値として、命令文またモジュールを格納するフィールドである。具体的には、たとえば、変数、マクロ、テンプレート、関数、クラス、構造体、インライン展開、プロトタイプ宣言、仮想関数等の高級言語の命令文が格納される。また、ニーモニック等の高級言語以外の命令文が格納される。また、アプリケーションやライブラリのファイル名といった、任意の解析対象の実行に必要な命令文やモジュールが格納される。
たとえば、エントリ1111のインターフェース1101の値は「add」であり、属性1102の値は「GPLv3」である。このエントリ1111は、関数「add」は、「GPLv3」に適用可能であることを示す。また、エントリ1112のインターフェース1101の値は「english」であり、属性1102の値は「Vulnerable」(脆弱性)である。このエントリ1112は、関数「english」は、「Vulnerable」(脆弱性)であることを示す。
図12は、プログラム情報格納テーブル1200の記憶内容例を示す説明図である。プログラム情報格納テーブル1200は、呼び出し元1201と参照物1202と呼び出し形態1203の組み合わせがエントリとして生成されるテーブルである。プログラム情報は、どの呼び出し元1201がどのような呼び出し形態1203でどの参照物1202を参照するかを示す情報である。
呼び出し元1201は、値として、参照物1202を呼び出すファイル(たとえば、プログラムや中間ファイル)の位置を示す情報を格納するフィールドである。たとえば、エントリ1211の呼び出し元1201の値は、プログラムである「main1.exe」の位置を示す情報「/home/main1.exe」である。
参照物1202は、値として、呼び出し元1201から呼び出されるファイル(たとえば、プログラムリストや中間ファイル)の位置情報を格納するフィールドである。たとえば、エントリ1211の参照物1202の値は、中間ファイルである「geography.dll」の位置を示す情報「/home/geography.dll」である。
呼び出し形態1203は、値として、呼び出し元1201が参照物1202を呼び出す場合のタイミングを格納するフィールドである。たとえば、エントリ1211の呼び出し形態1203の値は、「実行時の構成要素」である。
ここで、エントリ1211〜1214について具体的に説明する。エントリ1211は、呼び出し元1201の値「/home/main1.exe」で特定される呼び出し元「main1.exe」が、呼び出し形態1203の値「実行時の構成要素」として参照物1202の値「/home/geography.dll」で特定される参照物「geography.dll」を呼び出すプログラム情報である。「実行時の構成要素」とは、例えば、参照物が呼び出し元の起動時に参照されるファイルであることを示す呼び出し形態である。
エントリ1212は、呼び出し元1201の値「/home/main2.exe」で特定される呼び出し元「main2.exe」が、呼び出し形態1203の値「実行時の読み込み要素」として参照物1202の値「/download/English.dll」で特定される参照物「English.dll」を呼び出すプログラム情報である。「実行時の読み込み要素」とは、例えば、参照物が呼び出し元の実行中に参照されるファイルであることを示す呼び出し形態である。
エントリ1213は、呼び出し元1201の値「/home/main1.exe」で特定される呼び出し元「main1.exe」が、呼び出し形態1203の値「コード生成時の構成要素」として参照物1202の値「/home/main1.obj」で特定される参照物「main1.obj」を呼び出すプログラム情報である。「コード生成時の構成要素」とは、例えば、参照物がコード生成時に参照されるファイルであることを示す呼び出し形態である。
エントリ1214は、呼び出し元1507の値「/home/main1.exe」で特定される呼び出し元「main1.exe」が、呼び出し形態1203の値「構文解析時の構成要素」として参照物1202の値「/home/main1.c」で特定される参照物「main1.c」を呼び出すプログラム情報である。「構文解析時の構成要素」とは、例えば、参照物が構文解析時に参照されるファイルであることを示す呼び出し形態である。
図13は、フィルタルール情報格納テーブル1300の記憶内容例を示す説明図である。フィルタルール情報格納テーブル1300は、属性1301とフィルタルール1302の組み合わせであるフィルタルール情報をエントリとしてあらかじめ用意されるテーブルである。フィルタルール情報は、どのフィルタルール1302がどの属性1301に適用されるかを示す情報である。
属性1301は、値として、フィルタルール1302を特定する文字列を格納するフィールドである。属性1301の値は、解析対象から検出される。フィルタルール1302は、値として、属性1301の値が解析対象から検出された場合に呼び出される関数を格納するフィールドである。フィルタルール1302の値である関数は、あらかじめ定義される。具体的には、たとえば、フィルタルール1302は、属性1301の値が付与されている命令文情報格納テーブル1000の命令文情報やインターフェース情報格納テーブル1600のインターフェース情報の検査を行う関数である。フィルタルール1302の値としては、例えば、関数ポインタのアドレス、関数名、またはシンボル情報が格納される。
フィルタルール1302による処理では、例えば、命令文1001やインターフェース1101に付与された属性1002,1102に対する呼び出し違反の検出や、命令文1001やインターフェース1101に付与された属性1002,1102の波及の検出が実行される。
呼び出し違反の検出とは、例えば、命令文B(たとえば、「add」)の呼び出しだけを許可するアノテーション属性a(たとえば、「[math」)が命令文A(たとえば、「math」)に付与されている場合、命令文Aが命令文C(たとえば、「history」)を呼び出している場合に属性違反として検出する処理である。例えば、開発者が意図しない命令文の呼び出しが行われるのを禁止するために利用される。
属性の波及の検出とは、例えば、命令文A(たとえば、「math」)が命令文B(たとえば、「add」)を呼び出していた場合、命令文Bに付与されている属性b(たとえば、アノテーションの属性「GPLv3」)が命令文Aにも付与されると推定する処理である。例えば、ライセンス伝播や脆弱性の影響範囲の検出を行うために利用される。
なお、フィルタルール1302の値である関数は、同一関数であってアルゴリズムが異なるため、後述するディスパッチテーブル登録による依存関係抽出処理(ステップS1700)と、構文解析木による依存関係抽出処理(ステップS1800)とで、別々に用意される。
<解析装置900の機能的構成例>
図14は、解析装置900の機能的構成例を示すブロック図である。解析装置900は、構文解析部1401と、生成部と、実行部1403と、を含む構成である。構文解析部1401、生成部、および実行部1403は、具体的には、たとえば、図9に示したプロセッサに、記憶デバイスに記憶された解析プログラムを実行させることによりその機能を実現する。構文解析部1401は、プログラムリストについて後述する図16〜図19に示す処理を実行して、プログラムリストから中間ファイルを生成する。また、構文解析部1401は、解析結果として図6に示した情報を生成して出力する。生成部は、中間ファイルについて後述する図20〜図23に示す処理を実行して、プログラム(実行ファイル)を生成する。また、生成部は、解析結果として図7に示した情報を生成して出力する。実行部1403は、プログラム(実行ファイル)について後述する図24〜図27に示す処理を実行する。また、実行部1403は、解析結果として図8に示した情報を生成して出力する。実行部1403は、たとえば、プロセッサ901がプログラム(実行ファイル)を実行するプロセスに相当する。
<構文解析木>
図15は、解析装置900の構文解析で取得される構文解析木の例を示す説明図である。図15では、例として3個の構文解析木1501〜1503について説明する。構文解析木1501は、図4に示したプログラムリスト201の関数定義411に対応する構文解析木である。構文解析木1502は、図4に示したプログラムリスト201の関数定義402に対応する構文解析木である。構文解析木1503は、図4に示したプログラムリスト201の関数定義405に対応する構文解析木である。
構文解析木1501は、根ノード1510からの枝となるノード1511〜1513を有する。ノード1511〜1513は、「int」型(ノード1511)の関数「main」(ノード1512)のアルゴリズムをノード1513から伸びる枝で定義する。すなわち、ノード1513は、関数412「main」のブロックである関数定義411の「{}」の中身を指している。
ノード1513からの枝のうち、例えば、ノード1514は、関数413「math」、ノード1515は実引数「1」、およびノード1516は実引数「2」を指している。ノード1514〜1516は、関数413「math」が「1」、「2」を引数として受け取り呼び出されるということを意味している。このような構文解析木1501を探索すると、関数412「main」が呼び出す関数は、関数413「math」、関数414「history」、関数415「science」、および関数416「geography」であることがわかる。
同様にして、構文解析木1502は、根ノード1520からの枝であるノード1521により、「int」型の関数404「add」が定義されていることを意味する。また、ノード1522「*var*」は変数定義を意味しており、ノード1523およびノード1524の並びにより、「int」型(ノード1524)の変数「a」(ノード1523)を仮引数(ノード1522)が定義されていることを表す。また同様にして、構文解析木1502には、「int」型の変数「b」が仮引数として定義されている。
また、ノード1526から伸びた枝であるノード1525の「return」と、ノード1526から伸びた枝であるノード1527の「+」演算子、ノード1528の変数「a」、およびノード1529の変数「b」により、関数404「add」(ノード1521)は、変数「a」(ノード1528)と変数「b」(ノード1529)を「+」演算(ノード1527)した値を「return」(ノード1525)していることを意味する。
構文解析木1502の探索により、関数定義402で規定される「int」型の関数404「add」(ノード1521)は、別の関数の呼び出しを行っていないことがわかる。
同様にして、構文解析木1503は、根ノード1530からの枝であるノード1531で「int」型の関数406「math」を定義している。また、ノード1532の関数404「add」、ノード1533の変数「c」、およびノード1534の変数「d」の並びは、関数404「add」の実引数に変数「c」および変数「d」を渡し、関数404「add」を呼び出すということを意味する。構文解析木1503の探索により、関数定義405で規定される関数406「math」(ノード1531)は、関数407「add」(ノード1532)を呼び出していることがわかる。
なお、構文解析木1501〜1503をどのように探索かはコンパイラの実装によるため、コンパイラに都合のよい構文解析木を取得することにより、構文解析木1501〜1503の探索が実行される。
<構文解析部1401による構文解析処理例>
つぎに、構文解析部1401による構文解析処理例について説明する。構文解析部1401による構文解析処理では、解析対象としてプログラムリストを解析することにより、プログラムリストを構文解析する処理である。
図16は、構文解析部1401による構文解析処理例を示すフローチャートである。構文解析部1401は、ユーザ操作によるプログラムリストのファイルをオープンする(ステップS1601)。つぎに、構文解析部1401は、オープンしたファイルの情報をメモリに記憶する(ステップS1602)。そして、構文解析部1401は、インターフェース情報格納テーブル1100を用いてプログラムリストから属性1102を検索する(ステップS1603)。
つぎに、構文解析部1401は、フィルタルール情報格納テーブル1300から、検索した属性1102に一致する属性1301と、当該属性1301に対応するフィルタルール1302との組み合わせであるエントリ(フィルタルール情報)を取得する(ステップS1604)。
つぎに、構文解析部1401は、プログラムリストに記載された命令文を命令文情報格納テーブル1000の命令文1001に、プログラムリストに記載された命令文に対応するアノテーション属性を命令文情報格納テーブル1000のアノテーション属性1002に格納する(ステップS1605)。なお、ステップS1605の処理では、プログラムリストに記載された命令文と当該命令文に対応するアノテーション属性を検索するために、例えば、構文解析部1401は、プログラムリストを変換する前準備として行うプリプロセス処理における情報を監視してもよい。例えば、構文解析部1401は、では、プログラムリストに記載された命令文の変換処理を行う前に、命令文の展開を行う等のプリプロセス処理を動作させることがある。
このプリプロセス処理を監視することで、プログラムリストに記載された命令文と命令文に対応するアノテーション属性の組み合わせである命令文情報を取得することができる。なお、必ずしもステップS1005において命令文情報格納テーブル1000に対して格納処理を行う必要はなく、例えば、コンパイル処理等が該当する構文解析処理を監視することで、構文解析部1401は、同様の情報を取得して命令文情報格納テーブル1000に格納してもよい。なお、プリプロセス処理やコンパイル処理といった具体的な処理は構文解析部1401の実装に依存する。したがって、プログラムリストに記載された命令文と当該命令文に対応するアノテーション属性を検索する処理は、構文解析部1401の実装に合わせて適用される。
このあと、構文解析部1401は、プログラムリストの探索開始位置を探索して(ステップS1606)、依存関係抽出処理を実行する(ステップS1607)。依存関係抽出処理(ステップS1607)は2種類ある。1つは、ディスパッチテーブル登録による依存関係抽出処理(ステップS1700)であり、もう1つは、構文解析木による依存関係抽出処理(ステップS1800)である。いずれかの一方の抽出処理があらかじめ設定される。
ディスパッチテーブル登録による依存関係抽出処理(ステップS1700)では、構文解析部1401がプログラムリストを構文解析しつつ依存関係の抽出を実行するため、構文解析木を生成する必要がない。したがって、依存関係抽出処理(ステップS1607)の処理速度の向上を図ることができる。
また、構文解析木による依存関係抽出処理(ステップS1800)では、構文解析部1401が、依存関係抽出に先立って構文解析木を生成し、依存関係の抽出に構文解析木を用いる。構文解析木を用いることにより、プログラムリストに記載される命令文の記述の違いを吸収することができる。なお、記述の違いとは、例えば、関数定義402において属性403と関数404の間にスペースや改行コードが任意の数だけ挿入されている等、命令文のアルゴリズムに影響を与えない文字列の違いをいう。
ディスパッチテーブル登録による依存関係抽出処理(ステップS1700)については図17で説明する。構文解析木による依存関係抽出処理(ステップS1800)については、図18および図19で説明する。
依存関係抽出処理(ステップS1607)のあと、構文解析部1401は、依存関係抽出処理(ステップS1607)でのコンパイル(ステップS1908)で得られる中間ファイルを保存する(ステップS1608)。そして、構文解析部1401は、プログラム情報格納テーブル1200に、ステップS1608で保存された中間ファイルのプログラム情報を格納する(ステップS1609)。ステップS1609では、例えば、構文解析部1401は、ステップS1608で保存された中間ファイルへのファイルパスをプログラム情報格納テーブル1200の呼び出し元1201に格納し、ステップS1602で記憶したファイルのファイルパスを参照物1202に格納する。これにより変換前後のプログラムリストと中間ファイルの格納場所を対応付けることができる。
そして、ディスパッチテーブル登録による依存関係抽出処理(ステップS1700)の場合は、構文解析部1401は、「ディスパッチテーブル登録による構文解析時の構成要素」という文字列を呼び出し形態1203に格納する。構文解析木による依存関係抽出処理の場合は、構文解析部1401は、「構文解析木による構文解析時の構成要素」という文字列を呼び出し形態1203に格納する。これにより、プログラム情報がプログラム情報格納テーブル1200に格納される。
そして、構文解析部1401は、構文解析結果を生成して出力する(ステップS1610)。構文解析結果とは、たとえば、図6に示した解析結果画面601である。また、属性違反がある場合には警告画面620を出力してもよい。
<ディスパッチテーブル登録による依存関係抽出処理(ステップS1700)>
図17は、ディスパッチテーブル登録による依存関係抽出処理(ステップS1700)の詳細な処理手順例を示すフローチャートである。ディスパッチテーブル登録による依存関係抽出処理(ステップS1700)は、図16に示した依存関係抽出処理(ステップS1607)で実行される処理である。
まず、構文解析部1401は、S1604で取得したフィルタルール情報をディスパッチテーブルに登録する(ステップS1701)。S1604で取得したフィルタルール情報は、特定の属性を検出した際に呼び出すフィルタルールを含む。次に、構文解析部1401は、プログラムリストの先頭行を取得し(ステップS1702)、プログラムリストの終端であるかを判定する(ステップS1703)。プログラムリストの終端でない場合(ステップS1703:No)、構文解析部1401は、取得した行が命令文の呼び出しをする関数を含むか否かを判定する(ステップS1704)。命令文の呼び出しをする関数を含まない場合(ステップS1704:No)、構文解析部1401は、次の行を取得し(ステップS1705)、ステップS1703に戻る。
命令文の呼び出しである場合(ステップS1704:Yes)、構文解析部1401は、命令文に未だ取得していないアノテーションが付与されているかを判定する(ステップS1706)。具体的には、たとえば、構文解析部1401は、当該命令文がアノテーション属性1002に含まれる関数(たとえば、図1の関数13)に該当するか否かを判定する。命令文に未だ取得していないアノテーションが付与されていない場合(ステップS1706:No)、構文解析部1401は、次の行を取得し(ステップS1705)、ステップS1703に戻る。
命令文に未だ取得していないアノテーションが付与されている場合(ステップS1706:Yes)、構文解析部1401は、当該アノテーションを取得する(ステップS1707)。つぎに、構文解析部1401は、取得したアノテーションに対応するフィルタルールがディスパッチテーブルに登録されているかを判定する(ステップS1708)。登録されていない場合(ステップS1708:No)、ステップS1706に戻る。
一方、登録されている場合(ステップS1708:Yes)、構文解析部1401は、取得したアノテーションに対応するフィルタルールによる処理を実行する(ステップS1709)。フィルタルールによる処理を実行した結果、構文解析部1401は、取得した命令文がフィルタルールに適合するか否かを判定する(ステップS1710)。具体的には、構文解析部1401は、フィルタルールが属性違反を検出する関数であれば、属性違反であるか否かを判定し、フィルタルールが属性波及を検出する関数であれば、属性波及であるか否かを判定する。属性違反であったり属性波及である場合は、フィルタルールに適合することになる。
フィルタルールに適合する場合(ステップS1710:Yes)、構文解析部1401は、フィルタルールに応じた制御処理を実行して(ステップS1711)、ステップS1706に戻る。ここで、フィルタルールに応じた制御処理とは、たとえば、フィルタルールが属性違反を検出する関数である場合、取得した命令文を、属性を遵守する命令文に置き換える処理となる。
たとえば、図1の記述箇所112における「int history (int e,int f)」は、フィルタルールA()の実行により、属性違反と判定される。したがって、構文解析部1401は、「int history (int e,int f)」の命令文「history」を、属性を遵守する命令文「math」に置き換える。
また、必ずしも命令文の置き換えを実行する必要はなく、構文解析部1401は、警告画面103を生成して、ステップS1609で警告画面103を出力することとしてもよい。また、図示はしないが、構文解析部1401は、ステップS1711において、上記置き換えを実行し、さらに、命令文「history」から属性を遵守する命令文「math」に置き換えた旨を示す確認画面を生成して、ステップS1609で確認画面を出力することとしてもよい。
また、フィルタルールが属性波及を検出する関数である場合、フィルタルールに応じた制御処理は、取得した命令文の属性が他の命令文に波及していることを示す警告画面を生成する処理となる。警告画面は、ステップS1609で出力される。
このあと、構文解析部1401は、命令文をコンパイルして(ステップS1712)、ステップS1706に戻る。また、ステップS1703において、プログラムリストの終端である場合(ステップS1703:Yes)、構文解析部1401は、ディスパッチテーブル登録による依存関係抽出処理(ステップS1700)を終了し、プログラムリストを保存する(ステップS1607)。
<構文解析木による依存関係抽出処理(ステップS1800)>
図18は、構文解析木による依存関係抽出処理(ステップS1800)の詳細な処理手順例(前半)を示すフローチャートである。構文解析木による依存関係抽出処理(ステップS1800)は、図16に示した依存関係抽出処理(ステップS1607)で実行される処理である。なお、構文解析木による依存関係抽出処理(ステップS1800)では、スタックAとカウンタBを用いる。スタックAには、命令文がプッシュされる。カウンタBは、スタックAに命令文がプッシュされた回数を計数する。スタックAの初期状態は空であり、カウンタBの初期値は0である。尚、データを保存するのに、必ずしもスタックである必要はなく、ヒープまたは静的なメモリ確保によるオンメモリでの処理を行う方法や、ファイルとして出力して保持して処理を行う方法を用いてもよい。
まず、構文解析部1401は、構文解析を実行する(ステップS1801)。つぎに、構文解析部1401は、構文解析結果として構文解析木が取得できるか否かを判定する(ステップS1802)。取得できない場合(ステップS1802:No)、構文解析木がないため、構文解析部1401は、構文解析木による依存関係抽出処理(ステップS1800)を終了し、プログラムリストを保存する(ステップS1607)。
一方、取得できる場合(ステップS1802:Yes)、構文解析木を取得する(ステップS1803)。つぎに、構文解析部1401は、内部カウンタBの値を0にセットし(ステップS1804)、構文解析木に未訪問ノードが存在するか否かを判定する(ステップS1805)。未訪問ノードとは、構文解析木の探索において、未探索のノードをいう。未訪問ノードが存在しない場合(ステップS1805:No)、構文解析部1401は、カウンタBの値の回数分、スタックAをポップすることにより廃棄する(ステップS1805)。そして、ステップS1802に戻り、構文解析部1401は、次の構文解析木の取得を試行する(ステップS1802)。
未訪問ノードが存在する場合(ステップS1805:Yes)、構文解析部1401は、未訪問ノードを探索する(ステップS1806)。つぎに、構文解析部1401は、未訪問ノードに隣接ノードが存在するか否かを判定する(ステップS1807)。隣接ノードとは、未訪問ノードと同一階層の未訪問ノードである。たとえば、図15の構造解析木1501において、ノード1511〜1513が未訪問ノードである場合、ノード1511,1512,1513の順に探索される。未訪問ノードが探索された場合、訪問済みとなるため、隣接ノードに該当しない。
たとえば、未訪問ノードがノード1511である場合、ノード1512,1513は未訪問ノードであるため、隣接ノードとなる。ノード1512,1513が探索された場合、すでに訪問済みであるため、未訪問ノードとして探索されない。
隣接ノードが存在しない場合(ステップS1808:No)、ステップS1810に移行する。一方、隣接ノードが存在する場合(ステップS1808:Yes)、構文解析部1401は、隣接ノードを取得する(ステップS1808)。つぎに、構文解析部1401は、ノードの並びが命令文の定義を示す並びであるか否かを判定する(ステップS1809)。たとえば、ノードの並びが、型、命令文の順である場合は、命令文の定義に該当する。たとえば、ノード1511〜1513の並びは、命令文の定義に該当する。また、ノードの並びが命令文、引数の順である場合も、命令文の定義に該当する。たとえば、ノード1514〜1516の並びは、命令文の定義に該当する。一方、先頭に変数定義「*var*」がある場合は、命令文の定義に該当しない。たとえば、ノード1522〜1524の並びは、命令文の定義に該当しない。
命令文の定義を示すノードの並びでない場合(ステップS1810:No)、ステップS1805に戻る。一方、命令文の定義を示すノードの並びである場合(ステップS1810:Yes)、構文解析部1401は、命令文の定義に該当した命令文をスタックAにプッシュして(ステップS1811)。カウンタBをインクリメントする(ステップS1812)。そして、図19のステップS1901に移行する。
図19は、構文解析木による依存関係抽出処理(ステップS1800)の詳細な処理手順例(後半)を示すフローチャートである。構文解析部1401は、カウンタBのインクリメント(ステップS1812)のあと、スタックAにプッシュした命令文をキーとして、命令文情報格納テーブル1000からアノテーション属性1002を検索するとともに、インターフェース情報格納テーブル1100から属性1102を検索する(ステップS1901)。
そして、構文解析部1401は、検索したアノテーション属性1002に含まれる属性と検索した属性1102とが一致するか否かを判断する(ステップS1902)。不一致である場合(ステップS1902:No)、ステップS1908に移行する。一方、一致する場合(ステップS1902:Yes)、構文解析部1401は、一致した属性1102をキーとして、フィルタルール情報格納テーブル1300から対応するフィルタルール1302を検索する(ステップS1903)。
フィルタルールが検索できなかった場合(ステップS1904:No)、ステップS1908に移行する。一方、フィルタルールが検索できた場合(ステップS1904:Yes)、構文解析部1401は、検索されたフィルタルールによる処理を実行する(ステップS1905)。ステップS1905では、構文解析部1401は、スタックAに格納された全命令文の呼び出し関係を判定する。フィルタルールによる処理を実行した結果、構文解析部1401は、取得した命令文がフィルタルールに適合するか否かを判定する(ステップS1906)。
具体的には、構文解析部1401は、フィルタルールが属性違反を検出する関数であれば、属性違反であるか否かを判定し、フィルタルールが属性波及を検出する関数であれば、属性波及であるか否かを判定する。属性違反であったり属性波及である場合は、フィルタルールに適合することになる。
フィルタルールに適合しない場合(ステップS1906:No)、ステップS1908に移行する。一方、フィルタルールに適合する場合(ステップS1906:Yes)、構文解析部1401は、フィルタルールに応じた制御処理を実行する(ステップS1907)。ここで、フィルタルールに応じた制御処理については、図17のS1711で説明した内容と同一であるため、説明を省略する。そして、ステップS1908に移行する。ステップS1908では、構文解析部1401は、キーにした命令文をコンパイルして(ステップS1908)、図18のS1805に戻る。
なお、本例では、構文解析木に深さ優先探索アルゴリズムを用いたり隣接ノードの並びの解釈が図15のような構文解析木となることを前提で説明しているが、構文解析や構文解析木の探索アルゴリズムは、コンパイルに合わせて実装される。なお、字句解析、構文解析、および意味解析は、1つの処理として実装してもよいし、各々の解析は実装によって省略することも可能である。また、各々の解析の間にコンパイルによる独自の処理が付加されてもよく、また、各々の処理を分離したプログラムとしてもよい。
また、本例では構文解析は上昇型や下降型等、どのような方式による構文解析でもよい。構文解析の結果として得られる構文解析木は、解析木、構文木、抽象構文等、どのような構造でもよい。また、データ構造として保持する場合も、例えば、リスト構造等が考えられるが、どのようなデータ構造でもよいし、データ構造として保持せず構文解析の結果を構文解析中にパイプ処理等を用いて受け渡してもよい。すなわち、コンパイルに都合のよいデータとして保持すればよい。
また、構文解析のノード探索方法は、幅優先探索で説明したが、構文解析木を探索できる方法で例えば、深さ優先探索等、どのような方式で実装してもよい。また、構文解析木は、本フローチャートの例では、関数定義ごとに取得していたが、プログラム構造全てを一つの構文木として纏めてもよく、コンパイルに都合のよい構文木を用いればよい。構文解析、および構文解析木の探索が無限ループに陥らないよう、実装には無限ループを取り除く処理をいれてもよい。
<生成部1402による解析処理例>
つぎに、生成部1402による解析処理例について説明する。生成部1402による解析処理では、解析対象として、プログラムリスト201〜203をコンパイルしたオブジェクトコードなどの中間ファイル204〜206やDLLなどリンク相手となるプログラム208,304を解析する処理である。生成部1402による解析処理例において、特に断りがない限り、「中間ファイル」には、リンク相手のプログラムが含まれる。
図20は、生成部1402による解析処理例を示すフローチャートである。生成部1402は、ユーザ操作により中間ファイルをオープンする(ステップS2001)。つぎに、生成部1402は、オープンした中間ファイルの情報をメモリに記憶する(ステップS2002)。そして、生成部1402は、インターフェース情報格納テーブル1100を用いて中間ファイルから属性1102を検索する(ステップS2003)。
つぎに、生成部1402は、フィルタルール情報格納テーブル1300から、検索した属性1102に一致する属性1301と、当該属性1301に対応するフィルタルール1302との組み合わせであるエントリ(フィルタルール情報)を取得する(ステップS2004)。そして、生成部1402は、中間ファイルの探索開始位置を探索して(ステップS2005)、依存関係抽出処理を実行する(ステップS2006)。依存関係抽出処理(ステップS2006)については図21〜図23で説明する。
依存関係抽出処理(ステップS2006)のあと、生成部1402は、依存関係抽出処理(ステップS2006)のリンク処理(ステップS2305)で得られるプログラム(実行ファイル)を保存する(ステップS2007)。そして、生成部1402は、プログラム情報格納テーブル1200に、ステップS2007で保存された中間ファイルのプログラム情報を格納する(ステップS2008)。ステップS2008では、例えば、生成部1402は、ステップS2007で保存された中間ファイルのファイルパスをプログラム情報格納テーブル1200の呼び出し元1201に格納し、ステップS2002で記憶したファイルのファイルパスを参照物1202に格納する。これにより変換前後の中間ファイルとプログラム(実行ファイル)の格納場所を対応付けることができる。
そして、生成部1402は、「コード生成時の構成要素」という文字列を呼び出し形態1203に格納する(ステップS2009)。これにより、プログラム情報がプログラム情報格納テーブル1200に格納される。そして、生成部1402は、構文解析結果を生成して出力する(ステップS2010)。構文解析結果とは、たとえば、図7に示した解析結果画面701である。また、属性違反がある場合には警告画面720を出力してもよい。
<依存関係抽出処理(ステップS2006)>
図21〜図23は、図20に示した依存関係抽出処理(ステップS2006)の詳細な処理手順例を示すフローチャート1〜3である。依存関係抽出処理(ステップS2006)では、生成部1402は、中間ファイル204〜206からリンク処理などによってプログラム207,208を生成する際に、中間ファイル204〜206における依存関係を抽出する。なお、プログラム207,208の生成後に解析する場合、本実施例においては説明の行いやすさからプログラム207,208に対して逆アセンブルを行い、人間に可読なニーモニックに変換してから構文解析を行ってもよい。しかし、実際には必ずしも逆アセンブルの処理は必要なく、アセンブル言語は機械語と一対一対応であるから、本質的には機械語に対してそのまま適用してもよい。生成部1402の仕様に合わせてコード生成処理は実装される。
また、依存関係抽出処理(ステップS2006)において、データを保存する方法としてスタックが用いられるが、必ずしもスタックである必要はなく、ヒープまたは静的なメモリ確保によるオンメモリでの処理を行う方法や、ファイルとして出力して保持して処理を行う方法を用いてもよい。
まず、図21において、生成部1402は、変数Vに文字列「main」をセットし(ステップS2101)、中間ファイルの先頭行を取得する(ステップS2102)。たとえば、図5に示した中間ファイル204の場合、生成部1402は、先頭行の関数502のラベル503(add)を取得する。
つぎに、生成部1402は、取得した行がコードの終端であるかを判定する(ステップS2103)。取得した行がコードの終端である場合(ステップS2103:Yes)、生成部1402は、依存関係抽出処理を終了する。
一方、取得した行がコードの終端でない場合(ステップS2103:No)、生成部1402は、取得した行が、変数Vが示すラベルの開始アドレスかを判定する(ステップS2104)。上記の場合、取得した行は、関数502の行であるため、ラベル503は「add」である。変数Vは「main」であるため、取得した行が関数510の「main」が存在する行となるまで(ステップS2104:No)、生成部1402は次の行を取得し(ステップS2105)、ステップS2103に戻る。
一方、取得した行が、変数Vの示すラベルの開始アドレスの場合(ステップS2104:Yes)、生成部1402は、変数Vに格納された文字列をスタックSにプッシュし(ステップS2106)、次の行を取得する(ステップS2107)。ここまでの処理で、「main」の先頭が参照されている状態となる。なお、プログラムの開始地点が見つかればよいので、「main」は中間ファイルのスタート地点のラベル名にあわせて変更してもよい。
つぎに、生成部1402は、取得した行がコードの終端であるかを判定し(ステップS2108)、コードの終端である場合(ステップS2108:Yes)、生成部1402は、依存関係抽出処理を終了する。一方、コードの終端でない場合(ステップS2108:No)、生成部1402は、ラベルの終端であるかを判定する(ステップS2109)、ラベルの終端である場合(ステップS2109:Yes)、ステップS2103に戻る。
ラベルの終端でない場合(ステップS2109:No)、生成部1402は、ステップS2107で取得した行がニーモニックであるかを判定する(ステップS2110)。生成部1402は、例えば、取得した行にアドレス番号が存在すれば、ニーモニックであると判定する。
ニーモニックでない場合(ステップS2110:No)、生成部1402は、次の行を取得する(ステップS2111)。これにより、例えば、中間ファイル501,516,520や中間ファイルのリンク相手となるプログラム524,528の中に記載されているコメントアウト等のテキストを読み飛ばすことが可能となる。ニーモニックである場合(ステップS2110:Yes)、生成部1402は、取得した行からオペコードを取得する(ステップS2112)。このあと、図22のステップS2201に移行する。
図22において、生成部1402は、ステップS2112で取得したオペコードがリターン命令であるかを判定する(ステップS2201)。リターン命令でない場合(ステップS2201:No)、ステップS2204に移る。リターン命令である場合(ステップS2201:Yes)、生成部1402は、スタックSから文字列を1つポップし(ステップS2202)、ポップして取得した文字列を変数Vにセットして(ステップS2203)、ステップS2102に戻る。
ステップS2112で取得したオペコードがリターン命令でない場合(ステップS2201:No)、生成部1402は、取得したオペコードが呼び出し命令であるかを判定する(ステップS2204)。呼び出し命令でない場合(ステップS2204:No)、図21のステップS2107に戻って、生成部1402は、次の行を取得する(ステップS2107)。
ステップS2112で取得したオペコードが呼び出し命令である場合(ステップS2204:Yes)、生成部1402は、取得した行に、取得したオペコードに対応するオペランドが存在するか否かを判定する(ステップS2205)。オペランドが存在しない場合(ステップS2205:No)、図21のステップS2107に戻って、生成部1402は、次の行を取得する(ステップS2107)。
オペランドが存在する場合(ステップS2205:Yes)、生成部1402は、オペランドがラベル名を参照するアドレスとなっているかを判定する(ステップS2206)。オペランドがラベル名を参照するアドレスとなっていない場合(ステップS2206:No)、図21のステップS2107に戻って、生成部1402は、次の行を取得する(ステップS2107)。
オペランドがラベル名を参照するアドレスとなっている場合(ステップS2206)、生成部1402は、ラベル名を文字列として、変数Vにセットする(ステップS2207)。つぎに、生成部1402は、変数Vにセットされたラベル名をキーとし、命令文情報格納テーブル1000から、キーであるラベル名に一致する命令文1001に対応するアノテーション属性1002を検索するとともに、インターフェース情報格納テーブル1100から、キーであるラベル名に一致するインターフェース1101に対応する属性1102を検索する(ステップS2208)。
生成部1402は、検索したアノテーション属性1002に含まれる属性と検索した属性1102とが一致するか否かを判断する(ステップS2209)。不一致である場合(ステップS2209:No)、図21のステップS2102に戻る。一方、一致する場合(ステップS2209:Yes)、生成部1402は、一致した属性1102をキーとして、フィルタルール情報格納テーブル1300から、対応するフィルタルール1302を検索する(ステップS2210)。そして、図23のステップS2301に移行する。
図23において、生成部1402は、検索できたか否か判断する(ステップS2301)。検索できなかった場合(ステップS2301:No)、ステップS2305に移行する。検索できた場合(ステップS2301:Yes)、生成部1402は、検索されたフィルタルールによる処理を実行する(ステップS2302)。ステップS2302では、生成部1402は、スタックSに格納された全命令文の呼び出し関係を判定する。フィルタルールによる処理を実行した結果、構文解析部1401は、取得した命令文がフィルタルールに適合するか否かを判定する(ステップS2303)。
具体的には、生成部1402は、フィルタルールが属性違反を検出する関数であれば、属性違反であるか否かを判定し、フィルタルールが属性波及を検出する関数であれば、属性波及であるか否かを判定する。属性違反であったり属性波及である場合は、フィルタルールに適合することになる。
フィルタルールに適合しない場合(ステップS2303:No)、ステップS2305に移行する。一方、フィルタルールに適合する場合(ステップS2303:Yes)、生成部1402は、フィルタルールに応じた制御処理を実行する(ステップS2304)。ここで、フィルタルールに応じた制御処理については、図17のS1711で説明した内容と同一であるため、説明を省略する。そして、生成部1402は、変数Vにセットされたラベル名についてリンク処理をして(ステップS2305)、図21のステップS2102に戻る。
なお、依存関係抽出処理(ステップS2006)は、構文解析部1401や生成部1402の実装に都合のよいように合わせて処理を変更してもよい。たとえば、命令文の呼び出し関係をアセンブラ言語の主プログラム、副プログラムの関係をもとに説明したが、本実施例では呼び出し命令のトレースができれば、アセンブラ言語にかぎらず機械語、バイトコード等のどのようなコードの呼び出し関係をトレースする実装でもよい。
<実行部1403による解析処理例>
つぎに、実行部1403による解析処理例について説明する。実行部1403による解析処理では、解析対象として、プログラム207、301を解析する処理である。データを保存する方法としてスタックが用いられるが、必ずしもスタックである必要はなく、ヒープまたは静的なメモリ確保によるオンメモリでの処理を行う方法や、ファイルとして出力して保持して処理を行う方法を用いてもよい。
図24は、実行部1403による解析処理の詳細な処理手順例を示すフローチャートである。実行部1403は、プログラムのファイルをオープンする(ステップS2401)。つぎに、実行部1403は、プログラムの起動時にロードする他のプログラムのプログラム情報を、プログラム情報格納テーブル1200に格納する(ステップS2402)。ステップS2402では、例えば、ステップS2401において実行部1403がオープンしたプログラムのファイルパスをプログラム情報格納テーブル1200の呼び出し元1201に格納し、実行部1403がロードするプログラムのファイルパスを参照物1202に格納し、「実行時の構成要素」という文字列を呼び出し形態1203に格納する。
つぎに、実行部1403は、インターフェース情報格納テーブル1100を用いて、プログラムに含まれるインターフェース1101に対応する属性1102を検索する(ステップS2403)。そして、実行部1403は、フィルタルール情報格納テーブル1300から、検索した属性1102に一致する属性1301に対応するフィルタルール1302を取得する(ステップS2404)。
つぎに、実行部1403は、プログラムの開始位置を探索する(ステップS2405)。そして、実行部1403は、依存関係抽出処理を実行する(ステップS2406)。依存関係抽出処理を実行する(ステップS2406)の詳細については後述する。
なお、依存関係抽出処理(ステップS2406)では、実行部1403がプログラムの実行中にロード処理を行う際に、オープンするプログラムのプログラム情報をプログラム情報格納テーブル1200に格納してもよい。この際には例えば、実行部1403が実行中のプログラムのファイルパスをプログラム情報格納テーブル1200の呼び出し元1201に格納し、新たにオープンしたプログラムのファイルパスを参照物1202に格納し、「実行時の構成要素」という文字列を呼び出し形態1203に格納する。
依存関係抽出処理(ステップS2406)が終了した後は、実行部1403は、プログラムのファイルをクローズし(ステップS2407)、解析結果を生成して出力する(ステップS2408)。これにより、実行部1403は、依存関係抽出処理を終了する。解析結果とは、たとえば、図8に示した解析結果画面801である。また、属性違反がある場合には警告画面820を出力してもよい。
<依存関係抽出処理(ステップS2406)>
図25〜図27は、図24に示した依存関係抽出処理(ステップS2406)の詳細な処理手順例を示すフローチャート1〜3である。実行部1403は、プログラムを起動する際に、起動するプログラムのファイルパスを変数Pに格納する(ステップS2501)。つぎに、実行部1403は、変数Pが指すプログラムを読み込み、先頭の命令文を実行する(ステップS2502)。そして、実行部1403は、実行した命令文が、変数Pが指すプログラムにおける命令文の終端であるかを判定する(ステップS2503)。
変数Pが指すプログラムにおける命令文の終端である場合(ステップS2503:Yes)、実行部1403は、プログラムの実行を終了し、例えば、図24のステップS2407に移行する。変数Pが指すプログラムにおける命令文の終端でない場合(ステップS2503:No)、実行部1403は、実行した命令文からオペコードを取得し(ステップS2504)、オペコードが対象としているオペランドを取得する(ステップS2505)。
実行した命令文がプログラムにおける命令文の終端を判断する材料としては、具体的には、例えば、プログラムを実行する実行ファイルまたはプロセッサ901のレジスタのプログラムカウンタのアドレス先がプログラムの終了処理を行うコードであるかを判定する方法がある。
つぎに、実行部1403は、オペコードがリターン命令であるかを判定する(ステップS2506)。リターン命令でない場合(ステップS2506:No)、ステップS2507に移行し、リターン命令である場合(ステップS2506:Yes)、実行部1403は、スタックFからシンボル名をポップする(ステップS2507)。
つぎに、実行部1403は、ステップS2504で取得したオペコードが呼び出し命令であるかを判定する(ステップS2508)。呼び出し命令でない場合(ステップS2508:No)、次の命令を実行し(ステップS2509)、ステップS2503に戻る。呼び出し命令である場合(ステップS2508:Yes)、実行部1403は、ステップS2505で取得したオペランドが呼び出し先を示す値となっているかを判定する(ステップS2510)。オペランドが呼び出し先を示す値となっていない場合(ステップS2510:No)、ステップS2509に戻る。オペランドが呼び出し先を示す値となっている場合(ステップS2510:Yes)、実行部1403は、呼び出し先のアドレスを記憶し(ステップS2511)、プロセスのメモリマップを取得する(ステップS2512)。ここで、メモリマップについて説明する。
図28は、メモリマップの一例を示す説明図である。メモリマップとは、プログラムがメモリ上に展開されてプロセスとして実行している際、プロセスがメモリ上にロードするプログラムとメモリアドレスとを対応付けた記憶領域である。プロセスがメモリ上にロードするプログラムとは、例えば、ライブラリ等がある。プログラムがメモリに展開されてプロセスとして実行される際、プロセスのメモリマップは、例えば、OSの機能により擬似ファイルとして出力される。したがって、通常のテキストファイルと同様にメモリマップを閲覧することが可能となる。また、プログラムの実行中に新たに他のプログラムをロードする場合、メモリマップ2801は、例えば、OSの機能によって随時更新される。
なお、メモリマップは必ずしもOSの機能によって出力されるものでなくてもよく、メモリマップの出力を行う機能と同等の機能を備えたプログラムや、専用のハードウェアによって出力してもよい。メモリマップ2801では、プログラム301である「main2.exe」がプロセスとしてメモリ上に展開された際のメモリマップの例を示している。メモリアドレスの範囲2803にはプログラム2804が対応している。プログラム2804〜2806のようにファイル名が同じでっても、メモリアドレスの範囲によって、例えば、メモリアドレスの読み書き権限や属性の違いがある場合、其々のメモリアドレスは区別されて出力される場合がある。なお、プログラム2807のように、起動されているプログラムである、例えば「main2.exe」自体もプロセスがロードしているプログラムとして扱われ、メモリマップ上に出力されることがある。
図25に戻り、実行部1403は、ステップS2511で記憶した呼び出し先のアドレスがプロセスのメモリマップに対応するアドレスか否かを判定する(ステップS2513)。ステップS2513の処理は、例えば、ステップS2511において記憶した呼び出し先のアドレスがメモリマップ2801のメモリアドレスの範囲2802のどの位置に存在しているかをチェックする処理である。例えば、ステップS2511において記憶した呼び出し先のアドレスの値が「00110045」である場合、当該アドレスはメモリアドレスの範囲2803に存在し、そのアドレスに対応する呼び出し先のプログラムはプログラム2804(ファイルパスで指定されるプログラム)であり、プログラム2804の開始アドレスの値は「00110000」となる。
プロセスのメモリマップに対応するアドレスが存在しない場合(ステップS2513:No)、ステップS2509に戻る。プロセスのメモリマップに対応するアドレスが存在する場合(ステップS2513:Yes)、図26のステップS2601に移行する。
図26において、実行部1403は、ステップS2511において記憶した呼び出し先のアドレスの値から、ステップS2513において判定した呼び出し先のプログラムの開始アドレスの値を減算し、算出した値をオフセットアドレスとして記憶する(ステップS2601)。例えば、ステップS2511において記憶した呼び出し先のアドレスの値が「00110045」であり、呼び出し先のプログラムの開始アドレスが「00110000」である場合、オフセットアドレスは「00000045」となる。
つぎに、実行部1403は、アドレスに対応するプログラムのファイルパスを呼び出し先のプログラムとして、記憶デバイスに記憶する(ステップS2602)。つぎに、実行部1403は、呼び出し命令の呼び出し元のプログラム名をキーとして、ジャンプ先のプログラムのファイルパスを、プログラム情報格納テーブル1200に格納する(ステップS2603)。ステップS2603では、例えば、ステップS2501または後述するステップS2609において変数Pに格納されたファイルパスをプログラム情報格納テーブル1200の呼び出し元1201に格納し、ステップS2602において記憶した呼び出し先のプログラムのファイルパスを参照物1202に格納し、「実行時の読み込み要素」という文字列を呼び出し形態1203に格納する。
つぎに、実行部1403は、呼び出し先のプログラムのシンボルテーブルが参照可能かを判定する(ステップS2604)。シンボルテーブルが参照可能でない場合(ステップS2604:No)、図25のステップS2509に戻る。シンボルテーブルが参照可能である場合(ステップS2604:Yes)、実行部1403は、呼び出し先のプログラムのシンボルテーブルを取得する(ステップS2605)。ここで、シンボルテーブルについて説明する。
図29は、シンボルテーブルの一例を示す説明図である。シンボルテーブル2900とは、プログラムがもつシンボルとシンボルのオフセットアドレスとを対応付けたテーブルである。シンボルとは、例えば、関数、変数、その他任意の値等に対応する名前である。実行部1403は、シンボルを検索することで、プログラム間をまたいで、関数、変数、その他任意の値等を呼び出すことが可能である。例えば、プログラムがライブラリの関数、変数、その他任意の値を利用する際にシンボルが用いられる。
図26に戻り、実行部1403は、呼び出し先のプログラムのオフセットアドレスに対応するシンボルがシンボルテーブル2900にあるか否かを判定する(ステップS2606)。対応するシンボルがない場合(ステップS2606:No)、ステップS2509に戻る。対応するシンボルがある場合(ステップS2606:Yes)、実行部1403は、呼び出し先のシンボル名をシンボルテーブルから取得する(ステップS2607)。例えば、ステップS2601で記憶したオフセットアドレスの値が「00000045」である場合、シンボルテーブル2900のメモリアドレス2906と一致する。したがって、ステップS2601で記憶したオフセットアドレスの値である「00000045」に対応するシンボルは、シンボル2905の「english」となる。
つぎに、実行部1403は、ステップS2607で取得した呼び出し先のシンボル名をスタックFにプッシュし(ステップS2608)、呼び出し先のプログラムのファイルパスを変数Pに格納する(ステップS2609)。つぎに、実行部1403は、ステップS2607で取得した呼び出し先のシンボル名をキーとし、当該キーに一致する命令文1001に対応するアノテーション属性1002を命令文情報格納テーブル1000から検索するとともに、当該キーに一致するインターフェース1101に対応する属性1102をインターフェース情報格納テーブル1100から検索する(ステップS2610)。この後、図27のステップS2701に移行する。
図27において、実行部1403は、検索したアノテーション属性1002に含まれる属性と検索した属性1102とが一致するか否かを判断する(ステップS2701)。不一致である場合(ステップS2701:No)、図25のステップS2509に戻る。一方、一致する場合(ステップS2701:Yes)、実行部1403は、一致した属性1102をキーとして、フィルタルール情報格納テーブル1300から、対応するフィルタルール1302を検索する(ステップS2702)。
つぎに、実行部1403は、検索できたか否か判断する(ステップS2703)。検索できなかった場合(ステップS2703:No)、図25のステップS2509に戻る。検索できた場合(ステップS2703:Yes)、実行部1403は、検索されたフィルタルールによる処理を実行する(ステップS2704)。ステップS2704では、実行部1403は、スタックFに格納された全シンボルである命令文の呼び出し関係を判定する。フィルタルールによる処理を実行した結果、実行部1403は、当該シンボルである命令文がフィルタルールに適合するか否かを判定する(ステップS2705)。
具体的には、実行部1403は、フィルタルールが属性違反を検出する関数であれば、属性違反であるか否かを判定し、フィルタルールが属性波及を検出する関数であれば、属性波及であるか否かを判定する。属性違反であったり属性波及である場合は、フィルタルールに適合することになる。
フィルタルールに適合しない場合(ステップS2705:No)、図25のステップS2509に戻る。一方、フィルタルールに適合する場合(ステップS2705:Yes)、実行部1403は、フィルタルールに応じた制御処理を実行する(ステップS2706)。ここで、フィルタルールに応じた制御処理については、図17のS1711で説明した内容と同一であるため、説明を省略する。このあと、図25のステップS2509に戻る。
なお、依存関係抽出処理(ステップS2406)は、プログラムを実行する実行部1403の実装に都合のよいように合わせて処理を変更してもよい。例では、命令文の呼び出し関係をCPU命令で説明したが、本実施例においては、呼び出し命令のトレースができれば、機械語、バイトコード等のどのようなコードの呼び出し関係をトレースする実装でもよい。また、実行部1403が解釈する言語も機械語でなくてもよい。
以上に説明したように、本実施例によれば、プログラムリスト、中間ファイル、またはプログラムのいずれかである解析対象を解析して、開発者が意図しない命令文の依存関係を検出することができる。
また、フィルタルールが命令文の呼び出し違反を検出するフィルタルールである場合、アノテーションとして規定した命令文が、意図しない命令文を呼び出していることを検出することができる。これにより、解析対象にライセンス違反となる命令文の呼び出しが含まれているかを把握することができる。
また、意図しない命令文を呼び出していることを検出した場合、当該命令文や呼び出し元の命令文を示す情報(たとえば、図6〜図8を参照)を生成して出力することにより、開発者は、どの命令文が意図しない命令文を呼び出しているかを把握することができる。
また、フィルタルールが属性の波及を検出するフィルタルールである場合、アノテーションとして規定した命令文の属性が、他の命令文に波及することを検出することができる。これにより、開発者はライセンス伝播や脆弱性の影響範囲を把握することができる。
また、属性の波及を検出した場合、当該属性の波及元の命令文と波及先の命令文を示す情報を生成して出力することにより、開発者は、どの命令文の属性がどの命令文に波及しているかを把握することができる。
また、プログラムリストを構文解析して構文解析木を作成することにより、プログラムリストに記載される命令文の記述の違いを吸収して、依存関係を判定することができる。したがって、記述の違いについて開発者は修正することなくプログラムリストを読み込ませることができ、開発者の負担軽減を図ることができる。
また、プログラムリストから命令文情報格納テーブル1000のエントリを作成することにより、フィルタルール群の中から該当するフィルタルールをディスパッチテーブルに格納しておくことで、適用されないフィルタルールを検索する必要がなくなるため、処理速度の向上を図ることができる。
また、解析対象が中間ファイルである場合、対象となる行がニーモニックであるか否かを判定することにより、ニーモニックでない場合、中間ファイル501,516,520や中間ファイルのリンク相手となるプログラム524,528の中に記載されているコメントアウト等のテキストを読み飛ばすことができる。したがって、処理速度の向上を図ることができる。
以上、本発明を添付の図面を参照して詳細に説明したが、本発明はこのような具体的構成に限定されるものではなく、添付した請求の範囲の趣旨内における様々な変更及び同等の構成を含むものである。
900 解析装置
1000 命令文情報格納テーブル
1100 インターフェース情報格納テーブル
1200 プログラム情報格納テーブル
1300 フィルタルール情報格納テーブル
1401 構文解析部
1402 生成部
1403 実行部

Claims (15)

  1. プロセッサと、前記プロセッサにより実行されるプログラムを記憶する記憶デバイスと、を有する解析装置であって、
    前記記憶デバイスは、呼び出し先となる第1の命令文と、呼び出し先と呼び出し元との依存関係を規定するフィルタルールおよび呼び出し元となる第2の命令文の組み合わせであるアノテーション属性と、を対応付けた対応情報を記憶し、
    前記プロセッサは、
    プログラムリスト、中間ファイル、またはプログラムのいずれかであり、かつ、前記アノテーション属性を含む解析対象から、前記第2の命令文を検出する検出処理と、
    前記検出処理によって検出された前記第2の命令文と当該第2の命令文によって呼び出される呼び出し先の命令文との依存関係が、前記フィルタルールに適合するか否かを、前記対応情報を参照して判定する判定処理と、
    前記判定処理によって適合すると判定された判定結果に関する情報を生成する生成処理と、
    前記生成処理によって生成された判定結果に関する情報を出力する出力処理と、
    を実行することを特徴とする解析装置。
  2. 前記フィルタルールは、前記第2の命令文が前記アノテーション属性に対応する前記第1の命令文以外の他の命令文の呼び出しを呼び出し違反として検出するフィルタルールであり、
    前記判定処理では、前記プロセッサは、前記呼び出し先の命令文が前記第1の命令文でない場合、前記呼び出し違反を検出したことにより、前記フィルタルールに適合すると判定することを特徴とする請求項1に記載の解析装置。
  3. 前記生成処理では、前記プロセッサは、前記フィルタルールに適合すると判定された場合、前記判定結果に関する情報として、前記第1の命令文が前記第2の命令文から呼び出されていることを示す情報を生成することを特徴とする請求項2に記載の解析装置。
  4. 前記生成処理では、前記プロセッサは、前記フィルタルールに適合すると判定された場合、前記呼び出し先の命令文を、前記第1の命令文に置換することを特徴とする請求項2に記載の解析装置。
  5. 前記フィルタルールは、前記アノテーション属性に対応する前記第1の命令文に関する属性が前記第2の命令文にも波及することを検出するフィルタルールであり、
    前記判定処理では、前記プロセッサは、前記呼び出し先の命令文が前記第1の命令文である場合、前記波及を検出したことにより、前記フィルタルールに適合すると判定することを特徴とする請求項1に記載の解析装置。
  6. 前記生成処理では、前記プロセッサは、前記フィルタルールに適合すると判定された場合、前記判定結果に関する情報として、前記第1の命令文に関する属性が前記第2の命令文にも波及することを示す情報を生成することを特徴とする請求項5に記載の解析装置。
  7. 前記プロセッサは、
    前記解析対象が前記プログラムリストである場合、前記プログラムリストを構文解析する構文解析処理を実行し、
    前記検出処理では、前記プロセッサは、前記構文解析処理の実行により得られる前記プログラムリストの構文解析木を用いて、前記プログラムリストから前記第2の命令文を検出することを特徴とする請求項1に記載の解析装置。
  8. 前記プロセッサは、
    前記解析対象が前記プログラムリストである場合、前記プログラムリストから、呼び出し先となる第1の命令文と前記アノテーション属性とを取得して、前記第1の命令文と前記アノテーション属性とを対応付けた前記対応情報を前記記憶デバイスに格納する格納処理を実行することを特徴とする請求項1に記載の解析装置。
  9. 前記プロセッサは、
    前記解析対象が中間ファイルである場合、前記中間ファイルから未取得の行を取得する取得処理と、
    前記取得処理によって取得された行がニーモニックであるか否かを判断する判断処理と、を実行し、
    前記検出処理では、前記プロセッサは、前記判断処理によってニーモニックであると判断された行から、前記第2の命令文を検出し、
    前記取得処理では、前記プロセッサは、前記判断処理によってニーモニックでないと判断された場合、前記中間ファイルから未取得の行を再取得することを特徴とする請求項1に記載の解析装置。
  10. プロセッサと、前記プロセッサにより実行されるプログラムを記憶する記憶デバイスと、を有する解析装置による解析方法であって、
    前記記憶デバイスは、呼び出し先となる第1の命令文と、呼び出し先と呼び出し元との依存関係を規定するフィルタルールおよび呼び出し元となる第2の命令文の組み合わせであるアノテーション属性と、を対応付けた対応情報を記憶し、
    前記解析方法は、
    前記プロセッサが、
    プログラムリスト、中間ファイル、またはプログラムのいずれかであり、かつ、前記アノテーション属性を含む解析対象から、前記第2の命令文を検出する検出処理と、
    前記検出処理によって検出された前記第2の命令文と当該第2の命令文によって呼び出される呼び出し先の命令文との依存関係が、前記フィルタルールに適合するか否かを、前記対応情報を参照して判定する判定処理と、
    前記判定処理によって適合すると判定された判定結果に関する情報を生成する生成処理と、
    前記生成処理によって生成された判定結果に関する情報を出力する出力処理と、
    を実行することを特徴とする解析方法。
  11. 前記フィルタルールは、前記第2の命令文が前記アノテーション属性に対応する前記第1の命令文以外の他の命令文の呼び出しを呼び出し違反として検出するフィルタルールであり、
    前記判定処理では、前記プロセッサは、前記呼び出し先の命令文が前記第1の命令文でない場合、前記呼び出し違反を検出したことにより、前記フィルタルールに適合すると判定することを特徴とする請求項10に記載の解析方法。
  12. 前記フィルタルールは、前記アノテーション属性に対応する前記第1の命令文に関する属性が前記第2の命令文にも波及することを検出するフィルタルールであり、
    前記判定処理では、前記プロセッサは、前記呼び出し先の命令文が前記第1の命令文である場合、前記波及を検出したことにより、前記フィルタルールに適合すると判定することを特徴とする請求項10に記載の解析方法。
  13. 呼び出し先となる第1の命令文と、呼び出し先と呼び出し元との依存関係を規定するフィルタルールおよび呼び出し元となる第2の命令文の組み合わせであるアノテーション属性と、を対応付けた対応情報を記憶する記憶デバイスにアクセス可能なプロセッサに、
    プログラムリスト、中間ファイル、またはプログラムのいずれかであり、かつ、前記アノテーション属性を含む解析対象から、前記第2の命令文を検出する検出処理と、
    前記検出処理によって検出された前記第2の命令文と当該第2の命令文によって呼び出される呼び出し先の命令文との依存関係が、前記フィルタルールに適合するか否かを、前記対応情報を参照して判定する判定処理と、
    前記判定処理によって適合すると判定された判定結果に関する情報を生成する生成処理と、
    前記生成処理によって生成された判定結果に関する情報を出力する出力処理と、
    を実行させることを特徴とする解析プログラム。
  14. 前記フィルタルールは、前記第2の命令文が前記アノテーション属性に対応する前記第1の命令文以外の他の命令文の呼び出しを呼び出し違反として検出するフィルタルールであり、
    前記判定処理では、前記プロセッサに、前記呼び出し先の命令文が前記第1の命令文でない場合、前記呼び出し違反を検出したことにより、前記フィルタルールに適合すると判定させることを特徴とする請求項13に記載の解析プログラム。
  15. 前記フィルタルールは、前記アノテーション属性に対応する前記第1の命令文に関する属性が前記第2の命令文にも波及することを検出するフィルタルールであり、
    前記判定処理では、前記プロセッサに、前記呼び出し先の命令文が前記第1の命令文である場合、前記波及を検出したことにより、前記フィルタルールに適合すると判定させることを特徴とする請求項13に記載の解析プログラム。
JP2014261731A 2014-12-25 2014-12-25 解析装置、解析方法、および解析プログラム Pending JP2016122321A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2014261731A JP2016122321A (ja) 2014-12-25 2014-12-25 解析装置、解析方法、および解析プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014261731A JP2016122321A (ja) 2014-12-25 2014-12-25 解析装置、解析方法、および解析プログラム

Publications (1)

Publication Number Publication Date
JP2016122321A true JP2016122321A (ja) 2016-07-07

Family

ID=56326552

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014261731A Pending JP2016122321A (ja) 2014-12-25 2014-12-25 解析装置、解析方法、および解析プログラム

Country Status (1)

Country Link
JP (1) JP2016122321A (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2018073054A (ja) * 2016-10-27 2018-05-10 株式会社Dtsインサイト オブジェクト分析装置、オブジェクト分析方法、及びプログラム
CN112241370A (zh) * 2020-10-21 2021-01-19 网易(杭州)网络有限公司 一种api接口类的校验方法、系统及装置
CN113360301A (zh) * 2021-07-02 2021-09-07 北京奇艺世纪科技有限公司 一种消息传输系统及方法

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2018073054A (ja) * 2016-10-27 2018-05-10 株式会社Dtsインサイト オブジェクト分析装置、オブジェクト分析方法、及びプログラム
CN112241370A (zh) * 2020-10-21 2021-01-19 网易(杭州)网络有限公司 一种api接口类的校验方法、系统及装置
CN112241370B (zh) * 2020-10-21 2023-06-16 网易(杭州)网络有限公司 一种api接口类的校验方法、系统及装置
CN113360301A (zh) * 2021-07-02 2021-09-07 北京奇艺世纪科技有限公司 一种消息传输系统及方法
CN113360301B (zh) * 2021-07-02 2023-09-05 北京奇艺世纪科技有限公司 一种消息传输系统及方法

Similar Documents

Publication Publication Date Title
Ye et al. Automated conformance testing for JavaScript engines via deep compiler fuzzing
Tempero et al. The qualitas corpus: A curated collection of java code for empirical studies
Li et al. PR-Miner: automatically extracting implicit programming rules and detecting violations in large software code
Seo et al. Programmers' build errors: a case study (at google)
US10185546B2 (en) Service extraction and application composition
JP5208635B2 (ja) プログラミングを支援するための情報処理装置、情報処理システム、プログラミング支援方法およびプログラム
Licker et al. Detecting incorrect build rules
Muntean et al. Intrepair: Informed repairing of integer overflows
Mariani et al. A technique for verifying component-based software
Ye et al. Knowledge-based environment dependency inference for Python programs
Solanki et al. Comparative study of software clone detection techniques
JP2016122321A (ja) 解析装置、解析方法、および解析プログラム
Rahkema et al. SwiftDependencyChecker: Detecting vulnerable dependencies declared through cocoapods, carthage and swift pm
Piskachev et al. Secucheck: Engineering configurable taint analysis for software developers
WO2019070630A1 (en) MAPPING AND VISUALIZATION OF CUSTOMER SERVER COMPUTER CODE
Xu et al. Semantic characterization of MapReduce workloads
Li et al. Automated source code instrumentation for verifying potential vulnerabilities
Mendonça et al. Test2feature: Feature-based test traceability tool for highly configurable software
Kauffman Log analysis and system monitoring with nfer
Borzykh et al. Detecting Code Security Breaches by Means of Dataflow Analysis
Pérez et al. Lapse+ static analysis security software: Vulnerabilities detection in java ee applications
Anderson et al. Supporting analysis of SQL queries in PHP AiR
CN114691197A (zh) 代码分析方法、装置、电子设备和存储介质
KR101583133B1 (ko) 스택 기반 소프트웨어 유사도 평가 방법 및 장치
Chen et al. Automated finite state machine extraction