JP2014106770A - 型チェック装置、型チェック方法および型チェックプログラム - Google Patents

型チェック装置、型チェック方法および型チェックプログラム Download PDF

Info

Publication number
JP2014106770A
JP2014106770A JP2012259633A JP2012259633A JP2014106770A JP 2014106770 A JP2014106770 A JP 2014106770A JP 2012259633 A JP2012259633 A JP 2012259633A JP 2012259633 A JP2012259633 A JP 2012259633A JP 2014106770 A JP2014106770 A JP 2014106770A
Authority
JP
Japan
Prior art keywords
type
statistical information
execution module
information
type check
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
JP2012259633A
Other languages
English (en)
Inventor
Ryoichi Aoki
良一 青木
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.)
Fujitsu Frontech Ltd
Original Assignee
Fujitsu Frontech 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 Fujitsu Frontech Ltd filed Critical Fujitsu Frontech Ltd
Priority to JP2012259633A priority Critical patent/JP2014106770A/ja
Publication of JP2014106770A publication Critical patent/JP2014106770A/ja
Pending legal-status Critical Current

Links

Images

Abstract

【課題】型制約の存在しないプログラミング言語における引数や復帰値の型をチェックできるようにする。
【解決手段】型チェック装置20の型チェック処理埋込部21は、まず、型チェック処理埋込部21がコンパイル済みの実行モジュール2から型チェック処理3を生成して実行モジュール2に埋込む。型チェック処理3が埋込まれた実行モジュール4の実行時に、統計情報収集部22が型チェック処理3によって取得された引数情報および復帰値情報を含む統計情報を収集し、統計情報記録部23に記録する。統計情報解析部24は、統計情報記録部23に記録されている統計情報に対してデータ型を統計的に解析し、型誤りを検出した場合、エラー処理部25が警告表示またはエラー通知を行う。これにより、型制約が存在しないプログラミング言語に対して型誤りの検出が可能になる。
【選択図】図1

Description

