(57)【要約】【課題】プログラムの開発において、ルールファイルを必要とすることなく、動的に確保または占有したリソースに対する解放洩れ、リソース解放処理の挿入位置を、コーディングの段階で静的に検出する。【解決手段】リソース確保・占有位置探索処理部２は、検証対象のソースプログラム１を変換した機械語からなる実行可能プログラムの各ステップを順に読み出し、リソースを確保・占有する命令語を検出し、リソース解放位置探索処理部４は、リソース確保・占有位置探索処理部２が検出した命令語で確保・占有したリソースを解放する命令語の有無を、当該実行可能プログラムの全処理経路に渡って探索し、当該リソースを解放する命令語を検出できなければ、リソース解放洩れ通知処理部７が、当該ソースプログラムのリソース解放洩れを通知する。【選択図】図１
2008226208.tif 000002
【特許請求の範囲】
【請求項１】
プログラムされたコンピュータにより、検証対象のソースプログラムにおけるリソース解放洩れを検出する方法であって、
予め検証対象のソースプログラムから機械語に変換され記憶装置に格納された実行可能プログラムを各ステップ毎に順に読み出し、リソースを確保もしくは占有する命令語を検出する第１のステップと、
該第１のステップで検出した命令語で確保もしくは占有したリソースを解放する命令語の有無を、当該実行可能プログラムにおける全ての処理経路に渡って探索する第２のステップと、
該第２のステップで上記リソースを解放する命令語を検出できなければ、当該ソースプログラムのリソース解放洩れを通知する情報を生成して出力する第３のステップと
を有することを特徴とするプログラム検証方法。
【請求項２】
プログラムされたコンピュータにより、検証対象のソースプログラムにおけるリソース解放洩れを検出する方法であって、
予め検証対象のソースプログラムから機械語に変換され記憶装置に格納された実行可能プログラムを各ステップ毎に順に読み出し、リソースを確保もしくは占有する命令語を検出する第１のステップと、
該第１のステップで検出した命令語を起点に、当該実行可能プログラムが終了するまでの全ての処理経路を探索する第２のステップと、
該第２のステップで探索した各経路毎に、上記第１のステップで検出した命令語で確保もしくは占有したリソースを解放する命令語の有無を探索する第３のステップと、
該第３のステップで上記リソースを解放する命令語を検出できない経路があれば、当該ソースプログラムのリソース解放洩れを通知する情報を生成して出力する第４のステップと
を有することを特徴とするプログラム検証方法。
【請求項３】
プログラムされたコンピュータにより、検証対象のソースプログラムにおけるリソース解放洩れを検出する方法であって、
予め検証対象のソースプログラムから機械語に変換され記憶装置に格納された実行可能プログラムを各ステップ毎に順に読み出し、リソースを確保もしくは占有する命令語を検出する第１のステップと、
該第１のステップで検出した命令語を起点に、当該実行可能プログラムが終了するまでの全ての処理経路を探索する第２のステップと、
該第２のステップで探索した各経路毎に、上記第１のステップで検出した命令語で確保もしくは占有したリソースを更新もしくは参照する命令語を検出する第３のステップと、
上記第２のステップで探索した各経路毎に、上記第１のステップで検出した命令語で確保もしくは占有したリソースを解放する命令語の有無を探索する第４のステップと、
該第４のステップで上記リソースを解放する命令語を検出できない経路があれば、当該ソースプログラムのリソース解放洩れを通知する情報を生成して出力すると共に、
上記第３のステップで最後に検出した当該リソースを更新もしくは参照する命令語の当該実行可能プログラムにおける位置情報を生成して出力する第５のステップと
を有することを特徴とするプログラム検証方法。
【請求項４】
請求項３に記載のプログラム検証方法であって、
上記第１のステップで検出した上記リソースを確保もしくは占有する命令語の当該実行可能プログラムにおける位置情報と、上記第３のステップで検出した上記リソースを更新もしくは参照する命令語の当該実行可能プログラムにおける位置情報を登録する管理テーブルを生成するステップを有し、
上記第３のステップでは、上記リソースを更新もしくは参照する命令語を検出すると、上記管理テーブルにおける当該リソースを確保もしくは占有する命令語の当該実行可能プログラムにおける位置情報を更新することを特徴とするプログラム検証方法。
【請求項５】
プログラムされたコンピュータにより、検証対象のソースプログラムにおけるリソース解放洩れを検出するシステムであって、
請求項１から請求項４のいずれかに記載のプログラム検証方法における各ステップでの処理を実行する手段を具備したことを特徴とするプログラム検証システム。
【請求項６】
コンピュータに、請求項１から請求項４のいずれかに記載のプログラム検証方法における各ステップでの処理を実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータによるプログラムにおける不具合の有無を検証する技術に係り、特に、ソースプログラムのコンパイルでは検出することのできない、動的に確保または占有したリソースに対する解放洩れの有無を検出するのに好適な技術に関するものである。
【背景技術】
【０００２】
アプリケーションプログラムの開発において、ソースプログラム上の、動的に確保または占有したメモリ領域等のリソースに対する解放洩れは、コンパイルで検出することができないため、潜在的な不良を引き起こす大きな要因の一つとなっている。従来技術では、利用者の介入を必要とするため、誤操作により、検出できない可能性がある。
【０００３】
例えば、特許文献１のように、動的に確保または占有したリソースに対する解放洩れを静的に検出するため、リソースの確保または占有と、当該リソースに対する解放との対応を記述したルールファイルのような、解析に必要となる定義情報を、利用者側で事前に用意する必要があった。
【０００４】
尚、一般的には、このようなアプリケーション開発において、動的に確保または占有したリソースに対する解放洩れを検出する場合は、開発工程のうちテスト工程上で動的に行い、実行可能プログラムを実行させたり、ソースプログラムを直接加工して、他のアプリケーションと連動させたりする。
【０００５】
このように、リソースを動的に確保または占有する処理、およびそのリソースを解放する処理は、例えば、汎用アプリケーション等が提供するアプリケーション・プログラミング・インタフェース（ＡＰＩ：Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ、以下「ＡＰＩ」と称する）を使用して行った場合、通常、ＡＰＩはブラックボックスとなっているため、内部で当該処理が行われているかどうかを静的に判断するのが困難である。
【０００６】
上述の特許文献１に記載のように、事前にルールファイルを利用者側に定義させる技術の場合、本ルールファイル自体への定義洩れや定義誤りが生じる可能性があるため、リソースの解放洩れを正確に検出できる保障がない。
【０００７】
さらに、解放洩れリソースに対する解放処理をソースプログラムに挿入する場合、当該ソースプログラムの構造が複雑であればあるほど、挿入位置を検出するのに手間と時間が掛かり、またデグレート（劣化）を引き起こす可能性を高くする。
【０００８】
【特許文献１】特開２００４−１４５３８１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
解決しようとする問題点は、従来の技術では、事前にルールファイルを利用者側に定義させる必要があり、本ルールファイル自体への定義洩れや定義誤りが生じる可能性があるため、リソースの解放洩れを正確に検出できる保障がない点と、解放洩れリソースに対する解放処理を挿入するソースプログラムにおける位置を容易に検出することができない点である。
【００１０】
本発明の目的は、これら従来技術の課題を解決し、プログラムの開発において、ルールファイルのような解析情報を必要とすることなく、動的に確保または占有したリソースに対する解放洩れ、および、リソース解放処理の挿入位置を、コーディングの段階、つまりプログラムの製造工程上で静的に検出することを可能とすることである。
【課題を解決するための手段】
【００１１】
上記目的を達成するため、本発明では、ソースプログラム上の各リソースにおいて、動的に確保または占有した位置を、例えば内部で自動作成するリソース管理テーブル等で管理し、当該位置を起点として、実行可能プログラムを基にしてマシン語（機械語）で解析し、当該プログラムが終了するまでの全ての処理経路を探索することで、当該リソースの解放洩れの検出を行うことを特徴とする。
【発明の効果】
【００１２】
本発明によれば、検証対象のソースプログラムから、動的に確保または占有したリソースに対する解放洩れの検出、および当該リソース解放処理の挿入位置の検出を、コンパイル作業の延長線上で、すなわち開発工程のうち製造工程上で、静的に検出することが可能である。特に、解析を実行可能プログラムを基にしてマシン語で行うことにより、ソースプログラムのみを基にして静的に検出することが不可能であったＡＰＩのようなブラックボックスとなっている処理が含まれている場合においても、静的な検出が可能となる。また、リソース管理テーブル等を用いて、当該リソースの更新または参照位置を保持・管理し、更新または参照されるたびにリソース管理テーブルにおける各当該位置を更新するで、最終当該位置を認識しておくことにより、動的に確保または占有したリソースに対する解放洩れが検出された場合、最終当該位置を解放処理挿入位置として判断し、その旨を利用者に通知することができる。
【発明を実施するための最良の形態】
【００１３】
以下、図を用いて本発明を実施するための最良の形態例を説明する。図１は、本発明に係るプログラム検証システムの構成例を示すブロック図であり、図２は、図１におけるリソース確保・占有位置探索処理部の処理動作例を示すフローチャート、図３は、図１におけるリソース解放位置探索処理部の処理動作例を示すフローチャート、図４は、図１におけるリソース管理テーブル更新処理部の処理動作例を示すフローチャート、図５は、図１におけるソースプログラムとリソース管理テーブルのそれぞれのサンプル例を示す説明図、図６は、図１におけるステップ位置対応管理テーブルのサンプル例を示す説明図、図７は、図１におけるプログラム検証システムの処理動作例を示す説明図である。
【００１４】
図１におけるプログラム検証システムは、プログラムされたコンピュータにより、検証対象のソースプログラムにおけるリソース解放洩れを検出するものであり、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）や主メモリ、表示装置、入力装置、外部記憶装置からなるコンピュータ構成からなり、光ディスク駆動装置等を介してＣＤ−ＲＯＭ等の記憶媒体に記録されたプログラムやデータを外部記憶装置内にインストールした後、この外部記憶装置から主メモリに読み込みＣＰＵで処理することにより、各処理部の機能を実行する。
【００１５】
図１において、プログラム検証システム（図中「リソースの解放洩れおよび解放処理挿入位置の検出システム」と記載）は、プログラムを用いたコンピュータ処理で実現する機能として、リソース確保・占有位置探索処理部（図中「リソース確保および占有位置の探索」と記載）２と、リソース解放位置探索処理部（図中「リソース解放位置の探索」と記載）４、および、リソース管理テーブル更新処理部（図中「リソース管理テーブルの更新」と記載）５、リソース解放洩れ通知処理部（図中「リソース解放洩れの通知」と記載）７を有し、検証対象となるソースプログラム１を入力して、内部にステップ位置対応管理テーブル３およびリソース管理テーブル６を生成して、これらのテーブルの参照・更新処理を行って、リソース解放洩れと解放処理挿入位置の検出を行い、その結果を記憶装置あるいは表示装置やプリンタ（印字装置）等の出力装置（図中「リソース解放洩れ有無と解放処理挿入位置の出力」と記載）８に出力する。
【００１６】
すなわち、リソース確保・占有位置探索処理部２は、検証対象のソースプログラム１を変換して機械語からなる実行可能プログラムを生成し、当該実行可能プログラムの各ステップを順に読み出し、リソースを確保もしくは占有する命令語を検出する。
【００１７】
リソース解放位置探索処理部４は、リソース確保・占有位置探索処理部２が検出した命令語で確保もしくは占有したリソースを解放する命令語の有無を、当該実行可能プログラムにおける全ての処理経路に渡って探索する。
【００１８】
リソース解放洩れ通知処理部７は、リソース解放位置探索処理部４が当該リソースを解放する命令語を検出できなければ、当該ソースプログラムのリソース解放洩れを通知する情報を生成して出力装置８を介して出力する。
【００１９】
尚、リソース確保・占有位置探索処理部２は、ソースプログラム１から実行可能プログラムを生成する際、図６に示すように、ステップ位置対応管理テーブル３を生成して、ソースプログラム１のステップ位置と、それに対応する実行可能プログラムのステップ位置（開始位置および終了位置）とを対応付けて登録する。
【００２０】
また、リソース解放位置探索処理部４は、リソース確保・占有位置探索処理部２が検出した命令語を起点に、当該実行可能プログラムが終了するまでの全ての処理経路を探索し、探索した各経路毎に、リソース確保・占有位置探索処理部２が検出した命令語で確保もしくは占有したリソースを解放する命令語の有無を探索する。
【００２１】
また、リソース管理テーブル更新処理部５は、リソース解放位置探索処理部４が探索した各経路毎に、リソース確保・占有位置探索処理部２が検出した命令語で確保もしくは占有したリソースを更新もしくは参照する命令語を検出し、図５に例示する内容のリソース管理テーブル６を生成して、検出した命令語の当該実行可能プログラムにおける位置情報を登録する。
【００２２】
そして、リソース解放洩れ通知処理部７は、リソース解放位置探索処理部４の検出結果に基づく当該ソースプログラムのリソース解放洩れを通知する情報を生成する際、リソース管理テーブル更新処理部５が生成し更新したリソース管理テーブル６を参照して、最後に更新もしくは参照した当該命令語の当該実行可能プログラムにおける位置情報を生成し、それぞれを出力装置８を介して出力する。
【００２３】
以下、図２を用いて、このようなリソース確保および占有位置の探索に関する処理の流れ、特に、リソース確保・占有位置探索処理部２の処理に関連して説明する。
【００２４】
図２において、まず、入力ファイルであるソースプログラム２０１を読み込み（ステップ２０２）、コード変換（ステップ２０３）をすることで実行可能プログラム２０４を作成する。
【００２５】
それと同時に、ソースプログラム２０１と実行可能プログラム２０４のステップ位置を対応付けたステップ位置対応管理テーブル３を作成し（ステップ２０５）、解析の対象となる実行可能プログラム２０４をマシン語として読み込む（ステップ２０６）。
【００２６】
尚、ここで、外部ライブラリ等、他に取り込むファイルがあれば、同様にマシン語として読み込む。以下、ステップ２０７からステップ２０７’までの処理を繰り返す。
【００２７】
すなわち、実行可能プログラム２０４を１ステップ読み込んで（ステップ２０８）、当該ステップが動的にリソースを確保または占有する処理、つまり当該処理を行う命令語を使用している場合（ステップ２０９）、図３に詳細を示す、リソース解放位置探索処理部４による当該リソースに対する解放処理位置の探索処理を行う（ステップ２１０）。
【００２８】
図３に示すように、リソース解放位置探索処理部４は、解放処理の位置を探索する対象リソースを起点として、実行可能プログラム２０４が終了するまでの、シミュレーション探索した経路１つずつに対して、以降に説明する処理を繰り返し行う（ステップ３０１，３０１’）。
【００２９】
まず、解放処理の位置を探索する対象リソースに付与された識別名であるリソース名称（変数名称）を、内部で用意したリソース管理テーブル６に登録し（ステップ３０２）、次に、当該リソースを起点として当該経路の終了まで以下の処理を繰り返し行う（ステップ３０３，３０３’）。
【００３０】
すなわち、シミュレーション探索した１つの経路に従って、実行可能プログラム２０４を１ステップずつ読み込み（ステップ３０４）、当該ステップが当該リソースの更新または参照処理、つまり当該リソース名称を使用しているか（ステップ３０５）、または当該リソースの解放処理、つまり当該処理を行う命令語を使用しているか（ステップ３０７）を判別する。
【００３１】
ステップ３０５において当該ステップが当該リソースの更新または参照処理、つまり当該リソース名称を使用している場合、ステップ３０７においてまたは当該リソースの解放処理、つまり当該処理を行う命令語を使用している場合には、それぞれ、図４に詳細を示す、リソース管理テーブル更新処理部５によるリソース管理テーブル６の更新処理を行う（ステップ３０６）。
【００３２】
ステップ３０５およびステップ３０７での判別がいずれも否（Ｎ）で、当該ステップが実行可能プログラム２０４の終了処理、つまり当該処理を行う命令語を使用している場合（ステップ３０８）には、リソース管理テーブル２０４の登録情報を読み込み参照して、当該リソースの解放洩れの有無について、また解放洩れがある場合は、さらに当該リソース解放処理の挿入位置について、利用者に通知する（ステップ３０９）。
【００３３】
図４に示すようにして、図１に示すリソース管理テーブル更新処理部５は、リソース管理テーブル６の更新処理を行う。
【００３４】
まず、当該リソースが他関数に引き渡される等のような処理により、当該リソース名称が新規に変更された場合（ステップ４０１）、当該リソース名称を、図５に示すリソース管理テーブル６上にあるリソース名称テーブルに追加する（ステップ４０２）。
【００３５】
また、当該リソース名称が変更された場合には（ステップ４０３）、現行リソース名称を当該リソース名称に変更する（ステップ４０４）。尚、別処理から元の処理に戻ったことにより、当該リソース名称が既存（一つ前）の名称に変更された場合にも（ステップ４０３）も、同様に現行リソース名称を当該リソース名称に変更（ステップ４０４）する。
【００３６】
また、当該リソースが更新または参照された場合には（ステップ４０５）、当該リソースの更新または参照位置を更新する（ステップ４０６）。
【００３７】
また、当該リソースに対する解放処理が行われた場合であれば（ステップ４０７）、当該リソースの更新または参照位置を「０」に更新・設定する（ステップ４１０）。
【００３８】
尚、この際、すでに解放されている、つまり当該リソースの更新または参照位置が「０」になっている場合には（ステップ４０８）、すでに解放されたリソースに対して再度解放を行っているため、解放処理が過多である旨のエラー情報を生成して利用者に通知する（ステップ４０９）。
【００３９】
このようにして更新処理されるソース管理テーブル６の詳細を図５に示す。本図５に示すリソース管理テーブル６は、現行のリソース名称、当該リソースの更新または参照位置、リソース名称テーブルから構成されている。
【００４０】
リソース名称テーブルは、ソースプログラムサンプルのように、処理探索途中で対象リソースの名称が変更になった場合のための管理テーブルであり、チェーン構造となっている。
【００４１】
現行リソース名称は、リソース管理テーブル６に格納されているリソース名称のアドレスで管理する。
【００４２】
当該リソースの更新または参照位置には、解放された場合は「０」、解放されていない場合は「０」以外のステップ位置が格納される。
【００４３】
従って、図３に示した処理で、ステップ３０８において、当該ステップが実行可能プログラム２０４の終了処理の場合で、当該リソースの更新または参照位置が「０」の場合は当該リソースの解放洩れなし、「０」以外の場合は当該リソースの解放洩れありとそれぞれ判断して、その結果を、また後者の場合は、格納されたステップ位置も併せて、利用者に通知する（ステップ３０９）。
【００４４】
尚、本図５は、ソースプログラムサンプルにおける５００ステップ目を探索したソース管理テーブル６の登録状態を示している。この後、探索位置がソースプログラムサンプルにおける「ｆｕｎｃ１」関数に戻った時点で、リソース名称テーブルから「ｒｓｃｎａｍｅ＿３」に関する情報は削除され、現行リソース名称は「２００（ｒｓｃｎａｍｅ＿２）」、更新または参照位置は「４００」にそれぞれ更新される。
【００４５】
次に、図６を用いて、図１におけるステップ位置対応管理テーブル３の詳細について説明する。本図６において、ステップ位置対応管理テーブル３は、実行可能プログラム２０４のステップ位置（開始位置および終了位置）と、それに対応するソースプログラム２０１のステップ位置から構成される。
【００４６】
このステップ位置対応管理テーブル３は、図２のステップ２０５出力の処理で作成され、図４のステップ４０６の処理で、実行可能プログラム２０４の当該ステップ位置に対応するソースプログラム２０１のステップ位置に更新する際の参照に用いられる。
【００４７】
次に、図７を用いて、図１に示すプログラム検証システムによるリソース解放位置の探索に関する処理で行う、当該リソースに関する全処理経路の探索イメージについて説明する。
【００４８】
図７に示す例では、処理経路パターンは、「１→２→６→７」と「１→２→３→４→６→７」および「１→２→３→５→４→６→７」の３通り存在し、「条件Ａ」のように、処理（６）で当該リソースが解放されている場合、３パターンの全てで当該リソースが解放されることを判断できるが、「条件Ｂ」のように、処理（４）で当該リソースが解放されている場合、「１→２→６→７」の処理経路パターンでは、当該リソースの解放洩れがあることを検出できる。
【００４９】
以上、図１〜図７を用いて説明したように、本例では、ソースプログラム１，２０１上の各リソースにおいて、動的に確保または占有した位置を、例えば内部で自動作成するリソース管理テーブル６で管理し、当該位置を起点として、実行可能プログラム２０４を基にしてマシン語（機械語）で解析し、当該プログラムが終了するまでの全ての処理経路を探索することで、当該リソースの解放洩れの検出を行う。
【００５０】
このように、解析を実行可能プログラム２０４を基にしてマシン語で行うため、ソースプログラム１，２０１のみを基にして静的に検出することが不可能であったＡＰＩのようなブラックボックスとなっている処理が含まれている場合についても、静的に検出することが可能となる。
【００５１】
また、リソース管理テーブル６上において、当該リソースの更新または参照位置を保持し、更新または参照されるたびに各当該位置を更新することにより、最終当該位置を認識しておき、動的に確保または占有したリソースに対する解放洩れが検出された場合、当該位置を解放処理挿入位置として判断し、その旨を利用者に通知する。
【００５２】
つまり、動的に確保または占有したリソースに対する解放洩れ、および当該リソース解放処理の挿入位置を、ソースプログラム１，２０１を入力ファイルとした静的検出を行うことが可能となる。
【００５３】
このことにより、ソースプログラム１，２０１から、動的に確保または占有したリソースに対する解放洩れの検出、および当該リソース解放処理の挿入位置の検出を、コンパイル作業の延長線上で、すなわち開発工程のうち製造工程上で、静的に検出することが可能になる。
【００５４】
尚、本発明は、図１〜図７を用いて説明した例に限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能である。例えば、本例では、リソース確保・占有位置探索処理部２において、検証対象のソースプログラム１を変換して機械語からなる実行可能プログラムを生成する構成としているが、このようなコンパイル機能、リンク機能を行う他の処理部を設けた構成とし、リソース確保・占有位置探索処理部２は、当該実行可能プログラムの各ステップを順に読み出し、リソースを確保もしくは占有する命令語を検出する機能のみを設けた構成としても良い。
【００５５】
また、本例でのコンピュータ構成に関しても、キーボードや光ディスクの駆動装置の無いコンピュータ構成としても良い。また、本例では、光ディスクを記録媒体として用いているが、ＦＤ（Fｌｅxｉbｌｅ  Dｉsk）等を記録媒体として用いることでも良い。また、プログラムのインストールに関しても、通信装置を介してネットワーク経由でプログラムをダウンロードしてインストールすることでも良い。
【図面の簡単な説明】
【００５６】
【図１】本発明に係るプログラム検証システムの構成例を示すブロック図である。
【図２】図１におけるリソース確保・占有位置探索処理部の処理動作例を示すフローチャートである。
【図３】図１におけるリソース解放位置探索処理部の処理動作例を示すフローチャートである。
【図４】図１におけるリソース管理テーブル更新処理部の処理動作例を示すフローチャートである。
【図５】図１におけるソースプログラムとリソース管理テーブルのそれぞれのサンプル例を示す説明図である。
【図６】図１におけるステップ位置対応管理テーブルのサンプル例を示す説明図である。
【図７】図１におけるプログラム検証システムの処理動作例を示す説明図である。
【符号の説明】
【００５７】
１，２０１：ソースプログラム、２：リソース確保・占有位置探索処理部、３：ステップ位置対応管理テーブル、４：リソース解放位置探索処理部、５：リソース管理テーブル更新処理部、６：リソース管理テーブル、７：リソース解放洩れ通知処理部、８：出力装置、２０４：実行可能プログラム。
【図１】
2008226208.tif 000003
【図２】
2008226208.tif 000004
【図３】
2008226208.tif 000005
【図４】
2008226208.tif 000006
【図５】
2008226208.tif 000007
【図６】
2008226208.tif 000008
【図７】
2008226208.tif 000009