本発明は型チェック装置、型チェック方法および型チェックプログラムに関し、特に型制約が存在しないプログラミング言語におけるデータ型をチェックする型チェック装置、型チェック方法および型チェックプログラムに関する。
一般的なプログラムは、ソースコードを記述したソースファイルから実行モジュールを作成し、その実行モジュールをコンピュータで動作させることにより実行される。実行モジュールは、コンパイラ(またはインタプリタ)というプログラムを利用してコンピュータが実行できる形に作成される。
ソースコードを記述するプログラミング言語には、型制約の存在するものと存在しないものとがある。型とは、コンピュータがプログラムを実行するときのデータの扱いに関する形式のことであって、データを、文字列として扱う文字列型、数値として扱う数値型、真偽の2値を扱うブーリアン型など、多くのデータ型が存在している。
図12はコンパイラの処理フローを示す図であって、(A)は型制約の存在する言語用の処理フローを示し、(B)は型制約の存在しない言語用の処理フローを示し、図13はソースコードの一例を示す図であって、(A)は型制約の存在する言語の記述例を示し、(B)は型制約の存在しない言語の記述例を示している。
一般的に、コンパイラは、ソースコードを読込み、トークンに分解する字句解析部、トークン列を元にプログラムの構文木を構築する構文解析部、構文木からオブジェクトコードを生成するコード生成部の機能を備えている。
型制約の存在する言語用のコンパイラの処理フローは、図12の(A)に示したように、ソースコードの字句解析を行い(ステップS101)、構文解析を行い(ステップS102)、そしてコード生成をして実行モジュールを作成する(ステップS103)。型制約の存在しない言語用のコンパイラも同様に、図12の(B)に示したように、ソースコードの字句解析を行い(ステップS111)、構文解析を行い(ステップS112)、そしてコード生成をする(ステップS113)というステップを踏む。
型制約が存在するプログラミング言語(たとえば、Java(登録商標)など)では、ソースコードは、変数の宣言のときにデータ型を明示的に定義した形で記述されているので、コンパイルのタイミングでは、データの型が厳密に定められている。そのため、コンパイラは、構文解析を行うときに、データ型の妥当性チェックが可能であるため、一般には、構文解析処理に型チェック処理を含んでいる。型チェック処理を含んでいることによって、コンパイラは、コーディングミスをコンパイルの段階で事前に検出することが可能となり、デバック作業を効率的に進めることができる。また、コンパイラに組み込むのではなく、コンパイルした実行モジュールに対して、別個に、型チェックを行うようにした技術も知られている(たとえば、特許文献1参照)。
Java言語によるソースコードの例を示した図13の(A)によれば、他のクラスから呼出されることを想定したメソッドでは、変数の前に文字列型を宣言する「String」や整数型を宣言する「int」が記述されている。また、同一クラスからのアクセスを想定しているメソッドでは、メソッドの前にブーリアン型の「boolean」が記述され、引数の前には、整数型の「int」が記述されている。
なお、この図13の(A)に示したソースコードの例は、誤ったデータ型の宣言の例を示している。たとえば、judgeというメソッドは、数値の型で引数「param」の呼出しを想定しているが、その引数「param」は、ファンクション「method1」の宣言では、文字列型で定義されている。また、このメソッドの復帰値は、真偽値で返すことを明示的に宣言しているが、この復帰値を受ける側は、数値で返ってくると想定している。したがって、このソースコードをコンパイルすると、コンパイラは、構文解析の型チェック処理が型誤り(コーディングミス)を検出し、コンパイルエラーを出力することになる。
一方、型制約が存在しないプログラミング言語(たとえば、JavaScript(登録商標)など)では、図13の(B)にソースコードの例を示したように、ソースコードに型宣言は存在しない。型制約が存在しないプログラミング言語でも、変数の宣言は存在する。しかし、その変数がどんなデータ型であるかの宣言はない。この型制約が存在しない言語の場合、データ型は、ソースコードに存在しないだけで、実際にプログラムを実行するタイミングで動的に変換されていて、その変換されたデータ型に従ってプログラムが実行されていく。したがって、型制約が存在しないプログラミング言語は、コンパイルのタイミングでデータ型を決定することはできないので、当然ながら、構文解析のときにデータ型の妥当性チェックを行うことはできない。このため、想定したデータ型とは異なる誤った型で記述したソースコードがあったとしても、コンパイルの際にコンパイルエラーになることなく実行モジュールが作成され、実行モジュールの動作時にその誤った型が検出されるか想定しない実行結果となる。
たとえば、図13の(B)に示したソースコードによれば、型宣言のない変数「param」の定義をしていて、その値は、数値の「200」をダブルクオートで括って文字列型にしている。また、この変数の値を、judgeというファンクションに渡しているが、このファンクションのメソッドは、数値の比較を行う処理であり、数値型で呼出されることを想定している。したがって、このソースコードから生成した実行モジュールを動作させたとしても、型の異なるデータ同士ではあるが、比較処理ができてしまってエラーにはならないが、このソースコードのプログラムは、プログラマが想定した動きをしないことになる。このように、型制約が存在しないプログラミング言語では、プログラムが、想定した通りのデータ型にて動作しているか否かは、実際にプログラムを動作させ、実行結果やデバッガにより確認を行っている。
特開2003−36188号公報
上記の通り、型制約が存在しないプログラミング言語では、型制約が存在するプログラミング言語であれば、コンパイルエラーとして検知できたデータ型の誤りをコンパイル時に機械的に検出することはできない。そのため、実際にプログラムを動作させることでデータ型の誤りを検出する必要はあるが、テスト不足による検出漏れの可能性があるという問題点があった。
また、型制約の存在しないプログラミング言語では、実行時に行われる動的型変換により、プログラマの想定しない型変換が行われ、潜在障害が検出されずに製品に残存してしまう可能性があった。
本発明はこのような点に鑑みてなされたものであり、型制約の存在しないプログラミング言語における引数や復帰値の型をチェックする型チェック装置、型チェック方法および型チェックプログラムを提供することを目的とする。
本発明では、上記の課題を解決するために、コンパイル済みの第1の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第2の実行モジュールを生成する型チェック処理埋込部と、前記第2の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集する統計情報収集部と、前記統計情報収集部が収集した統計情報を記録する統計情報記録部と、前記統計情報記録部に記録されている統計情報に対して同じファンクション名のデータ型を統計的に解析する統計情報解析部と、前記統計情報解析部による解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行うエラー処理部と、を備えていることを特徴とする型チェック装置が提供される。
また、本発明では、コンパイル済みの第1の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第2の実行モジュールを生成し、前記第2の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集し、収集した統計情報を記録し、記録された統計情報に対して同じファンクション名のデータ型を統計的に解析し、解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行う、ことを特徴とする型チェック方法が提供される。
さらに、本発明では、コンピュータに、コンパイル済みの第1の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第2の実行モジュールを生成し、前記第2の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集し、収集した統計情報を記録し、記録された統計情報に対して同じファンクション名のデータ型を統計的に解析し、解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行う、処理を実行させることを特徴とする型チェックプログラムが提供される。
このような型チェック装置、型チェック方法および型チェックプログラムによれば、型制約が存在しないプログラミング言語によるコンパイル済みの実行モジュールに型チェック処理を埋込む。その実行モジュールの実行時に、型チェック処理によって取得した引数情報および復帰値情報を収集し、統計的に型誤りを判断して、型誤りと思われる場合に、警告表示またはエラー通知を行う。
上記構成の型チェック装置、型チェック方法および型チェックプログラムは、型制約が存在しないプログラミング言語においても、型制約が存在するプログラミング言語と同様にデータ型のチェックが可能にするという利点がある。データ型のチェックができることで、プログラムにおける潜在バグを機械的に検出することが可能となる。
本発明の実施の形態に係るプログラム開発システムを示す図である。 本発明の実施の形態に用いるコンピュータのハードウェア構成例を示す図である。 型チェック処理埋込部の処理例を示すフローチャートである。 型チェック処理埋込部による処理前後の実行モジュールの変化をソースコードのイメージで表した図である。 統計情報収集部による統計情報の収集処理例を示すフローチャートである。 統計情報の引数情報の収集例を示す図である。 統計情報の復帰値情報の収集例を示す図である。 統計情報として呼出し元ファンクション名の収集方法を説明する図である。 統計情報解析部による引数の統計情報の解析およびエラー処理部によるエラー通知の処理例を示すフローチャートである。 統計情報解析部による復帰値の統計情報の解析およびエラー処理部によるエラー通知の処理例を示すフローチャートである。 エラー通知の例を示す図であって、(A)は画面によるエラー通知の例を示し、(B)はログ出力によるエラー通知の例を示している。 コンパイラの処理フローを示す図であって、(A)は型制約の存在する言語用の処理フローを示し、(B)は型制約の存在しない言語用の処理フローを示している。 ソースコードの一例を示す図であって、(A)は型制約の存在する言語の記述例を示し、(B)は型制約の存在しない言語の記述例を示している。
以下、本発明の実施の形態について、型制約が存在しないプログラミング言語によりプログラムを開発するプログラム開発システムに適用した場合を例に図面を参照して詳細に説明する。
図1は本発明の実施の形態に係るプログラム開発システムを示す図である。
このプログラム開発システムは、コンパイラ10と、型チェック装置20とを備えている。コンパイラ10は、型制約が存在しないプログラミング言語により記述されたプログラムのソースコード1を入力し、コンピュータが実行できる形式の実行モジュール2を生成して出力する。
型チェック装置20は、実行モジュール2に対してデータ型のチェックを行う支援ツールとして使用されるもので、型チェック処理埋込部21と、統計情報収集部22と、統計情報記録部23と、統計情報解析部24と、エラー処理部25とを備えている。
型チェック処理埋込部21は、コンパイラ10によってコンパイルされた実行モジュール2を読込んで、型チェックに必要な処理を生成し、生成した型チェック処理3を実行モジュール2に埋込んで実行モジュール4を生成する。型チェック処理3は、実行モジュール2の中でファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する。
統計情報収集部22は、実行モジュール4の実行時に型チェック処理3によって取得された引数情報および復帰値情報を含む統計情報を収集する。統計情報記録部23は、統計情報収集部22が収集した統計情報を記録する。統計情報解析部24は、統計情報記録部23に記録されている統計情報に対して同じファンクション名のデータ型を統計的に解析する。そして、エラー処理部25は、統計情報解析部24による解析の結果、データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行う。
これにより、型制約が存在しないプログラミング言語に対しても、型制約が存在するプログラミング言語で可能であった型誤りの検出が可能になり、プログラムにおける潜在バグを確実に低減することが可能となる。
図2は本発明の実施の形態に用いるコンピュータのハードウェア構成例を示す図である。コンピュータ30は、CPU(Central Processing Unit)31によって装置全体が制御されている。CPU31には、RAM(Random Access Memory)32、ハードディスクドライブ(HDD:Hard Disk Drive)33、グラフィック処理装置34、入力インタフェース35、光学ドライブ装置36および機器接続インタフェース37がバス38を介して接続されている。
RAM32には、CPU31に実行させるOS(Operating System)のプログラムやプログラム開発に用いられるアプリケーションプログラムの少なくとも一部が一時的に格納される。また、RAM32には、CPU31による処理に必要な各種データが格納される。HDD33には、OS、アプリケーションプログラム、各種データなどが格納される。アプリケーションプログラムとしては、たとえば、ソースコード1を作成するテキストエディタ、コンパイラ10、実行モジュール4を実行するための基盤となる実行環境などを含む。
グラフィック処理装置34には、モニタ39が接続されている。グラフィック処理装置34は、CPU31からの命令に従って画像をモニタ39の画面に表示させる。入力インタフェース35には、キーボード40およびマウス41が接続されている。入力インタフェース35は、キーボード40やマウス41から送られてくる信号を、バス38を介してCPU31に送信する。
光学ドライブ装置36は、光ディスク42に記録されたプログラムなどのデータの読取りを行う。光ディスク42には、OS、アプリケーションプログラム、各種データなどが記録され、光ディスク42から読取られたデータは、バス38を介してHDD33に格納される。
機器接続インタフェース37は、可搬型記録媒体43に対してデータの読取り・書込みを行う。可搬型記録媒体43に記録されたプログラムなどのデータは、機器接続インタフェース37によって読込まれ、バス38を介してHDD33に格納され、またはバス38を介してRAM32に展開される。機器接続インタフェース37は、また、HDD33またはRAM32に格納されているプログラムなどのデータを可搬型記録媒体43に記録することができる。
以上のようなハードウェア構成によって、本実施の形態の処理機能を実現することができる。なお、ソースコード1を作成するコンピュータおよびコンパイラ10を実行させるコンピュータは、上記の型チェック装置を実行させるコンピュータ30と相違してもよい。その場合、ソースコード1を作成するコンピュータおよびコンパイラ10を実行させるコンピュータも、コンピュータ30と同様のハードウェア構成で実現される。
図3は型チェック処理埋込部の処理例を示すフローチャート、図4は型チェック処理埋込部による処理前後の実行モジュールの変化をソースコードのイメージで表した図である。
型チェック処理埋込部21は、実行モジュール4を動的に操作して型チェック処理3を実行モジュール4に追加するものであり、既知のアスペクト処理により実現している。アスペクト処理とは、アスペクト指向(SOC:Separation Of Concerns)を実現するための仕組みであり、コンパイル済みの実行モジュールを操作して任意の処理を追加する機能を指す。
アスペクト指向(SOC)とは、一般的に「関心事の分離」と呼ばれ、ソフトウェアの処理において、本来の処理とは直接関係がなく、共通的な処理を、「サブルーチン」という関心事としてメインとなる処理のソースコード上から排除することを目的としている。これにより、たとえば、呼出しログの取得などのような共通的な処理をコーディングする必要がないので、それぞれのソースコードでは本来意識すべき処理に注力することができるとともに、共通的な処理の内容、実行有無を任意に変更することが可能となる。
次に、型チェック処理埋込部21がアスペクト処理によって実行モジュール2に型チェック処理3を追加して実行モジュール4を生成するフローについて説明する。ここで、コンパイルされた実行モジュール2は、クラスが定義され、そのクラスを元にインスタンスが生成されたモジュールであるとする。型チェック処理埋込部21は、そのクラスを元にしてメソッドに対応する部分にアスペクト処理にて新たに型チェック処理3を埋込んでいって、インスタンスを生成することになる。
すなわち、型チェック処理埋込部21の処理が開始すると、図3に示したように、まず、CPU31は、コンパイラ10によってコンパイルされた実行モジュール2からクラスを読込む(ステップS1)。
次に、CPU31は、アスペクト処理が済んでいるかどうかをチェックし(ステップS2)、アスペクト処理が済んでいない場合に、アスペクト処理による型チェック処理3の埋込処理を行う(ステップS3)。このステップS3の処理は、すべてのメソッドの数だけ繰り返し行われる。
型チェック処理3の埋込処理が終了した場合、または、ステップS2の判断にてアスペクト処理が済んでいる場合には、CPU31は、インスタンスを生成して実行モジュール4を生成する(ステップS4)。
型チェック処理埋込部21がアスペクト処理によって実行モジュール2に型チェック処理3を追加すると、図4に示したように、judgeというファンクションのメソッドは、引数および復帰値の情報を取得する処理が追加されている。換言すれば、ソースコードのイメージで表した実行モジュール2のファンクション「judge」のメソッド
return param>100;
は、実行モジュール4においては、引数および復帰値のデータ型をチェックする型チェック処理3として次の4行の、
引数情報取得(param);
var retVal=param>100;
復帰値情報取得(retVal);
return retVal;
によって書き換えられている。
次に、型チェック装置20によるデータ型の統計的なチェックおよびエラー処理について説明する。
図5は統計情報収集部による統計情報の収集処理例を示すフローチャート、図6は統計情報の引数情報の収集例を示す図、図7は統計情報の復帰値情報の収集例を示す図、図8は統計情報として呼出し元ファンクション名の収集方法を説明する図である。
統計情報収集部22による統計情報の収集は、実行モジュール4の型チェック処理3が処理を開始することによって開始される。すなわち、統計情報収集部22は、まず、型チェック処理3が取得した引数情報から実行モジュール4のファンクションの中で呼出しを行うファンクションの呼出し元ファンクション名を取得する(ステップS11)。次に、統計情報収集部22は、その呼出し元ファンクションが呼出す引数の型情報を取得し(ステップS12)、それに関連する他の引数情報とともに統計情報記録部23に記録し(ステップS13)、これらステップS12,S13の処理を引数の数分繰り返す。ここで、統計情報記録部23に記録する引数情報は、図6に示したように、ファンクション名、種別=引数(順番)、データ型、値、および呼出し元ファンクション名である。
このように、引数の統計情報がすべて収集されると、次に、実行モジュール4が本来のメソッド処理を実行し、型チェック処理3が復帰値情報を取得する(ステップS14)。その本来のメソッド処理を実行することで得られる復帰値について、統計情報収集部22は、復帰値に例外が発生しているか否かを判断する(ステップS15)。ここで、統計情報収集部22は、復帰値の値として通常取り得るデータ型の値であれば、復帰値型情報を取得し(ステップS16)、復帰値情報を統計情報記録部23に記録する(ステップS17)。
ステップS15において、通常取り得るデータ型の値でない復帰値が収集された場合、統計情報収集部22は、例外が発生したと判断して例外型情報を取得し(ステップS18)、取得した例外型情報を統計情報記録部23に記録する(ステップS19)。
なお、ステップS17,S19において、統計情報記録部23に記録する引数情報は、図7に示したように、ファンクション名、種別=復帰値、データ型、値、呼出し元ファンクション名およびメソッド結果である。
なお、図5におけるステップS11では、呼出し元ファンクション名を取得しているが、この情報は、型チェック処理3により直接取得することはできない。しかし、呼出し元ファンクション名なる統計情報は、プログラムの実行環境50より取得することができる。
すなわち、図8に示したように、JavaScript言語でコーディングされたモジュールA,Bがあった場合、そのモジュールA,Bは、JavaScript実行エンジンなる実行環境50の元で実行される。ここで、モジュールBのファンクションYがモジュールAのファンクションXを呼出すとした場合、ファンクションXの引数(a,b,c)がファンクションYに渡されるが、そのとき、実行環境50では、一般に、呼出し元の情報を保持している。たとえば、図示のような呼出しがあったとき、そのときに、呼出し元情報を保持するスタック51が実行環境50内に作成される。この呼出し元情報を、たとえば、ファンクションYが知りたいとした場合、実行環境50が提供するAPI(Application Programming Interface)を利用して呼出し情報取得処理52がスタック51を参照することにより呼出し元情報を取得することができる。したがって、この型チェック装置20においても、統計情報収集部22が取得する呼出し元ファンクション名については、実行環境50のAPIを利用してスタック51を参照することにより取得することができる。
以上のようにして、統計情報収集部22により収集され、統計情報記録部23に記録された統計情報は、統計情報解析部24において解析され、データ型に統計的に誤りがあると思われる場合、エラー処理部25が警告表示またはエラー通知を行う。以下、その統計情報の解析およびエラー処理を、引数の場合と復帰値の場合とに分けて説明する。
図9は統計情報解析部による引数の統計情報の解析およびエラー処理部によるエラー通知の処理例を示すフローチャート、図10は統計情報解析部による復帰値の統計情報の解析およびエラー処理部によるエラー通知の処理例を示すフローチャートである。
引数の統計情報の解析では、図9に示したように、統計情報解析部24は、統計情報記録部23に記録された統計情報からすべてのファンクションの統計情報を登録する(ステップS21)。
次に、統計情報解析部24は、登録された1つの登録情報を選択してその登録情報が統計情報のファンクション名と一致するかどうかを判断し(ステップS22)、一致する場合には、登録情報と引数順番が一致するかどうかを判断する(ステップS23)。ここで、引数順番が一致する場合、統計情報解析部24は、さらに、これら登録情報のデータ型が一致するかどうかを判断する(ステップS24)。そして、ステップS24において、データ型が一致しないときには、エラー処理部25により警告・エラー通知候補として記録が行われる(ステップS25)。なお、ステップS22において、ファンクション名が一致しないとき、ステップS23において、引数順番が一致しないとき、または、ステップS24において、データ型が一致するときには、ステップS25の警告・エラー通知候補記録の処理はパスされる。
以上のステップS22〜S25の処理は、すべての登録情報数について繰り返し実行され、さらに、引数の数分、繰り返し実行される。このようにして、統計情報解析部24では、ファンクション名および引数順番が一致するファンクションの中で、データ型が一致しないものがあれば、警告・エラー通知候補として記録する。
すべての登録情報について繰り返し実行後、統計情報解析部24は、警告・エラー通知候補が存在しているかチェックを行う(ステップS26)。警告・エラー通知候補が存在した場合、データ型が統計的に少数となるファンクションについて、エラー処理部25にて警告・エラー通知が行われる(ステップS27)。エラー処理部25では、警告・エラー通知処理を行うと判断された引数情報について、不正な呼出しの可能性があるとして警告表示またはエラー通知を行うことになる。たとえば、引数情報の例を示した図6の「データ型」の項によれば、殆どの呼出しがNumber型となっており、統計的には、Number型を引数に取るメソッドであると想定することができる。そのメソッドにおいて、Number型以外のデータ型による呼出しが存在した場合(たとえば、図6のE1の場合)、型情報の誤りの可能性があると判断することができるため、エラー処理部25は、警告(またはエラー)として出力する。
その後、統計情報解析部24は、再度、登録された1つの登録情報を選択してその登録情報が統計情報のファンクション名と一致するかどうかを判断し(ステップS28)、一致する場合には、引数の数を保持する(ステップS29)。登録情報がファンクション名と一致しない場合、ステップS29の処理をパスする。そして、このステップS28およびステップS29の処理は、すべての登録情報数について繰り返し実行される。
最後に、統計情報解析部24は、ステップS29の処理で保持された引数の数が妥当であるか否かをチェックし(ステップS30)、登録情報の引数の数が保持された引数の数と一致しない場合、エラー処理部25は、警告(またはエラー)として出力する(ステップS31)。たとえば、引数情報の例を示した図6には「種別(順番)」の項があるが、ここで、引数の数に相違がある場合(図6のE2の場合)、不正な呼出しの可能性があるとして、エラー処理部25は、警告(またはエラー)として出力することになる。これにより、統計情報解析部24は、引数なしで呼出された場合にも、型チェックを可能にしている。
復帰値の統計情報の解析では、図10に示したように、統計情報解析部24は、統計情報記録部23に記録された統計情報からすべてのファンクションの統計情報を登録する(ステップS41)。
次に、統計情報解析部24は、登録された1つの登録情報を選択してその登録情報が統計情報のファンクション名と一致するかどうかを判断し(ステップS42)、一致する場合には、登録情報とデータ型が一致するかどうかを判断する(ステップS43)。ステップS43において、データ型が一致しないときには、警告・エラー通知候補として記録を行う(ステップS44)。ステップS42において、ファンクション名が一致しないとき、および、ステップS43において、データ型が一致するときには、それぞれステップS44の警告・エラー通知候補記録の処理はパスされる。以上のステップS42〜S44の処理は、すべての登録情報数について繰り返し実行される。
すべての登録情報に対して繰り返し実行後、統計情報解析部24は、警告・エラー通知候補が存在しているかチェックを行う(ステップS45)。警告・エラー通知候補が存在した場合、データ型が統計的に少数となるファンクションについて、エラー処理部25により警告・エラー通知処理が行われる(ステップS46)。このようにして、統計情報解析部24では、ファンクション名が一致するファンクションの中で、復帰値のデータ型が一致しないものがあれば、エラー処理部25にて警告・エラー通知処理が行われることになる。たとえば、復帰値情報の例を示した図7によれば、呼出し毎に値を記録し、異なるデータ型であれば(たとえば、図7のE3の場合)、エラー処理部25は、警告(またはエラー)として出力する。なお、復帰値の場合、メソッド結果(正常/例外発生)も併せて記録しているが、メソッド結果が例外発生の場合には、大多数の復帰値と異なるデータ型であってもエラーと判断しない(たとえば、図7のE4の場合)。
図11はエラー通知の例を示す図であって、(A)は画面によるエラー通知の例を示し、(B)はログ出力によるエラー通知の例を示している。
エラー処理部25は、その通知方法としては、アプリケーション画面上に通知する場合、ログファイルへの出力により通知する場合、または、画面通知およびログ出力の両方で行う場合がある。
画面通知の場合、図11の(A)に示したように、実行モジュール4が実行されていてモニタ39にアプリケーション画面61が表示されているとする。このとき、統計情報解析部24がプログラムに何らかの誤りを検出した時点で、エラー処理部25は、通知用のダイアログ62をアプリケーション画面61上にポップアップ表示させて、利用者に通知を行う。
通知用のダイアログ62が表示されると、利用者は、その段階で警告内容を確認し、ソースコード1を見直して、再度、コンパイルと、型チェック装置20による型チェック処理を行い、以上の処理を型誤りがなくなるまで繰り返し行うことになる。
一方、ログ出力の場合、図11の(B)に示したように、実行モジュール4の実行時に、統計情報解析部24がプログラムに何らかの誤りを検出した時点で、エラー処理部25は、警告/エラーログをログファイル63に出力する。なお、警告/エラーログをログファイル63に出力するタイミングを統計情報解析部24が誤りを検出した時点としているが、実行モジュール4の実行終了時でもよい。
1 ソースコード
2 実行モジュール
3 型チェック処理
4 実行モジュール
10 コンパイラ
20 型チェック装置
21 型チェック処理埋込部
22 統計情報収集部
23 統計情報記録部
24 統計情報解析部
25 エラー処理部
30 コンピュータ
31 CPU
32 RAM
33 ハードディスクドライブ(HDD)
34 グラフィック処理装置
35 入力インタフェース
36 光学ドライブ装置
37 機器接続インタフェース
38 バス
39 モニタ
40 キーボード
41 マウス
42 光ディスク
43 可搬型記録媒体
50 実行環境
51 スタック
52 呼出し情報取得処理
61 アプリケーション画面
62 ダイアログ
63 ログファイル

Claims (6)

  1. コンパイル済みの第1の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第2の実行モジュールを生成する型チェック処理埋込部と、
    前記第2の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集する統計情報収集部と、
    前記統計情報収集部が収集した統計情報を記録する統計情報記録部と、
    前記統計情報記録部に記録されている統計情報に対して同じファンクション名のデータ型を統計的に解析する統計情報解析部と、
    前記統計情報解析部による解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行うエラー処理部と、
    を備えていることを特徴とする型チェック装置。
  2. 前記型チェック処理埋込部は、前記第1の実行モジュールからクラスを読込んで前記クラスからオブジェクトを生成するインスタンス生成時に、アスペクト処理により、前記第1の実行モジュールを操作して前記型チェック処理を動的に追加して前記第2の実行モジュールを生成することを特徴とする請求項1記載の型チェック装置。
  3. 前記統計情報は、ファンクション名、種別、データ型、値、および呼出し元ファンクション名を含んでいることを特徴とする請求項1記載の型チェック装置。
  4. 前記呼出し元ファンクション名は、前記第2の実行モジュールの実行環境において、呼出し元ファンクションが呼出しを行ったときに前記実行環境が作成して保持していた呼出し元情報から取得することを特徴とする請求項3記載の型チェック装置。
  5. コンパイル済みの第1の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第2の実行モジュールを生成し、
    前記第2の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集し、
    収集した統計情報を記録し、
    記録された統計情報に対して同じファンクション名のデータ型を統計的に解析し、
    解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行う、
    ことを特徴とする型チェック方法。
  6. コンピュータに、
    コンパイル済みの第1の実行モジュールに対しファンクションに渡される引数および呼出し元ファンクションに返される復帰値のデータ型をチェックして引数情報および復帰値情報を取得する型チェック処理を埋込んで第2の実行モジュールを生成し、
    前記第2の実行モジュールの実行時に前記型チェック処理によって取得された前記引数情報および前記復帰値情報を含む統計情報を収集し、
    収集した統計情報を記録し、
    記録された統計情報に対して同じファンクション名のデータ型を統計的に解析し、
    解析の結果、前記データ型が統計的に少数となるファンクションがあるとき、警告表示またはエラー通知を行う、
    処理を実行させることを特徴とする型チェックプログラム。
JP2012259633A 2012-11-28 2012-11-28 型チェック装置、型チェック方法および型チェックプログラム Pending JP2014106770A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2012259633A JP2014106770A (ja) 2012-11-28 2012-11-28 型チェック装置、型チェック方法および型チェックプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2012259633A JP2014106770A (ja) 2012-11-28 2012-11-28 型チェック装置、型チェック方法および型チェックプログラム

Publications (1)

Publication Number Publication Date
JP2014106770A true JP2014106770A (ja) 2014-06-09

Family

ID=51028195

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012259633A Pending JP2014106770A (ja) 2012-11-28 2012-11-28 型チェック装置、型チェック方法および型チェックプログラム

Country Status (1)

Country Link
JP (1) JP2014106770A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107315619A (zh) * 2017-07-12 2017-11-03 北京理工大学 一种实现补丁安全的热修复方法、移动终端及热修复系统
JP2019061587A (ja) * 2017-09-27 2019-04-18 富士通株式会社 解析方法、解析装置及び解析プログラム

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107315619A (zh) * 2017-07-12 2017-11-03 北京理工大学 一种实现补丁安全的热修复方法、移动终端及热修复系统
JP2019061587A (ja) * 2017-09-27 2019-04-18 富士通株式会社 解析方法、解析装置及び解析プログラム

Similar Documents

Publication Publication Date Title
Babić et al. Fudge: fuzz driver generation at scale
US7478366B2 (en) Debugger and method for debugging computer programs across multiple programming languages
Louridas Static code analysis
Robillard et al. Designing robust Java programs with exceptions
Prähofer et al. Opportunities and challenges of static code analysis of IEC 61131-3 programs
US8789020B2 (en) Interactive debugging environments and methods of providing the same
Chiş et al. Practical domain-specific debuggers using the Moldable Debugger framework
US20110314337A1 (en) Method and Apparatus for Locating Input-Model Faults Using Dynamic Tainting
US7823144B2 (en) Computer program code comparison using lexemes
KR20090017598A (ko) 소프트웨어를 분석하기 위한 방법 및 시스템
JP2006185211A (ja) プログラム解析装置、テスト実行装置、その解析方法及びプログラム
JP5396979B2 (ja) ソフトウェア開発支援装置、システム、ソフトウェア開発支援装置の機能拡張方法、及びプログラム
US20100325607A1 (en) Generating Code Meeting Approved Patterns
Shatnawi et al. Analyzing program dependencies in java ee applications
Gómez-Abajo et al. Wodel-Test: a model-based framework for language-independent mutation testing
Hills et al. Enabling PHP software engineering research in Rascal
US9141351B2 (en) Indicators for resources with idempotent close methods in software programs
WO2011151931A1 (ja) アプリケーションの解析方法、解析システム及び記録媒体
Coelho et al. Unveiling and taming liabilities of aspects in the presence of exceptions: a static analysis based approach
JP6845429B2 (ja) コンパイラプログラム、情報処理装置およびコンパイル方法
US8918772B1 (en) Statically analyzing program correctness for a dynamic programming language
Barton et al. Dynamic and graphical web page breakpoints
JP2014106770A (ja) 型チェック装置、型チェック方法および型チェックプログラム
US20130111432A1 (en) Validation of a system model including an activity diagram
Zheng et al. An initial study of a lightweight process for change identification and regression test selection when source code is not available