(57)【要約】【課題】マルチスレッドプログラムにおける動的なメモリ領域の解放漏れを原因として発生するメモリリークを防止する。【解決手段】コード解析部２０１０は、マルチスレッドプログラムを記述するコード２０２０のうち、動的メモリ領域を確保するスレッドを記述するコードを解析し、スレッド開始点とスレッド終了点と動的メモリ確保点と動的メモリ解放点のそれぞれの場所を検出する。ただし、コード解析部２０１０は、あるスレッドが確保した動的メモリ領域が、確保したスレッドの外（親プロセスや他のスレッド）から使用される可能性がある場合は、当該スレッドのコードを解析範囲から除く。修正コード生成部２０１１は、コード解析部２０１０が検出した各点の場所に対し、未解放の動的メモリ領域を強制的に解放してから、当該動的メモリを確保したスレッドを終了する動作を行う処理を追加した修正コード２０２１を生成する。【選択図】      図１３
2014130401.tif 000002
【特許請求の範囲】
【請求項１】
１つ以上のファイルからなるファイル群に含まれるマルチスレッドプログラムを記述するコードのうち、
動的メモリ領域を確保するコードを含むスレッドを記述するコードの中から、
あるスレッドが確保した動的メモリ領域が、確保したスレッドの外から使用される可能性のある場合には、当該スレッドに関連するコードを除き、
その結果残ったコードを解析することにより、
前記スレッドが開始されるコードの場所を示すスレッド開始点と、前記スレッドが終了されるコードの場所を示すスレッド終了点と、前記スレッド内で動的なメモリ領域を確保するコードの場所を示す動的メモリ確保点と、前記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す動的メモリ解放点とを検出するコード解析手段と、
前記解析手段によって検出された前記各スレッド開始点に対応する場所に対して、前記スレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第１追加コードを追加し、
前記解析手段によって検出された前記各動的メモリ確保点に対応する場所に対して、前記管理情報に、前記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第２追加コードを追加し、
前記解析手段によって検出された前記各動的メモリ解放点に対応する場所に対して、前記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第３追加コードを追加し、
前記解析手段によって検出された前記各スレッド終了点に対応する場所に対して、前記スレッドが終了する前に前記動的メモリ領域を解放していない場合には、前記管理情報に含まれる前記動的メモリに関する前記場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第４追加コードを追加する処理を実施することにより、
前記第１乃至第４追加コードの少なくともいずれかが追加されたファイルをなす修正コードを生成する修正コード生成手段とを備える
ことを特徴とするプログラム生成装置。
【請求項２】
前記動的メモリ領域を確保したスレッドの外では、前記スレッドが確保する動的メモリ領域を利用しないことを示す通知情報をユーザが入力可能な入力手段を更に備え、
前記コード解析手段は、前記入力手段から前記通知情報が入力された場合には、通知の対象であるスレッドに関連するコードも含めて解析する
ことを特徴とする請求項１記載のプログラム生成装置。
【請求項３】
前記マルチスレッドプログラムを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、コンパイラがオブジェクトコードを生成する過程においてソースプログラムコードを変換する中間コードと同等の形式であり、
前記修正コード生成手段が追加する前記第１乃至第４追加コードと前記修正コードとを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、前記中間コードと同等の形式である
ことを特徴とする請求項１または２記載のプログラム生成装置。
【請求項４】
前記修正コード生成手段は、前記第１〜第４追加コードと修正コードとが前記中間コード形式の場合に、前記中間コードと同等の記述形式である前記各修正コードを、さらに、コンパイラが出力するオブジェクトコードと同等の記述形式に変換することにより、修正オブジェクトコードを生成する
ことを特徴とする請求項３記載のプログラム生成装置。
【請求項５】
１つ以上のファイルからなるファイル群に含まれるマルチスレッドプログラムを記述するコードのうち、
動的メモリ領域を確保するコードを含むスレッドを記述するコードの中から、
あるスレッドが確保した動的メモリ領域が、確保したスレッドの外から使用される可能性のある場合には、当該スレッドに関連するコードを除き、
その結果残ったコードを解析することにより、
前記スレッドが開始されるコードの場所を示すスレッド開始点と、前記スレッドが終了されるコードの場所を示すスレッド終了点と、前記スレッド内で動的なメモリ領域を確保するコードの場所を示す動的メモリ確保点と、前記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す動的メモリ解放点とを、情報処理装置を用いて検出し、
検出された前記各スレッド開始点に対応する場所に対して、前記スレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第１追加コードを追加し、
検出された前記各動的メモリ確保点に対応する場所に対して、前記管理情報に、前記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第２追加コードを追加し、
検出された前記各動的メモリ解放点に対応する場所に対して、前記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第３追加コードを追加し、
検出された前記各スレッド終了点に対応する場所に対して、前記スレッドが終了する前に前記動的メモリ領域を解放していない場合には、前記管理情報に含まれる前記動的メモリに関する前記場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第４追加コードを追加する処理を、情報処理装置を用いて実施することにより、
前記第１乃至第４追加コードの少なくともいずれかが追加されたファイルである修正コードを、情報処理装置を用いて生成する
ことを特徴とするプログラム生成方法。
【請求項６】
前記動的メモリ領域を確保したスレッドの外では、前記スレッドが確保する動的メモリ領域を利用しないことを示す通知情報をユーザが入力可能とし、
前記コードを解析する際に、前記通知情報が入力された場合には、通知の対象であるスレッドに関連するコードも含めて解析する
ことを特徴とする請求項５記載のプログラム生成方法。
【請求項７】
プログラム生成装置として動作するコンピュータの動作制御のためのコンピュータ・プログラムであって、そのコンピュータ・プログラムにより、
１つ以上のファイルからなるファイル群に含まれるマルチスレッドプログラムを記述するコードのうち、
動的メモリ領域を確保するコードを含むスレッドを記述するコードの中から、
あるスレッドが確保した動的メモリ領域が、確保したスレッドの外から使用される可能性のある場合には、当該スレッドに関連するコードを除き、
その結果残ったコードを解析することにより、
前記スレッドが開始されるコードの場所を示すスレッド開始点と、前記スレッドが終了されるコードの場所を示すスレッド終了点と、前記スレッド内で動的なメモリ領域を確保するコードの場所を示す動的メモリ確保点と、前記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す動的メモリ解放点とを検出するコード解析機能と、
前記解析機能によって検出された前記各スレッド開始点に対応する場所に対して、前記スレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第１追加コードを追加し、
前記解析機能によって検出された前記各動的メモリ確保点に対応する場所に対して、前記管理情報に、前記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第２追加コードを追加し、
前記解析機能によって検出された前記各動的メモリ解放点に対応する場所に対して、前記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第３追加コードを追加し、
前記解析機能によって検出された前記各スレッド終了点に対応する場所に対して、前記スレッドが終了する前に前記動的メモリ領域を解放していない場合には、前記管理情報に含まれる前記動的メモリに関する前記場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第４追加コードを追加する処理を実施することにより、
前記第１乃至第４追加コードの少なくともいずれかが追加されたファイルである修正コードを生成する修正コード生成機能とを、前記コンピュータに実現させる
ことを特徴とするコンピュータ・プログラム。
【請求項８】
前記動的メモリ領域を確保したスレッドの外では、前記スレッドが確保する動的メモリ領域を利用しないことを示す通知情報をユーザが入力可能な入力機能を更に備え、
前記コード解析機能は、前記入力機能から前記通知情報が入力された場合には、通知の対象であるスレッドに関連するコードも含めて解析する
ことを特徴とする請求項７記載のコンピュータ・プログラム。
【請求項９】
前記マルチスレッドプログラムを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、コンパイラがオブジェクトコードを生成する過程においてソースプログラムコードを変換する中間コードと同等の形式であり、
前記修正コード生成機能が追加する前記第１乃至第４追加コードと前記修正コードとを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、前記中間コードと同等の形式である
ことを特徴とする請求項７または８記載のコンピュータ・プログラム。
【請求項１０】
前記修正コード生成機能は、前記中間コードと同等の記述形式である前記各修正コードを、さらに、コンパイラが出力するオブジェクトコードと同等の記述形式に変換することにより、修正オブジェクトコードを生成する
ことを特徴とする請求項９記載のコンピュータ・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチスレッドプログラムの修正コードを生成する技術に関する。特に、本発明は、マルチスレッドプログラムにおける動的メモリ領域のメモリリークを防止する技術に関する。
【背景技術】
【０００２】
近年、プロセッサ（以下、「ＣＰＵ」と言う。なお、「ＣＰＵ」は「Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ」の略称。）の低価格化および小型化に応じて、複数のＣＰＵによって構成される並列処理システムが普及しており、それにより係るシステムにて実行されるプログラムの実行時間の短縮が一般的に図られている。
【０００３】
プログラムに従ってＣＰＵで実行される処理を複数に分割して、それらの分割された複数の処理を同時並行的に実行する場合における処理の分割単位として、プロセスとスレッドとがある。
【０００４】
プロセスは、ＣＰＵにおいて独立して実行されることができる処理単位である。新たなプロセスの生成か起動が行われる場合に、オペレーティングシステム（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ。以下、「ＯＳ」と言う。）は、ＣＰＵやメモリ空間などのリソースを当該プロセスに割り当てる。そして、割り当てられたそれらのリソースは、当該プロセスの終了時にＯＳによって自動的に解放（すなわち、割り当てを解除）される。プログラムの作成という観点では、複数のプロセスによる並列処理という方法は扱いやすい。しかし、複数のプロセスによる並列処理では、複数のプロセスにそれぞれ割り当てられるメモリ空間がそれぞれ独立してしまうためにメモリ利用効率が悪く、また、プロセス間の処理の同期や通信（データ授受など）等のオーバヘッドが発生するなどの問題がある。
【０００５】
このような問題を解決する技術として、一つのプロセス内に、複数のスレッドと呼ばれる処理単位を設け、これらの複数のスレッドを用いて並列処理を実行するという技術が存在する。複数のスレッドを使う並列処理では、同一プロセス内の複数スレッドを同一メモリ空間において実行できるため、複数のプロセスによる並列処理に比べてメモリ消費量を軽減できる。また、各プロセスが異なるメモリ空間を使用するプロセス間での同期や通信に比べて、各スレッドが同一メモリ空間を使用するスレッド間の同期や通信の方が高速であるという利点もスレッドにはある。
【０００６】
ある処理を単一のスレッドのみを用いて実行する環境または手法を「シングルスレッド」と呼び、一方、ある処理を複数のスレッドを用いて同時並行的に実行する環境または手法を「マルチスレッド」と呼ぶ。
【０００７】
このような背景から、近年の同一コンピュータ内でのプログラムの並列処理としては、マルチスレッドによる並列処理が一般的になってきている。このため、プログラムの実行時間の短縮のために、並列処理を想定していなかったプログラムをマルチスレッドで実行できるように当該プログラムを修正したり、元は複数のプロセスで並列処理していたプログラムをマルチスレッドで並列処理できるように当該プログラムを修正したりする既存プログラムの改修業務が急増している。
【０００８】
しかしながら、マルチスレッド化のためのプログラミングにおいては、複数のプロセスで並列処理するプログラムの開発には必要の無かったプログラミングに際しての注意点が存在する。
【０００９】
すなわち、１つの注意点として、スレッドに対して動的に確保したメモリ領域の解放漏れに関して注意すべきである。ここで言うメモリ領域の動的な確保とは、スレッドが、その実行中のある時点で必要になったサイズのメモリをＯＳに要求し、それに応答して、ＯＳがその時に利用できるメモリ領域を確保し、確保したメモリ領域の先頭アドレスを当該スレッドに通知することである。動的に確保したメモリ領域の識別は、そのメモリ領域の先頭アドレスを用いて行われる。例えば、ある動的メモリ領域の内容の参照は、プログラム中のメモリ参照関数命令の引数に、メモリ領域確保に際してＯＳから通知された先頭アドレスを与えることで行う。確保されたメモリ領域が不要になった場合は、その時点で、スレッドがその旨をＯＳへ通知し、ＯＳがそのメモリ領域を解放する。不要になったにもかかわらずメモリ領域を解放しないと、当該メモリ領域はメモリ領域を確保したスレッドが存在するプロセスが終了するまで確保され続け、メモリ領域の利用効率の低下を招く。
【００１０】
このように、動的なメモリ領域の解放漏れのために不要なメモリが消費され、システム内の使用可能な空きメモリ空間が減少してしまうことをメモリリークと呼ぶ。
【００１１】
あるプロセスにおいてメモリリークが頻発すると、最終的にはそのプロセスを実行するために必要なメモリ領域が確保できなくなり、そのプロセスの実行の継続が困難となる可能性がある。さらに、そのプロセスだけではなく、同一コンピュータにて実行される他のプロセスもメモリ不足で動作できない状況に陥る可能性があるため、極めて重大な問題である。
【００１２】
特に、複数のスレッドによる並列処理化（すなわちマルチスレッド化）を考慮していない既存プログラムでは、このようなメモリリークを考慮したプログラミングを行っていない可能性がある。そのような既存プログラムをマルチスレッド化して実行する場合においては、動的なメモリ領域の解放漏れを防ぐことが非常に重要な問題である。
【００１３】
また、関連技術として、特許文献１には、既存のソースプログラムを解析して、当該ソースプログラム中で、メモリ領域に静的に確保されるような名前付き変数として宣言している処理コードを、当該変数の利用期間中だけ動的なメモリ領域として割り付けるようなコードに変換する方法が開示されている。ここで、「メモリ領域に静的に確保する」とは、プログラムの開始に伴いメモリ領域が確保され、その利用有無に関わらず、プログラムの終了時まで固定的にメモリが占有され続けるように確保することである。すなわち、静的にメモリ領域を確保する場合、プログラムから途中でメモリ領域を解放させることはできない。
【００１４】
この特許文献１に記載された方法においては、静的なメモリ領域として確保される変数の名前をキーにソースプログラムを検索し、一番初めに当該変数を利用するコードの直前に動的なメモリ領域として確保するコードを埋め込み、さらに、一番最後に当該変数を利用するコードを漏れなく検出して、その直後に当該動的なメモリ領域の解放を行うコードを埋め込むことで、当該変数のためのメモリ領域の占有期間を利用期間だけに限定させることを実現している。
【先行技術文献】
【特許文献】
【００１５】
【特許文献１】特開２０１０−１１８０２５号公報
【発明の概要】
【発明が解決しようとする課題】
【００１６】
しかしながら、上述したような、動的なメモリ領域の確保を行いながら処理を行うマルチスレッドプログラムのソースコードにおいて、メモリ領域の解放漏れを防ぐための当該ソースコードの確認（すなわち、メモリ領域を解放するための解放命令がプログラム中の適切な箇所に挿入されているか否かの確認）は、一般的にプログラマーの手作業で行われる。このため、プログラマーの負担が大きいとともに、解放命令の挿入忘れ等も発生する可能性があるという問題がある。
【００１７】
また、特許文献１に開示された技術においては、静的なメモリ領域として確保した変数の名前を検索キーとして利用している。このため、特許文献１は、特定の名前ではなくメモリ領域の先頭アドレスを用いて識別される動的なメモリ領域の確保を行いながら処理を行うプログラムに対しては適用することができないという問題がある。
【００１８】
本発明の主たる目的は、既存のマルチスレッドプログラムにおいて、スレッド内で動的に確保したメモリ領域の解放漏れによるメモリリークを防ぐ情報処理装置等を提供することにある。
【課題を解決するための手段】
【００１９】
上記の目的を達成すべく、本発明に係るプログラム生成装置は、以下の構成を備えることを特徴とする。
【００２０】
すなわち、本発明に係るプログラム生成装置は、１つ以上のファイルからなるファイル群に含まれるマルチスレッドプログラムを記述するコードのうち、
動的メモリ領域を確保するコードを含むスレッドを記述するコードの中から、
あるスレッドが確保した動的メモリ領域が、確保したスレッドの外から使用される可能性のある場合には、当該スレッドに関連するコードを除き、
その結果残ったコードを解析することにより、
前記スレッドが開始されるコードの場所を示すスレッド開始点と、前記スレッドが終了されるコードの場所を示すスレッド終了点と、前記スレッド内で動的なメモリ領域を確保するコードの場所を示す動的メモリ確保点と、前記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す動的メモリ解放点とを検出するコード解析手段と、
前記解析手段によって検出された前記各スレッド開始点に対応する場所に対して、前記スレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第１追加コードを追加し、
前記解析手段によって検出された前記各動的メモリ確保点に対応する場所に対して、前記管理情報に、前記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第２追加コードを追加し、
前記解析手段によって検出された前記各動的メモリ解放点に対応する場所に対して、前記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第３追加コードを追加し、
前記解析手段によって検出された前記各スレッド終了点に対応する場所に対して、前記スレッドが終了する前に前記動的メモリ領域を解放していない場合には、前記管理情報に含まれる前記動的メモリに関する前記場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第４追加コードを追加する処理を実施することにより、
前記第１乃至第４追加コードの少なくともいずれかが追加されたファイルである修正コードを生成する修正コード生成手段とを備える
ことを特徴とする。
【００２１】
また、上記の同目的を達成すべく、本発明に係るプログラム生成方法は、１つ以上のファイルからなるファイル群に含まれるマルチスレッドプログラムを記述するコードのうち、
動的メモリ領域を確保するコードを含むスレッドを記述するコードの中から、
あるスレッドが確保した動的メモリ領域が、確保したスレッドの外から使用される可能性のある場合には、当該スレッドに関連するコードを除き、
その結果残ったコードを解析することにより、
前記スレッドが開始されるコードの場所を示すスレッド開始点と、前記スレッドが終了されるコードの場所を示すスレッド終了点と、前記スレッド内で動的なメモリ領域を確保するコードの場所を示す動的メモリ確保点と、前記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す動的メモリ解放点とを、情報処理装置を用いて検出し、
検出された前記各スレッド開始点に対応する場所に対して、前記スレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第１追加コードを追加し、
検出された前記各動的メモリ確保点に対応する場所に対して、前記管理情報に、前記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第２追加コードを追加し、
検出された前記各動的メモリ解放点に対応する場所に対して、前記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第３追加コードを追加し、
検出された前記各スレッド終了点に対応する場所に対して、前記スレッドが終了する前に前記動的メモリ領域を解放していない場合には、前記管理情報に含まれる前記動的メモリに関する前記場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第４追加コードを追加する処理を、情報処理装置を用いて実施することにより、
前記第１乃至第４追加コードの少なくともいずれかが追加されたファイルをなす修正コードを、情報処理装置を用いて生成する
ことを特徴とする。
【００２２】
さらに、同目的は、本発明の上記の各構成を備えるプログラム生成装置、並びに対応する方法を、コンピュータによって実現するコンピュータ・プログラム、及びそのコンピュータ・プログラムが格納されている、コンピュータ読み取り可能な記憶媒体によっても達成される。
【発明の効果】
【００２３】
本発明には、スレッドで動的に確保したメモリ領域の解放漏れによるメモリリークの発生を確実に防止できるという効果がある。
【図面の簡単な説明】
【００２４】
【図１】本発明の第１の実施形態の構成を示すブロック図である。
【図２】本発明の第１の実施形態におけるソースプログラム１０１に含まれる第１のファイル（ｆｉｌｅ０１．ｃ）の一例を示す図である。
【図３】本発明の第１の実施形態におけるソースプログラム１０１に含まれる第２のファイル（ｆｉｌｅ０２．ｃ）の一例を示す図である。
【図４】本発明の第１の実施形態におけるソースプログラム１０１に含まれる第３のファイル（ｆｉｌｅ０３．ｃ）の一例を示す図である。
【図５】本発明の第１の実施形態におけるソースプログラムのコードの解析処理の動作を示すフローチャートである。
【図６】本発明の第１の実施形態におけるソースプログラムのコードの解析処理において作成される処理フローの一例である。
【図７】本発明の第１の実施形態におけるスレッド内部情報テーブル１２１の構成を示す図である。
【図８】本発明の第１の実施形態における修正ソースプログラムの修正コードの生成処理の動作を示すフローチャートである。
【図９】本発明の第１の実施形態における修正ソースプログラム１０２に含まれる第１のファイル（ｆｉｌｅ０１．ｃ）の一例を示す図である。
【図１０】本発明の第１の実施形態における修正ソースプログラム１０２に含まれる第２のファイル（ｆｉｌｅ０２．ｃ）の一例を示す図である。
【図１１】本発明の第１の実施形態における修正後のソースプログラムに基づいて動作させたマルチスレッドプログラムの動作中の一時点での管理テーブルと動的メモリ領域の関係を示す模式図である。
【図１２】本発明の第２の実施形態の構成を示すブロック図である。
【図１３】本発明の第３の実施形態の構成を示すブロック図である。
【発明を実施するための形態】
【００２５】
次に、本発明の実施形態について図面を参照して詳細に説明する。
【００２６】
＜第１の実施形態＞
図１は、本発明の第１の実施形態の構成を示すブロック図である。
【００２７】
図１を参照すると、本実施形態は、二次記憶装置１００および処理装置１１０から構成される。
【００２８】
処理装置１１０は、プログラム制御により動作する一般的な情報処理装置（コンピュータ）によって構成されても良いし、専用のハードウェアによって構成されても良い。また、処理装置１１０は、プロセッサであってもよい。
【００２９】
二次記憶装置１００は、ハードディスクなどの記憶装置であり、処理装置１１０が処理対象とするプログラムのソースプログラム１０１を記憶している。また、二次記憶装置１００には、処理装置１１０が生成する修正コードである修正ソースプログラム１０２を格納する。ソースプログラム１０１および修正ソースプログラム１０２は、それぞれ１つのプログラムとして実行するプログラムについて記述したコードを含む、１つ以上のファイルの集合体である。
【００３０】
処理装置１１０は、ソースプログラム解析部１１１、修正ソースプログラム生成部１１２および主記憶装置１２０を含む。
【００３１】
ソースプログラム解析部１１１は、二次記憶装置１００からソースプログラム１０１を読み込み、該ソースプログラム１０１のコードを解析することによって検出した、例えば４種のスレッド内部情報を、後述するスレッド内部情報テーブル１２１に登録する。
【００３２】
４種のスレッド内部情報とは、「スレッド開始点ＳＰ」、「スレッド終了点ＥＰ」、「動的メモリ確保点ＭＰ」、そして、「動的メモリ解放点ＦＰ」である。なお、本説明では、動的に確保されたメモリ領域を「動的メモリ」または「動的メモリ領域」とも称する。
【００３３】
具体的には、「スレッド開始点ＳＰ」は、プログラム中でスレッドが開始されるコードの場所である。「スレッド終了点ＥＰ」は、プログラム中でスレッドが終了されるコードの場所である。「動的メモリ確保点ＭＰ」は、スレッド内で動的なメモリ領域を確保したコードの場所である。「動的メモリ解放点ＦＰ」は、スレッド内で確保された動的メモリ領域を解放したコードの場所である。ソースプログラム解析部１１１は、一つのコードの場所に対して１つのスレッド内部情報を作成する。スレッド内部情報は、コードの場所を示す「ファイル名」情報および「行番号」情報、スレッド内部情報の種別を示す「種別」情報とで構成する。
【００３４】
修正ソースプログラム生成部１１２は、ソースプログラム１０１およびスレッド内部情報テーブル１２１に登録された情報から修正コードをを生成し、二次記憶装置１００に出力する。本実施形態では、修正コードは、修正ソースプログラム１０２である。
【００３５】
主記憶装置１２０は、例えば、半導体メモリ装置を用いて実現され、スレッド内部情報テーブル１２１を記憶する。
【００３６】
スレッド内部情報テーブル１２１は、ソースプログラム解析部１１１から登録される上記４種のスレッド内部情報を記憶する。
【００３７】
次に、上述した構成を備える本実施形態の動作について詳細に説明する。
【００３８】
本実施形態に係る処理装置１１０の動作は、ソースプログラムのコードを解析する解析処理と、そのソースプログラムの修正ソースプログラムを生成する生成処理とを含む。まず、図２〜図５を参照して、ソースプログラムのコード解析処理の動作を説明する。
【００３９】
図２は、本発明の第１の実施形態におけるソースプログラム１０１に含まれる第１のファイル（ｆｉｌｅ０１．ｃ）の一例を示す図である。図３は、本発明の第１の実施形態におけるソースプログラム１０１に含まれる第２のファイル（ｆｉｌｅ０２．ｃ）の一例を示す図である。図４は、本発明の第１の実施形態におけるソースプログラム１０１に含まれる第３のファイル（ｆｉｌｅ０３．ｃ）の一例を示す図である。図５は、本発明の第１の実施形態におけるソースプログラムのコードの解析処理の動作を示すフローチャートである。
【００４０】
まず、本実施形態におけるソースプログラム１０１は、例えば、Ｃ言語で記述されており、図２〜図４に示す３つのファイルから構成されるものとする。なお、ソースプログラム１０１を構成する第１〜第３のファイルのファイル名は、それぞれｆｉｌｅ０１．ｃ（図２）、ｆｉｌｅ０２．ｃ（図３）およびｆｉｌｅ０３．ｃ（図４）である。また、図２〜図４の各図における各行の先頭の３桁の数字は、説明のために表示した行番号であり、ソースプログラムのコードには含まれない。
【００４１】
また、本実施形態の動作開始前においては、二次記憶装置１００は、ソースプログラム１０１のみを格納している。修正ソースプログラム１０２は、動作開始前においては、まだ存在しない。
【００４２】
次に、利用者（図示せず）が、解析対象であるソースプログラム１０１に含まれる全てのファイル（ｆｉｌｅ０１．ｃ、ｆｉｌｅ０２．ｃおよびｆｉｌｅ０３．ｃ）を指定して、ソースプログラム解析部１１１を起動する。
【００４３】
起動したソースプログラム解析部１１１は、指定されたファイル名の示す３つのファイルからなるソースプログラム１０１を、二次記憶装置１００から読み込む。そして、ソースプログラム解析部１１１は、読み込んだソースプログラム１０１の全ファイルを解析し、解析結果を基にプログラムの処理フローを作成する（ステップＳ１００）。ここで、処理フローとは、プログラムを実行したときに通る可能性のあるサブルーチンを通過する順番につないだ全経路を表したものであり、制御フローグラフとも呼ばれる。処理フローの一例として、ソースプログラム解析部１１１がソースプログラム１０１を解析した際の処理フローを図６に示す。図６は、本発明の第１の実施形態におけるソースプログラムのコードの解析処理において作成される処理フローの一例である。なお、図６において、点線の枠で示す部分は、説明のために記載した参考情報であり、本ステップで作成する処理フローには存在しない情報である。また、処理フローを作成するための解析方法については、データフロー解析などの一般的な技法を採用することができるので、本実施形態における説明を省略する。
【００４４】
なお、サブルーチンとは、複数の作業の固まりを一つの手続きとしてまとめたものであり、Ｃ言語のソースコードにおいては、一番外側の「｛」と「｝」とで囲まれるコードブロックとして識別することができる。一般に、このようなサブルーチンも「関数」と呼ぶことがあるが、本明細書では、標準関数やＡＰＩ（Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ）として開発者に提供される関数と区別するために、原則として、開発者がソースプログラム１０１の中に作成した上記のようなコードブロックのことを「サブルーチン」と呼ぶ。
【００４５】
次に、ソースプログラム解析部１１１は、作成した処理フローに基づいて決定した順番で、読み込んだソースプログラム１０１の全ファイルから、スレッドを生成する関数（以降、「スレッド生成関数」と呼ぶ。）を検索する（ステップＳ１０１）。
【００４６】
まず、ソースプログラム解析部１１１は、処理フローの一番上のサブルーチンから検索を始め、以降、経路の下の方にあるサブルーチンを順に検索する。処理フローの経路中に分岐点がある場合、ソースプログラム解析部１１１は、処理フローの最も左側のサブルーチンを先に検索し、その経路の下端のサブルーチンを検索し終えた後、当該分岐点に戻って右隣のサブルーチンの検索に進む。以下、同様にして、ソースプログラム解析部１１１は、処理フローの上から下、左から右の順に、サブルーチンの検索順を定める。
【００４７】
ソースプログラム解析部１１１は、上述したようにして処理フローに基づいて検索対象のサブルーチンを決めた後、スレッド生成関数の関数名を表す文字列を検索キーとして、当該検索対象のサブルーチンが含まれるソースプログラム１０１のファイル内の当該サブルーチンのコードブロックを検索する。本実施形態では、スレッド生成関数の関数名を表す文字列を「ｃｒｅａｔｅ＿ｔｈｒｅａｄ」とする。
【００４８】
すなわち、図６を参照すると、ソースプログラム解析部１１１は、初めに第１のファイルの「ｍａｉｎ」サブルーチン（図２の０５０行目から０９０行目まで）を検索し、これにより図２の０７０行目および０７５行目の２箇所でスレッド生成関数の関数名を含むコードを検出する。次に、ソースプログラム解析部１１１は、分岐点の一番左端の「ｓｔａｒｔ＿ｔｈｒｅａｄ」サブルーチンを検索し、その次に、その配下の「ｆｕｎｃ０１」サブルーチン、「ｆｕｎｃ０３」サブルーチンおよび「ｆｕｎｃ０２」サブルーチンを検索する。その後、ソースプログラム解析部１１１は、当該分岐点に戻って右隣の「ｓｔａｒｔ＿ｔｈｒｅａｄ２」サブルーチンおよびその配下を検索する。ソースプログラム解析部１１１は、最後の「ｆｕｎｃ２００」サブルーチンまで、ソースプログラム１０１に含まれる全てのプログラムコードを漏れなく検索する。本実施形態では、ソースプログラム解析部１１１が検出するスレッド生成関数は、上述した「ｍａｉｎ」サブルーチン内の２箇所だけである。
【００４９】
ここで、もし、スレッド生成関数が１つも検出されず、ソースプログラム１０１にスレッド生成関数が存在しない場合は、当該ソースプログラム１０１はスレッドを利用するプログラムではないため、本実施形態の適用対象外であることを意味する。したがって、この場合、ソースプログラム解析部１１１は、全ての処理を中止して終了する。
【００５０】
なお、ソースプログラム解析処理部１１１は、これ以降の解析処理（ステップＳ１０２〜ステップＳ１０８）を各スレッド生成関数で生成されるスレッドごとに順番に行う。すなわち、ソースプログラム解析処理部１１１は、先に検出された第１のファイル（図２）の０７０行目（第１のスレッド生成関数）に関連する部分について一連の解析処理を行ってから、次に検出された第１のファイル（図２）の０７５行目（第２のスレッド生成関数）に関連する部分について同様の解析処理を繰り返す。なお、図６に示す非スレッド６０２の枠内の処理フローは、スレッド生成関数が呼ばれずに実行される部分（すなわち、スレッド内ではなく親プロセス自身が実行するコードの部分）である。
【００５１】
以下では、先に検出された第１のスレッド生成関数（図２の０７０行目）で生成された「第１のスレッド６００（図６）」に対する処理を主な例として説明する。
【００５２】
スレッド生成関数が存在する場合、次に、ソースプログラム解析部１１１は、読み込んだソースプログラム１０１を構成するファイルの中から、スレッド生成関数で生成したスレッドを開始する関数（以降、「スレッド開始関数」と呼ぶ。）が定義されている場所である「スレッド開始点ＳＰ」を検索する。ここで、ソースプログラム解析部１１１が検索する順番は、処理フローに基づいて決定した順番とする。そして、ソースプログラム解析部１１１は、検出したスレッド開始関数の定義の場所を示すファイル名と行番号とを、「スレッド開始点ＳＰ」のスレッド内部情報として、スレッド内部情報テーブル１２１に登録する（ステップＳ１０２）。
【００５３】
なお、Ｃ言語において、スレッド開始関数の関数名は、スレッド生成関数の引数（関数に続く括弧の中）として指定される。すなわち、スレッド開始関数においては、開発者の作成した「サブルーチン」が「関数」でもある。
【００５４】
ステップＳ１０２において、まず、ソースプログラム解析部１１１は、ステップＳ１０１で検出したスレッド生成関数の引数の文字列からスレッド開始関数の関数名を得る。すなわち、本実施形態では、第１のスレッド生成関数は「ｃｒｅａｔｅ＿ｔｈｒｅａｄ（ｓｔａｒｔ＿ｔｈｒｅａｄ）」であるから、スレッド開始関数の関数名は「ｓｔａｒｔ＿ｔｈｒｅａｄ」である。
【００５５】
次に、ソースプログラム解析部１１１は、スレッド開始関数の関数名の文字列を検索キーとして、読み込んだソースプログラム１０１を構成するファイルの中から、スレッド開始関数が定義されている場所を検索する。ソースプログラム解析部１１１がスレッド開始関数を検索する方法は、スレッド生成関数の検索（ステップＳ１０１）と同様である。ただし、スレッド開始関数の定義の場所は、ソースプログラム１０１内で１箇所だけなので、スレッド開始関数の定義を検出した時点で検索を終了してよい。本実施形態では、ソースプログラム解析部１１１は、「ｓｔａｒｔ＿ｔｈｒｅａｄ」を検索キーとして検索を行い、第１のファイル（図２）の１００行目に第１のスレッド開始関数を定義するコードを検出する。
【００５６】
次に、ソースプログラム解析部１１１は、検出したスレッド開始関数の定義の場所を示すファイル名と行番号とを、「スレッド開始点ＳＰ」のスレッド内部情報として、スレッド内部情報テーブル１２１に登録する。
【００５７】
ソースプログラム解析部１１１は、初めてスレッド内部情報を登録するとき、主記憶装置１２０にスレッド内部情報テーブル１２１を生成する。
【００５８】
スレッド内部情報テーブル１２１は、スレッド内部情報の通し番号情報を登録する項番欄と、スレッド内部情報を検出したソースプログラムのファイル名情報を登録するファイル名欄と、スレッド内部情報を検出したコードの場所を示す当該ソースプログラム内の行番号情報を登録する行番号欄と、スレッド内部情報の種別を示す種別情報を登録する種別欄とから構成される。スレッド内部情報の種別情報には、「スレッド開始点」、「スレッド終了点」、「動的メモリ確保点」および「動的メモリ解放点」の４種がある。図７は、本発明の第１の実施形態におけるスレッド内部情報テーブル１２１の構成を示す図である。
【００５９】
ここでは、ソースプログラム解析部１１１は、４種のうちの「スレッド開始点ＳＰ」を登録する。すなわち、ソースプログラム解析部１１１は、スレッド内部情報テーブル１２１を生成した後、項番欄を「１」とし、ファイル名欄を「ｆｉｌｅ０１．ｃ」とし、行番号欄を「１００」とし、さらに種別欄を「スレッド開始点」としたスレッド内部情報をスレッド内部情報テーブル１２１に登録する。
【００６０】
以上が、ソースプログラム解析部１１１のステップＳ１０２における処理である。
【００６１】
次に、ソースプログラム解析部１１１は、検出したスレッド開始関数の終了する場所である「スレッド終了点ＥＰ」を検索する。そして、ソースプログラム解析部１１１は、検出した全てのスレッド終了点ＥＰの場所を示すファイル名と行番号とを、１つのスレッド終了点ＥＰに対して１つのスレッド内部情報として、スレッド内部情報テーブル１２１に登録する（ステップＳ１０３）。
【００６２】
Ｃ言語では、スレッド開始関数の終了する場所は、スレッド開始関数であるサブルーチン内に含まれる「ｒｅｔｕｒｎ」というコードがある行（以降、「ｒｅｔｕｒｎ行」と言う。）、および、当該サブルーチンの最後の行（すなわち、スレッド開始関数の初めの中括弧「｛」に対応する閉じ中括弧「｝」のある行）である。なお、スレッド開始関数の終了方法は、言語の仕様に応じて様々である。
【００６３】
スレッド終了点ＥＰの検索において、まず、ソースプログラム解析部１１１は、スレッド開始関数の定義の場所から、「ｒｅｔｕｒｎ」という文字列を検索キーとして、スレッド開始関数の最終行まで検索を行う。なお、一つのスレッド開始関数に対してスレッド終了点ＥＰは複数存在することがあるので、ソースプログラム解析部１１１は、途中でスレッド終了点ＥＰを検出したとしても、スレッド開始関数であるサブルーチンの最終行まで検索する。本実施形態では、ソースプログラム解析部１１１は、スレッド開始関数のサブルーチンの範囲である第１のファイル（図２）の１００行目〜１０８行目の間で「ｒｅｔｕｒｎ」という文字列を検索し、これにより１０６行目にのみ当該文字列を検出する。すなわち、ソースプログラム解析部１１１が、ここで検出するスレッド終了点ＥＰは、ｒｅｔｕｒｎ行である１０６行目と、スレッド開始関数の最終行である１０８行目の２つである。
【００６４】
その後、ソースプログラム解析部１１１は、検出した全てのスレッド終了点ＥＰの場所を示すファイル名と行番号とを、１つのスレッド終了点ＥＰに対して１つのスレッド内部情報として、スレッド内部情報テーブル１２１に登録する。すなわち、ソースプログラム解析部１１１は、検出した「ｒｅｔｕｒｎ」行について、項番欄を「２」とし、ファイル名欄を「ｆｉｌｅ０１．ｃ」とし、行番号欄を「１０６」とし、さらに種別欄を「スレッド終了点」としたスレッド内部情報をスレッド内部情報テーブル１２１に登録する。ソースプログラム解析部１１１は、スレッド開始関数の最終行についても、同様にスレッド内部情報テーブル１２１に登録する。登録した結果は、図７の項番２及び項番３の列に示すとおりである。
【００６５】
次に、ソースプログラム解析部１１１は、現在解析しているスレッドのスレッド開始関数から呼び出される全てのサブルーチンに対して、作成した処理フローに基づいて決定した順番で、動的メモリ領域を確保する関数（動的メモリ確保点ＭＰ）を検索する。（ステップＳ１０４）。
【００６６】
Ｃ言語では、利用するＡＰＩなどに応じて動的メモリ領域を確保する動作を含む関数はいくつかある。ただし、本実施形態では、動的メモリ領域を確保する関数の関数名を表す文字列を「ｍａｌｌｏｃ」とする。
【００６７】
また、ここでソースプログラム解析部１１１が行う検索の対象範囲は、現在解析中である第１のスレッドのスレッド開始関数以下の範囲（図６に示す第１のスレッド６００の枠内）である。すなわち、ソースプログラム解析部１１１による検索は、「ｍａｌｌｏｃ」という文字列を検索キーとし、処理フローの「ｓｔａｒｔ＿ｔｈｒｅａｄ」サブルーチンから検索を始めて、次に「ｆｕｎｃ０１」サブルーチン、そして「ｆｕｎｃ０２」サブルーチンを検索して終了する。なお、動的メモリ確保点ＭＰは複数存在することがあるので、ソースプログラム解析部１１１は、途中で動的メモリ確保点ＭＰが検出されたとしても、検索順が最後のサブルーチンの最終行まで検索する。本実施形態では、ソースプログラム解析部１１１は、「ｆｕｎｃ０１」サブルーチンの中で１箇所（第２のファイル（図３）の１０２行目）だけ動的メモリ領域を確保する関数を示す文字列を検出する。
【００６８】
次に、ソースプログラム解析部１１１は、動的メモリ領域を確保する関数が存在したかどうかを確認する（ステップＳ１０５）。
【００６９】
もし、ステップＳ１０４で動的メモリ領域を確保する関数が１つも検出されないならば、現在解析中のスレッドでは動的メモリ領域を使用していないので、すなわち、メモリ解放漏れの問題も起こらないことを意味する。したがって、この場合、ソースプログラム解析部１１１は、現在解析中のスレッドに関するスレッド内部情報テーブル１２１に登録した情報を削除すると共に、当該スレッドに関する処理を中止する。すなわち、ソースプログラム解析部１１１は、スレッド内部情報テーブル１２１に登録された最後のスレッド開始点ＳＰ以降のスレッド内部情報を消去する。そして、次の未処理スレッドがあれば（ステップＳ１０８）、ソースプログラム解析部１１１は、ステップＳ１０２に戻って、以降の処理を同様に行う。
【００７０】
本実施形態では、ステップ１０８で上述したとおり、動的メモリ領域を確保する関数が存在するので、ソースプログラム解析部１１１は、動的メモリ確保点ＭＰのスレッド内部情報をスレッド内部情報テーブル１２１に登録する。すなわち、ソースプログラム解析部１１１は、検出した全ての動的メモリ確保点ＭＰの場所を示すファイル名と行番号とを、１つの動的メモリ確保点ＭＰに対して１つのスレッド内部情報として、スレッド内部情報テーブル１２１に登録する。すなわち、ソースプログラム解析部１１１は、項番欄を「４」とし、ファイル名欄を「ｆｉｌｅ０２．ｃ」とし、行番号欄を「１０２」とし、さらに種別欄を「動的メモリ確保点」としたスレッド内部情報をスレッド内部情報テーブル１２１に登録する。登録した結果は、図７に示す項番４の列に示すとおりである。
【００７１】
次に、ソースプログラム解析部１１１は、親プロセスや他のスレッド（スレッド外）からステップＳ１０４で検出した動的メモリ領域を利用している可能性がないことを確認する（ステップＳ１０６）。
【００７２】
確認方法は様々あるが、本実施形態では、現在解析しているスレッドに含まれるサブルーチン内で、グローバル変数にポインタ値を設定しているかどうかに基づいて、スレッド外からの動的メモリ領域の利用の可能性を判断する。これは、あるスレッドが確保した動的メモリ領域をスレッド外から利用する場合、メモリ領域を確保したスレッドが、確保した動的メモリ領域の先頭アドレスを示すポインタ値をグローバル変数を設定し、そのグローバル変数を介して当該動的メモリ領域の先頭アドレスをスレッド外に教える必要があるためである。
【００７３】
ここで、グローバル変数とは、外部変数とも呼ばれ、親プロセス自身および親プロセスに含まれる全スレッドから参照可能な変数である。Ｃ言語では、グローバル変数の定義は、ソースプログラムファイル内のサブルーチンの外に記述する。また、Ｃ言語では、他のソースプログラムファイルで定義されたグローバル変数を使用する場合には、グローバル変数を利用するソースプログラムファイル内のサブルーチンの外に、「ｅｘｔｅｒｎ」という文字列を付加した宣言を記述する。すなわち、ソースプログラム解析部１１１は、検索対象のサブルーチンが含まれるソースプログラムファイル内において、サブルーチンの外にある定義文を分析することで、グローバル変数名を得ることができる。
【００７４】
したがって、ソースプログラム解析部１１１は、まず、現在解析しているスレッドのスレッド開始関数から呼び出される全てのサブルーチンに対して、作成した処理フローに基づいて決定した順番で、ポインタ型（ポインタ値を格納できる型）のグローバル変数の定義を検索する。ポインタ型のグローバル変数を検出した場合は、さらに、ソースプログラム解析部１１１は、そのグローバル変数に対して値を設定していないことを確認する。すなわち、第１のスレッド６００（図６）の解析においては、ソースプログラム解析部１１１は、まず、第１のファイル（図２）の００１行目に「ｅｘｔｖ」というポインタ型のグローバル変数を検出する。そして、ソースプログラム解析部１１１は、処理フロー（図６）の第１のスレッド６００に含まれるどのサブルーチンでも、当該グローバル変数に対してポインタ値を設定していないことを確認する。このような場合、ソースプログラム解析部１１１は、第１のスレッド６００内で確保する動的メモリ領域は第１のスレッド６００外で利用されることはないと判断し、解析処理を継続する。
【００７５】
次に、ソースプログラム解析部１１１は、現在解析しているスレッドのスレッド開始関数から呼び出される全てのサブルーチンに対して、作成した処理フローに基づいて決定した順番で、動的メモリ領域を解放する関数（動的メモリ解放点ＦＰ）を検索する。そして、ソースプログラム解析部１１１は、検出した全ての動的メモリ解放点ＦＰの場所を示すファイル名と行番号とを、１つの動的メモリ解放点ＦＰに対して１つのスレッド内部情報として、スレッド内部情報テーブル１２１に登録する（ステップＳ１０７）。
【００７６】
動的メモリ領域を解放する関数は、動的メモリ領域を確保する関数に対応する動的メモリ解放関数とする。ここでは、「ｆｒｅｅ」という関数を動的メモリ領域を解放する関数とする。なお、Ｃ言語では、「ｆｒｅｅ」関数の引数に「ｍａｌｌｏｃ」関数で確保した動的メモリ領域の先頭アドレスを指定すると、当該動的メモリ領域が解放される。なお、動的メモリ解放点ＦＰは、複数存在することがある。ここでソースプログラム解析部１１１が行う検索順番と検索方法は、ステップＳ１０４の「動的メモリ確保点ＭＰ」の検索と同様なので、本実施形態における詳細な説明を省略する。
【００７７】
本実施形態では、ソースプログラム解析部１１１は、「ｆｕｎｃ０２」サブルーチンの中で１箇所（第２のファイル（図３）の１５１行目）だけ動的メモリ領域を解放する関数を示す文字列を検出する。
【００７８】
その後、ソースプログラム解析部１１１は、検出した全ての動的メモリ解放点ＦＰの場所を示すファイル名と行番号とを、１つの動的メモリ解放点ＦＰに対して１つのスレッド内部情報として、スレッド内部情報テーブル１２１に登録する。すなわち、ソースプログラム解析部１１１は、項番欄を「５」とし、ファイル名欄を「ｆｉｌｅ０２．ｃ」とし、行番号欄を「１５１」とし、さらに種別欄を「動的メモリ解放点」としたスレッド内部情報をスレッド内部情報テーブル１２１に登録する。登録した結果は、図７の項番５の列に示すとおりである。以上で、第１のスレッド６００（図６）の範囲内に示すサブルーチンのコードの解析処理は終了する。
【００７９】
ここで、もしまだ解析処理を行っていないスレッドがあれば、ステップＳ１０２に戻って次のスレッドに関連するコードの解析処理を行う（ステップＳ１０８）。
【００８０】
本実施形態では、ソースプログラム解析部１１１は、第１のスレッド６００（図６）に関連する部分の解析処理のあと、第２のスレッド６０１（図６）に関連する部分の解析処理を行う。第２のスレッド６０１の解析では、検出した動的メモリ確保点ＭＰのスレッド内部情報テーブル１２１へ登録する（ステップＳ１０５）までは第１のスレッド６００と同様に処理が進む。ただし、第２のスレッド６０１に関する処理では、親プロセスや他のスレッドから動的メモリ領域を利用している可能性がないことの確認（ステップＳ１０６）の処理結果は、第１のスレッド６００の場合のそれと異なる。
【００８１】
ステップＳ１０６における第２のスレッド６０１（図６）の解析では、ソースプログラム解析部１１１は、第３のファイル（図４）の００１行目に「ｅｘｔｅｒｎ」で始まる「ｅｘｔｖ」というグローバル変数を利用する宣言文を検出し、さらに「ｆｕｎｃ３０」サブルーチン内でポインタ値を設定していることを検出する。このような場合、ソースプログラム解析部１１１は、第２のスレッド６０１内で確保する動的メモリ領域を第２のスレッドの外で利用する可能性があるとみなし、それまでに登録した第２のスレッドに関するスレッド内部情報テーブル１２１内のスレッド内部情報を削除して、当該スレッドの処理を中止する。そして、次の未処理スレッドがあれば、ソースプログラム解析部１１１は、ステップＳ１０２に戻って、以降の処理を同様に行う（ステップＳ１０８）。本実施形態では、スレッドは２つだけなので、ここでソースプログラム解析部１１１は、コードの解析処理を終了する。
【００８２】
最終的に、ソースプログラム解析部１１１は、図２〜図４のソースプログラム１０１を解析した結果、図６のようなスレッド内部情報テーブル１２１を生成する。
【００８３】
ソースプログラム解析部１１１によるコードの解析処理が終了すると、引き続き修正ソースプログラム生成部１１２が修正ソースプログラムの生成処理を実行する。修正ソースプログラム生成部１１２は、ソースプログラム解析部１１１と同時に起動しておいてもよいし、ソースプログラム解析部１１１が処理を終了した後などに起動してもよい。
【００８４】
図８〜図１１を参照して、修正ソースプログラムの生成処理の動作を説明する。なお、図９および図１０の各図における各行の先頭の３桁の数字は、説明のために表示した修正前のソースプログラムファイルの行番号であり、ソースプログラムのコードには含まれない。
【００８５】
図８は、本発明の第１の実施形態における修正ソースプログラムの修正コードの生成処理の動作を示すフローチャートである。図９は、本発明の第１の実施形態における修正ソースプログラム１０２に含まれる第１のファイル（ｆｉｌｅ０１．ｃ）の一例を示す図である。図１０は、本発明の第１の実施形態における修正ソースプログラム１０２に含まれる第２のファイル（ｆｉｌｅ０２．ｃ）の一例を示す図である。図１１は、本発明の第１の実施形態における修正後のソースプログラムに基づいて動作させたマルチスレッドプログラムの動作中の一時点での管理テーブルと動的メモリ領域の関係を示す模式図である。
【００８６】
まず、修正ソースプログラム生成部１１２は、ソースプログラム解析部１１１が生成したスレッド内部情報テーブル１２１を読み込み、管理テーブル関連の定義コードを、ファイル名欄に登録されている名称に対応する各ソースプログラムファイルの先頭に追加する（ステップＳ２００）。
【００８７】
管理テーブルは、プログラムの実行中に各スレッドごとに個別に生成される記憶領域であり、当該スレッドが実行中に確保した全ての動的メモリ領域の場所を示す場所情報を記憶することができる。本実施形態では、確保した動的メモリ領域の場所を示す場所情報として、該動的メモリ領域の先頭アドレスを用いる。図１１に管理テーブル９００の一例を示す。また、管理テーブルは、該管理テーブルを定義したスレッド内のコードからのみアクセス可能な記憶領域に作成され、当該スレッドの終了と共に消滅する。以降、定義したスレッド内のコードからのみアクセス可能な記憶領域に作成されることを「スレッドローカル」と言う。
【００８８】
Ｃ言語では、サブルーチンから管理テーブルの参照や更新などを行う場合、当該サブルーチンを含むソースプログラムファイルに管理テーブル関連の定義コードを記述しておく必要がある。
【００８９】
本ステップで修正ソースプログラム生成部１１２が追加する管理テーブル関連の定義コードは、図９の追加コード７００に示した例のように、管理テーブル９００（図１１）の先頭アドレス９２０（図１１）を保持するためのスレッドローカルな変数である「管理テーブルアドレス」変数（＿＿ｐｔ）の定義と、管理テーブル９００の未使用部分の先頭位置を示すインデックス値を保持するスレッドローカルな変数である「管理テーブルインデックス」変数（＿＿ｉｄｘ）の定義と、管理テーブルのサイズを示す定数値である「管理テーブルサイズ定数」（ＭＡＸＳＺ）の定義との３つからなる。なお、本実施形態では、管理テーブルのサイズを１００００としたが、プログラムの実行中にスレッドが確保する全ての動的メモリ領域の場所の情報（先頭アドレス）を記憶するに足りるサイズであれば、どのような値でも構わない。
【００９０】
本実施形態では、修正ソースプログラム生成部１１２は、スレッド内部情報テーブル１２１のファイル名欄に登録されている第１のファイル（ｆｉｌｅ０１．ｃ）と第２のファイル（ｆｉｌｅ０２．ｃ）の２つのファイルに対して、それぞれコードを追加する。追加した結果を図９の追加コード７００および図１０の追加コード８００に示す。
【００９１】
次に、修正ソースプログラム生成部１１２は、スレッド内部情報テーブル１２１を「項番」欄が１のスレッド内部情報から順に読み込む。そして、修正ソースプログラム生成部１１２は、読み込んだスレッド内部情報の「ファイル名」欄に対応したファイル中の「行番号」欄の示す行番号に基づいて定めた位置に対して、当該スレッド内部情報の「種別」欄に対応したステップＳ２０１〜ステップＳ２０４の処理を選んで実行することを、全スレッド内部情報について繰り返す。
【００９２】
読み込んだスレッド内部情報の「種別」欄が「スレッド開始点」の場合、修正ソースプログラム生成部１１２は、読み込んだスレッド内部情報の「ファイル名」欄に対応したファイル中の「行番号」欄の示す行の次の行に、管理テーブルを生成し初期化するためのコードを追加する（ステップＳ２０１）。ここで、修正ソースプログラム生成部１１２が、スレッド内部情報テーブル１２１の項番欄が「１」のスレッド内部情報を処理したときに追加する追加コードの一例を図９の追加コード７０１に示す。
【００９３】
ここで追加する追加コード７０１の行う処理内容は、スレッドが開始したすぐ後に、管理テーブルの実体となる領域をスレッドローカルなメモリ領域内に確保し、確保した管理テーブル９００（図１１）の領域の先頭アドレス９２０（図１１）を管理テーブルアドレス変数（＿＿ｐｔ）に格納することである。さらに、追加コード７０１には、言語の仕様に応じて、管理テーブルの要素を、ポインタ値が有効なアドレスではないことを示す値で初期化する処理も含める。本実施形態では、Ｃ言語の仕様に従って、「ＮＵＬＬ」値で初期化する。
【００９４】
読み込んだスレッド内部情報の「種別」欄が「スレッド終了点」の場合、修正ソースプログラム生成部１１２は、読み込んだスレッド内部情報の「ファイル名」欄に対応したファイル中の「行番号」欄の示す行の前の行に、管理テーブルの動的メモリ領域のアドレス情報から動的メモリ領域の解放漏れを検知し、まだ解放していない動的メモリ領域を強制的に解放するためのコードを追加する（ステップＳ２０２）。ここで、修正ソースプログラム生成部１１２が、スレッド内部情報テーブル１２１の項番欄が「２」および「３」の各スレッド内部情報を処理したときに追加する追加コードの一例を図９の追加コード７０２および追加コード７０３に示す。
【００９５】
ここで追加する追加コード７０２および追加コード７０３の行う処理内容は、スレッドが終了する前に、管理テーブルに残っている有効なアドレスを示すポインタ値を検索して、まだ解放していない全ての動的メモリ領域を強制的に解放することである。本実施形態では、修正ソースプログラム生成部１１２は、動的メモリ解放点ＦＰを検索したときに検索キーとした関数名と同じ「ｆｒｅｅ」関数を用いて動的メモリ領域の解放を行う。すなわち、修正ソースプログラム生成部１１２は、管理テーブル９００に残っている全ての有効な（ＮＵＬＬ値以外の値の）アドレス値９０２について、当該アドレス値９０２を引数としてｆｒｅｅ関数を実行するコードを追加する。
【００９６】
読み込んだスレッド内部情報の「種別」欄が「動的メモリ確保点」の場合、修正ソースプログラム生成部１１２は、読み込んだスレッド内部情報の「ファイル名」欄に対応したファイル中の「行番号」欄の示す行に対して、確保した動的メモリ領域の場所を示す情報である先頭アドレスを管理テーブル９００に登録するコードを追加する（ステップＳ２０３）。ここで、修正ソースプログラム生成部１１２が、スレッド内部情報テーブル１２１の項番欄が「４」のスレッド内部情報を処理したときに追加する追加コードの一例を図１０の追加コード８０１に示す。
【００９７】
ここで追加する追加コード８０１の行う処理内容は、スレッドが動的メモリ領域を確保したときに、確保した動的メモリ領域の先頭アドレスを管理テーブルインデックス変数（＿＿ｉｄｘ）が指し示す管理テーブル９００の未使用部分の先頭に登録することである。図１１を用いて説明すると、追加コード８０１の動作は、例えば、動的メモリ領域９１３を確保した後、動的メモリ領域９１３の先頭アドレスを管理テーブル９００の要素９０４に格納し、インデックス変数を次の要素９０５を示すように変更するという動作となる。
【００９８】
読み込んだスレッド内部情報の「種別」欄が「動的メモリ解放点」の場合、修正ソースプログラム生成部１１２は、読み込んだスレッド内部情報の「ファイル名」欄に対応したファイル中の「行番号」欄の示す行の次の行に対して、管理テーブルから解放した動的メモリ領域の先頭アドレスを削除（無効化）するコードを追加する（ステップＳ２０４）。ここで、修正ソースプログラム生成部１１２が、スレッド内部情報テーブル１２１の項番欄が「１」のスレッド内部情報を処理したときに追加するコードの一例を図１０の追加コード８０２に示す。
【００９９】
ここで追加する追加コード８０２の行う処理内容は、スレッドが動的メモリ領域を解放したときに、管理テーブル９００から、解放した動的メモリ領域の場所を示す情報である先頭アドレスを削除（有効なアドレスではないことを示す値で無効化）することである。図１１を用いて説明すると、追加コード８０２の動作は、例えば、動的メモリ領域９１０を解放した後、動的メモリ領域９１０の先頭アドレスの値で管理テーブルを検索して、要素９０１に動的メモリ領域９１０の先頭アドレスの値が格納されていたことを検出し、それをＮＵＬＬ値で無効化するという動作となる。
【０１００】
このようにしてスレッド内部情報テーブル１２１に登録された全てのスレッド内部情報についてステップＳ２０１〜Ｓ２０４のいずれかの処理を行った後、修正ソースプログラム生成部１１２は、ソースプログラム１０１のファイルに対して各種の追加コードを挿入した修正ソースプログラム１０２を、二次記憶装置１００に出力する（ステップＳ２０５）。
【０１０１】
修正ソースプログラム１０２における第１のファイル（ｆｉｌｅ０１．ｃ）は、図９に例示するようになり、第２のファイル（ｆｉｌｅ０２．ｃ）は、図１０に例示するようになる。なお、修正ソースプログラム生成部１１２は、第３のファイル（ｆｉｌｅ０３．ｃ）を変更しないので、修正ソースプログラム１０２の構成に第３のファイルを加えてもよいし、加えなくてもよい。
【０１０２】
以上のようにして、処理装置１１０は、ソースプログラム１０１から修正ソースプログラム１０２を自動的に生成し、利用者に提供する。利用者は、出力された修正ソースプログラム１０２を一般のソースプログラムと同様に扱うことができる。
【０１０３】
ここで、修正ソースプログラム１０２を基に作成した実行可能なプログラム（以下、修正プログラムＭＰと言う。）をコンピュータで実行したとき、メモリリークを防止する動作について説明する。
【０１０４】
図２を参照すると、元のソースプログラム１０１のファイルの１つである第１のファイル（ｆｉｌｅ０１．ｃ）の１０４行目から１０６行目のコードにメモリリークが発生するコードが存在している。詳しく説明すると、第１のスレッド６００（図６）では、１０５行目で呼び出す「ｆｕｎｃ０２」サブルーチン内で動的メモリ領域の解放を行っている（スレッド内部情報テーブル１２１の項番５の動的メモリ解放点ＦＰ）が、その前の１０４行目の条件「ｒがゼロであること」に適合しなかった場合は、動的メモリ領域を解放する「ｆｕｎｃ０２」サブルーチンを実行せずに第１のスレッド６００が終了してしまう。すなわち、１０４行目を実行する時点で「ｒがゼロでない」場合には、第１のスレッド６００では、スレッド終了後にも動的メモリが解放されずに残るというメモリリークが発生する構造となっている。なお、このメモリリークが発生する場所は、修正ソースプログラム１０２の第１のファイル（図９）にもそのまま存在する。このメモリリーク発生箇所を例として、修正プログラムＭＰにおける第１のスレッド６００が、メモリリークをどのように防止するかを説明する。
【０１０５】
まず、修正プログラムＭＰは、起動した後に、第１のスレッド６００を開始する（図９の１００行目）。すると、第１のスレッド６００内で、動的メモリ確保点ＭＰの後にある追加コード７０１が動作する。追加コード７０１の処理により、第１のスレッド６００は、スレッドローカルなメモリ領域内に、管理テーブルサイズ定数の指定するサイズで、管理テーブル９００（図１１）の実体を確保した後、確保した管理テーブル９００の全要素をＮＵＬＬ値で初期化する。そして、追加コード７０１の処理により、第１のスレッド６００は、管理テーブルアドレス変数に管理テーブル９００の先頭アドレスを格納する。
【０１０６】
次に、第１のスレッド６００は、「ｆｕｎｃ０１」サブルーチンを呼び出し（図９の１０２行目）、「ｆｕｎｃ０１」サブルーチン内で動的メモリ領域（動的メモリ領域９１０と呼ぶ。）を確保する処理を実行する（図１０の１０２行目）。このあと、第１のスレッド６００内では、動的メモリ確保点ＭＰにある追加コード８０１が動作する。追加コード８０１の処理により、第１のスレッド６００は、管理テーブルアドレス変数が示す場所にある管理テーブル９００の最初の要素９０１（図１１）に、確保した動的メモリ領域９１０の先頭アドレスを登録した後、管理テーブルインデックス変数の内容を次の要素９０２を示すように変更する。
【０１０７】
さらに、第１のスレッド６００は、その処理が図９の１０４行目に達したとき、「ｒがゼロ」の場合であれば、「ｆｕｎｃ０２」サブルーチンを呼び出す（図９の１０５行目）。そして、第１のスレッド６００は、「ｆｕｎｃ０２」サブルーチン内で動的メモリ領域９１０を解放する処理を実行する（図１０の１５１行目）。このあと、第１のスレッド６００では、動的メモリ解放点ＦＰの後にある追加コード８０２が動作する。追加コード８０２の動作により、第１のスレッド６００は、管理テーブルの要素９０１（図１１）に登録されていた動的メモリ領域９１０の先頭アドレスをＮＵＬＬ値に書き換えることで無効化する。
【０１０８】
「ｆｕｎｃ０２」サブルーチンが終了すると、第１のスレッド６００は、図９の１０６行目にあるスレッド終了点ＥＰの前にある追加コード７０２を実行する。このときは、上述したとおり、すでに管理テーブル９００の要素９０１に格納されていた動的メモリ領域９１０の先頭アドレスはＮＵＬＬ値になっている。したがって、追加コード７０２の処理では動的メモリ領域９１０の解放を行う必要がなく、第１のスレッド６００は、追加コード７０２の次にある、１０６行目のｒｅｔｕｒｎ行で終了する。このように、もし、元のプログラムがすべての動的メモリ領域をすでに解放していれば、第１のスレッドは、スレッド終了点ＥＰの前にある追加コード７０２の処理において動的メモリ領域の解放を行わない（行う必要がない）。
【０１０９】
一方、第１のスレッド６００は、その処理が図９の１０４行目に達したとき、「ｒがゼロでない」場合には、「ｆｕｎｃ０２」サブルーチンを呼び出さず、スレッド終了点ＥＰの前にある追加コード７０３を実行する（図９の１０７行目）。このときは、管理テーブル９００の要素９０１に有効なアドレス値（ＮＵＬＬ値以外）が残っている。したがって、追加コード７０３の処理により、第１のスレッド６００は、要素９０１に格納されたアドレス値の示す動的メモリ領域９１０を強制解放する。その後、第１のスレッド６００は、次の１０８行目のスレッド最終行に到達して終了する。すなわち、修正プログラムＭＰで発生するはずだった動的メモリ領域９１０の解放漏れ（メモリリーク）は、第１のスレッド６００が、追加コード７０３の処理によって、自らが終了する前に動的メモリ領域９１０を強制解放したために発生しなくなっている。
【０１１０】
このようにして、本実施形態によれば、マルチスレッドプログラムの元のソースプログラム１０１において、各スレッドが終了する時点で動的メモリ領域を解放せずに残してしまうコードを含んでいた場合でも、修正プログラムＭＰではメモリリークを防ぐことができる。
【０１１１】
その理由は、処理装置１１０は、未解放の動的メモリ領域を強制的に解放してから、当該動的メモリを確保したスレッドを終了するための処理をソースプログラム１０１に対して追加した修正ソースプログラム１０２を生成することができるからである。
【０１１２】
また、本実施形態によれば、ソースプログラム１０１から修正ソースプログラム１０２を人手による解析や修正の手間なしに自動的に生成することができるという効果もある。そのため、もしソースプログラム１０１の処理内容が不明であった場合に、通常ならば人手によるメモリリーク発生箇所の特定やプログラム修正が著しく困難であるところが、本実施形態ならば、メモリリーク発生時の対処に要する時間や費用を劇的に抑えることが可能となる。
【０１１３】
なお、本実施形態での修正ソースプログラム生成部１１２が、修正ソースプログラムの生成処理に含まれる各ステップにおいて、ソースプログラム１０１の各ファイルに対して各種追加コードを追加する位置は一例であり、言語の仕様に適した場所であればファイルのどの位置であっても構わない。また、各種追加コードを他のファイルやライブラリ関数として用意しておき、追加コードに含まれるコードでは、用意したファイルやライブラリ関数の処理を呼び出すだけとしてもよい。このようにして、ファイル内の記述位置や追加コードの簡略化を行うことによって、さらに修正ソースプログラム１０２の可読性の向上をさせることができる。
【０１１４】
なお、本実施形態ではＣ言語で記述されたソースプログラムを使用したが、本実施形態を適用可能なプログラミング言語は、これに限定されるものではない。本実施形態は、例えば、動的メモリ領域を利用者から明示的に確保および解放することが可能な各種プログラミング言語などに広く適用することができる。
【０１１５】
また、本実施形態に利用者からの通知を受け付ける入力部を追加して、スレッド内で確保した動的メモリ領域を親プロセスや他のスレッドから利用している可能性がないことを利用者からソースプログラム解析部１１１に対して通知してもよい。例えば、プログラムの設計仕様上、スレッド内で確保した動的メモリ領域をスレッド外（親プロセスや他のスレッド）で利用していないことが明確な場合に、利用者が上記の通知を行うとする。これにより、ソースプログラム解析部１１１は、ソースプログラム１０１の中にポインタ型のグローバル変数へポインタ値を設定しているコードが含まれていても、ステップＳ１０６におけるスレッド外利用を確認する処理を中止せず、それ以降の解析処理を継続するという動作が可能となる。これにより、本実施形態を適用できるソースプログラムの対象範囲がより広くなる効果がある。
【０１１６】
＜第２の実施形態＞
次に、上述した第１の実施形態を基本とする第２の実施形態について説明する。以下では、第２の実施形態に係る特徴的な部分を中心に説明し、第１の実施形態と同様な構成を有する第２の実施形態の構成要素については、その構成要素について重複する詳細な説明は省略する。
【０１１７】
本実施形態では、処理装置は、動的メモリ領域のメモリリークを防ぐように修正した修正コードとして、修正ソースプログラムの代わりに修正中間コードを作成し、さらに、作成した修正中間コードを変換した修正オブジェクトコードも提供する点が異なる。
【０１１８】
オブジェクトコードとは、プログラムを実行する対象のコンピュータシステムやオペレーティングシステムで動作させるための機械語（マシン語）ファイルのフォーマットに準じた形式で、プログラムのソースコードに対応する機械語の列が格納されているファイルである。複数のオブジェクトコードを結合することで、コンピュータ上で実行可能な実行形式ファイルとなる。オブジェクトコードは、コンパイラ（コンパイラ処理系）と呼ばれる変換プログラムでソースコードを変換した結果として出力される。
【０１１９】
また、中間コードとは、人間に理解しやすい高水準言語であるソースコードとコンピュータが直接実行できる機械語のコード（オブジェクトコード）との中間にあたる中間表現の言語で記述されたコードであり、コンパイラにおいては処理中に一次的に利用するために生成しているものである。
【０１２０】
一般的なコンパイラは、ソースプログラムファイルからソースコードを読み込むと、読み込んだソースコードをトークンと呼ばれる字句の並びに分解する字句解析処理、トークンの並びからプログラムの構造を表現する木構造を生成する構文解析処理、木構造からシンボルテーブルの作成や各種チェックを行う意味解析処理、意味解析処理結果から中間コードを生成する中間コード生成処理、中間コードを効率化し実行時間やメモリ使用量を最小限にする最適化処理、および、最適化した中間コードから最終的なオブジェクトコードに変換を行うオブジェクトコード生成処理の順に変換処理を行っている。
【０１２１】
本実施形態に係る処理装置１０００は、そのコンパイラによる変換処理過程に、動的メモリ領域のメモリリークを防止するための修正を行う処理を組み込む。
【０１２２】
図１２は、本発明の第２の実施形態の構成を示すブロック図である。
【０１２３】
図１２を参照すると、本実施形態は、二次記憶装置１３００および処理装置１０００から構成される。
【０１２４】
処理装置１０００は、プログラム制御により動作する一般的な情報処理装置（コンピュータ）によって構成されても良いし、専用のハードウェアによって構成されても良い。また、処理装置１０００は、プロセッサであってもよい。
【０１２５】
二次記憶装置１３００は、ハードディスクなどの記憶装置であり、処理装置１０００が処理対象とするプログラムのソースプログラム１３０１を記憶している。また、二次記憶装置１３００には、処理装置１０００が生成する中間コード１３０２、修正中間コード１３０３、および、修正オブジェクトコード１３０４を出力する。なお、ソースプログラム１３０１、中間コード１３０２、修正中間コード１３０３、および、修正オブジェクトコード１３０４は、それぞれ１つのプログラムとして実行するプログラムについて記述したコードを含む、１つ以上のファイルの集合体である。
【０１２６】
処理装置１０００は、中間コード生成部１１０１、中間コード解析部１１０２、修正中間コード生成部１１０３、最適化部１１０４、オブジェクトコード生成部１１０５、および主記憶装置１２００を含む。
【０１２７】
中間コード生成部１１０１は、二次記憶装置１３００からソースプログラム１３０１を読み込んで、中間コード１３０２に変換し、二次記憶装置１３００に格納する。中間コード生成部１１０１が行う処理は、一般的なコンパイラのソースコード読み込み、字句解析処理、構文解析処理、意味解析処理、および、中間コード生成処理に相当する。
【０１２８】
中間コード解析部１１０２は、第１の実施形態におけるソースプログラム解析部１１１に相当する。中間コード解析部１１０２は、二次記憶装置１３００から中間コード１３０２を読み込み、該中間コード１３０２を解析して検出した４種のスレッド内部情報を、スレッド内部情報テーブル１２０１に登録する。４種のスレッド内部情報、およびスレッド内部情報テーブル１２０１の構造は、ソースプログラム１３０１を中間コード１３０２と読み替えれば、第１の実施形態と同様である。ただし、コードの場所を示す「行番号」情報は、ファイル先頭からのバイト数などの他の表現形式を用いてもよい。
【０１２９】
修正中間コード生成部１１０３は、第１の実施形態における修正ソースプログラム生成部１１２に相当する。修正中間コード生成部１１０３は、中間コード１３０２およびスレッド内部情報テーブル１２０１に登録された情報から、中間コード１３０２を基にして修正を施した修正コードである修正中間コード１３０３を生成し、二次記憶装置１３００に出力する。修正中間コード１３０３を生成するために追加するコードの記述言語が異なるだけであり、修正中間コード生成部１１０３が行う処理の手順は、ソースプログラム１３０１を中間コード１３０２と読み替え、修正ソースプログラム１０２を修正中間コード１３０３と読み替えれば、第１の実施形態と同様である。
【０１３０】
最適化部１１０４は、修正中間コード１３０３を読み込み、読み込んだ修正中間コード１３０３に対して実行時間やメモリ使用量を最小限にする最適化を行う。最適化部１１０４が行う処理は、一般的なコンパイラの最適化処理に相当する。
【０１３１】
オブジェクトコード生成部１１０５は、最適化部１１０４による最適化の結果を反映した修正中間コード１３０３を機械語に翻訳することで修正オブジェクトコード１３０４を生成し、二次記憶装置１３００に出力する。オブジェクトコード生成部１１０５が行う処理は、一般的なコンパイラのオブジェクトコード生成処理に相当する。
【０１３２】
主記憶装置１２００は、例えば、半導体メモリ装置を用いて実現され、スレッド内部情報テーブル１２０１を記憶する。
【０１３３】
次に、上述した構成を備える本実施形態の動作について詳細に説明する。
【０１３４】
本実施形態では、中間コード生成部１１０１、中間コード解析部１１０２、修正中間コード生成部１１０３、最適化部１１０４、および、オブジェクトコード生成部１１０５を合わせたコンパイラ処理系１１００は、ソースプログラム１３０１をオブジェクトコードに変換するために使用する一般的なコンパイラの機能を包含しているので、一般的なコンパイラと置き換えて使用する。
【０１３５】
まず、本実施形態の利用者は、ソースプログラム１３０１を二次記憶装置１３００に格納した後、解析対象であるソースプログラム１３０１に含まれる全てのファイルを指定して、中間コード生成部１１０１を起動する。なお、中間コード生成部１１０１以外の部分（中間コード解析部１１０２、修正中間コード生成部１１０３、最適化部１１０４、および、オブジェクトコード生成部１１０５）は、中間コード生成部１１０１と同時あるいはほぼ同時に起動しておいてもよいし、各部分の処理終了後などに次の部分を起動してもよい。
【０１３６】
起動した中間コード生成部１１０１は、指定されたソースプログラム１３０１のファイルを読み込み、そのソースプログラム１３０１をコード変換した中間コード１３０２を生成して、生成した中間コード１３０２を二次記憶装置１３００に格納する。なお、中間コード生成部１１０１が行う処理は、一般的なコンパイラのソースコード読み込み、字句解析処理、構文解析処理、意味解析処理、および、中間コード生成処理に相当し、一般的な技法を採用することができるので、本実施形態における詳細な説明を省略する。
【０１３７】
中間コード生成部１１０１の処理が終了すると、引き続き中間コード解析部１１０２が中間コード解析処理を実行する。
【０１３８】
中間コード解析部１１０２は、二次記憶装置１３００から中間コード１３０２を読み込み、該中間コード１３０２を解析して検出した「スレッド開始点ＳＰ」と「スレッド終了点ＥＰ」と「動的メモリ確保点ＭＰ」と「動的メモリ解放点ＦＰ」との４種のスレッド内部情報を、スレッド内部情報テーブル１２０１に登録する。なお、第１の実施形態と解析対象の記述言語が異なるだけであり、中間コード解析部１１０２が行う解析の手順や生成するスレッド内部情報テーブル１２０１の構造と内容は、第１の実施形態と同様であるため、詳細な説明を省略する。最終的に、中間コード解析部１１０２は、第１の実施形態と同等の内容のスレッド内部情報テーブル１２０１を生成する。
【０１３９】
中間コード解析部１１０２の処理が終了すると、引き続き修正中間コード生成部１１０３が修正中間コード生成処理を実行する。
【０１４０】
修正中間コード生成部１１０３は、中間コード１３０２およびスレッド内部情報テーブル１２０１に登録された情報から、「スレッド開始点ＳＰ」と「スレッド終了点ＥＰ」と「動的メモリ確保点ＭＰ」と「動的メモリ解放点ＦＰ」とに動的メモリ領域のメモリリークを防止するための追加コードを追加することで修正中間コード１３０３を生成し、生成した修正中間コード１３０３を二次記憶装置１３００に出力する。なお、修正中間コード１３０３を生成するために追加する各追加コードは、中間コードの言語を用いて記述されているが、当該各コードの処理内容は第１の実施形態と同様である。また、その他の修正中間コード生成部１１０３が行う処理の手順と内容は、第１の実施形態と同様であるため省略する。最終的に、修正中間コード生成部１１０３は、第１の実施形態と同等の内容の修正中間コード１３０３を二次記憶装置１３００に出力する。
【０１４１】
中間コード生成部１１０３の処理が終了すると、引き続き最適化部１１０４が修正中間コードの最適化処理を実行する。
【０１４２】
最適化部１１０４は、二次記憶装置１３００から修正中間コード１３０３を読み込み、読み込んだ修正中間コード１３０３に対して実行時間やメモリ使用量を最小限にする最適化を行うことにより、修正中間コード１３０３を更新する。最適化部１１０４が行う処理は、一般的なコンパイラの最適化処理に相当し、一般的な技法を採用することができるので、本実施形態における詳細な説明を省略する。
【０１４３】
次に、オブジェクトコード生成部１１０５が、最適化された修正中間コード１３０３を機械語に翻訳することで修正オブジェクトコード１３０４を生成し、生成した修正オブジェクトコード１３０４を二次記憶装置１３００に出力する。ここで、オブジェクトコード生成部１１０５は、中間コード１３０２と修正中間コード１３０３を削除しても構わない。オブジェクトコード生成部１１０５が行う処理は、一般的なコンパイラのオブジェクトコード生成処理に相当し、一般的な技法を採用することができるので、本実施形態における詳細な説明を省略する。
【０１４４】
このようにして、処理装置１０００は、ソースプログラム１３０１から修正オブジェクトコード１３０４を自動的に生成する。利用者は、出力された修正オブジェクトコード１３０４を一般的なコンパイル済みのオブジェクトコードと同様に扱うことができる。
【０１４５】
修正オブジェクトコード１３０４を基に作成した実行可能なプログラムをコンピュータ上で実行したとき、マルチスレッドプログラムにおけるメモリリークを防止するために追加した各コードの動作は、第１の実施形態と同様である。
【０１４６】
以上、説明したように、本実施形態には、マルチスレッドプログラムにおける動的メモリ領域のメモリリークを防止するという第１の実施形態と同様の効果に加えて、さらに、ソースプログラム管理における利用者の手間が増えないという効果がある。
【０１４７】
その理由は、ソースプログラム１３０１から修正の追加コードを加えた修正オブジェクトコード１３０４を直接生成するので、第１の実施形態がソースプログラムとは別に修正ソースプログラムを生成することに比べて、本実施形態ではソースプログラムが増えないからである。
【０１４８】
なお、本実施形態では、オブジェクトコードを機械語としたが、ソースプログラムの言語や、プログラムを実行するコンピュータシステム（オペレーティングシステム）にあわせて、異なる言語を用いてもよい。
【０１４９】
＜第３の実施形態＞
次に、上述した各実施形態に共通する概念について説明する。
【０１５０】
図１３は、本発明の第３の実施形態の構成を示すブロック図である。
【０１５１】
図１３を参照すると、本実施形態は、処理装置２０００から構成される。
【０１５２】
処理装置２０００は、プログラム制御により動作する一般的な情報処理装置（コンピュータ）によって構成されても良いし、専用のハードウェアによって構成されても良い。また、処理装置２０００は、プロセッサであってもよい。
【０１５３】
処理装置２０００は、コード解析部２０１０と、修正コード生成部２０１１とを含む。
【０１５４】
コード解析部２０１０は、第１の実施形態におけるソースプログラム解析部１１１、および、第２の実施形態における中間コード解析部１１０２に相当する。
【０１５５】
コード解析部２０１０は、マルチスレッドプログラムを記述するコード（ファイル）２０２０を読み込み、読み込んだコード２０２０を解析することで、「スレッド開始点ＳＰ」と「スレッド終了点ＥＰ」と「動的メモリ確保点ＭＰ」と「動的メモリ解放点ＦＰ」とを検出する。
【０１５６】
コード解析部２０１０が解析を行うコードの範囲は、読み込んだコード２０２０のうち、動的メモリ領域を確保するコードを含むスレッドを記述するコードである。ただし、あるスレッドが確保した動的メモリ領域が、確保したスレッドの外（親プロセスや他のスレッド）から使用される可能性がある場合には、コード解析部２０１０は、当該スレッドに関連するコードを除いた範囲において解析する。
【０１５７】
「スレッド開始点ＳＰ」は、動的メモリ領域を確保するスレッドが開始されるコードの場所を示す。「スレッド終了点ＥＰ」は、上記スレッドが終了されるコードの場所を示す。「動的メモリ確保点ＭＰ」は、上記スレッド内で動的なメモリ領域を確保するコードの場所を示す。「動的メモリ解放点ＦＰ」は、上記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す。
【０１５８】
なお、コード解析部２０１０は、当該コード２０２０を含む１つ以上のファイルからなるファイル群などからコード２０２０を読み込むことができる。
【０１５９】
修正コード生成部２０１１は、第１の実施形態における修正ソースプログラム生成部１１２、および、第２の実施形態における修正中間コード生成部１１０３に相当する。
【０１６０】
修正コード生成部２０１１は、コード解析部２０１０によって検出された各スレッド開始点ＳＰに対応する場所に対して、動的メモリ領域を確保するスレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第１追加コードを追加する。
【０１６１】
また、修正コード生成部２０１１は、コード解析部２０１０によって検出された各動的メモリ確保点ＭＰに対応する場所に対して、上記管理情報に、上記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第２追加コードを追加する。
【０１６２】
また、修正コード生成部２０１１は、コード解析部２０１０によって検出された各動的メモリ解放点ＦＰに対応する場所に対して、上記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第３追加コードを追加する。
【０１６３】
また、修正コード生成部２０１１は、コード解析部２０１０によって検出された各スレッド終了点ＥＰに対応する場所に対して、上記スレッドが終了する前に動的メモリ領域を解放していない場合には、上記管理情報に含まれる当該動的メモリに関する場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第４追加コードを追加する。
【０１６４】
最後に、修正コード生成部２０１１は、上記第１〜第４追加コードの少なくともいずれかが追加された修正コード２０２１を生成する。修正コード生成部２０１１は、修正コード２０２１を１つ以上のファイルなどとして出力することができる。
【０１６５】
なお、本発明は上述した実施形態の一部または全部は、以下の付記のようにも記載されうるが、以下の付記に限定されるものではない。
【０１６６】
（付記１）
１つ以上のファイルからなるファイル群に含まれるマルチスレッドプログラムを記述するコードのうち、
動的メモリ領域を確保するコードを含むスレッドを記述するコードの中から、
あるスレッドが確保した動的メモリ領域が、確保したスレッドの外から使用される可能性のある場合には、当該スレッドに関連するコードを除き、
その結果残ったコードを解析することにより、
前記スレッドが開始されるコードの場所を示すスレッド開始点と、前記スレッドが終了されるコードの場所を示すスレッド終了点と、前記スレッド内で動的なメモリ領域を確保するコードの場所を示す動的メモリ確保点と、前記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す動的メモリ解放点とを検出するコード解析手段と、
前記解析手段によって検出された前記各スレッド開始点に対応する場所に対して、前記スレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第１追加コードを追加し、
前記解析手段によって検出された前記各動的メモリ確保点に対応する場所に対して、前記管理情報に、前記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第２追加コードを追加し、
前記解析手段によって検出された前記各動的メモリ解放点に対応する場所に対して、前記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第３追加コードを追加し、
前記解析手段によって検出された前記各スレッド終了点に対応する場所に対して、前記スレッドが終了する前に前記動的メモリ領域を解放していない場合には、前記管理情報に含まれる前記動的メモリに関する前記場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第４追加コードを追加する処理を実施することにより、
前記第１乃至第４追加コードの少なくともいずれかが追加されたファイルをなす修正コードを生成する修正コード生成手段とを備える
ことを特徴とするプログラム生成装置。
【０１６７】
（付記２）
前記動的メモリ領域を確保したスレッドの外では、前記スレッドが確保する動的メモリ領域を利用しないことを示す通知情報をユーザが入力可能な入力手段を更に備え、
前記コード解析手段は、前記入力手段から前記通知情報が入力された場合には、通知の対象であるスレッドに関連するコードも含めて解析する
ことを特徴とする付記１記載のプログラム生成装置。
【０１６８】
（付記３）
前記マルチスレッドプログラムを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、コンパイラがオブジェクトコードを生成する過程においてソースプログラムコードを変換する中間コードと同等の形式であり、
前記修正コード生成手段が追加する前記第１乃至第４追加コードと前記修正コードとを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、前記中間コードと同等の形式である
ことを特徴とする付記１または２記載のプログラム生成装置。
【０１６９】
（付記４）
前記修正コード生成手段は、前記第１〜第４追加コードと修正コードとが前記中間コード形式の場合に、前記中間コードと同等の記述形式である前記各修正コードを、さらに、コンパイラが出力するオブジェクトコードと同等の記述形式に変換することにより、修正オブジェクトコードを生成する
ことを特徴とする付記３記載のプログラム生成装置。
【０１７０】
（付記５）
１つ以上のファイルからなるファイル群に含まれるマルチスレッドプログラムを記述するコードのうち、
動的メモリ領域を確保するコードを含むスレッドを記述するコードの中から、
あるスレッドが確保した動的メモリ領域が、確保したスレッドの外から使用される可能性のある場合には、当該スレッドに関連するコードを除き、
その結果残ったコードを解析することにより、
前記スレッドが開始されるコードの場所を示すスレッド開始点と、前記スレッドが終了されるコードの場所を示すスレッド終了点と、前記スレッド内で動的なメモリ領域を確保するコードの場所を示す動的メモリ確保点と、前記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す動的メモリ解放点とを、情報処理装置を用いて検出し、
検出された前記各スレッド開始点に対応する場所に対して、前記スレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第１追加コードを追加し、
検出された前記各動的メモリ確保点に対応する場所に対して、前記管理情報に、前記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第２追加コードを追加し、
検出された前記各動的メモリ解放点に対応する場所に対して、前記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第３追加コードを追加し、
検出された前記各スレッド終了点に対応する場所に対して、前記スレッドが終了する前に前記動的メモリ領域を解放していない場合には、前記管理情報に含まれる前記動的メモリに関する前記場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第４追加コードを追加する処理を、情報処理装置を用いて実施することにより、
前記第１乃至第４追加コードの少なくともいずれかが追加されたファイルである修正コードを、情報処理装置を用いて生成する
ことを特徴とするプログラム生成方法。
【０１７１】
（付記６）
前記動的メモリ領域を確保したスレッドの外では、前記スレッドが確保する動的メモリ領域を利用しないことを示す通知情報をユーザが入力可能とし、
前記コードを解析する際に、前記通知情報が入力された場合には、通知の対象であるスレッドに関連するコードも含めて解析する
ことを特徴とする付記５記載のプログラム生成方法。
【０１７２】
（付記７）
前記マルチスレッドプログラムを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、コンパイラがオブジェクトコードを生成する過程においてソースプログラムコードを変換する中間コードと同等の形式であり、
前記第１乃至第４追加コードと前記修正コードとを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、前記中間コードと同等の形式である
ことを特徴とする付記５または６記載のプログラム生成方法。
【０１７３】
（付記８）
前記修正コードを生成する際に、前記中間コードと同等の記述形式である前記各修正コードを、さらに、コンパイラが出力するオブジェクトコードと同等の記述形式に変換することにより、修正オブジェクトコードを生成する
ことを特徴とする付記３記載のプログラム生成方法。
【０１７４】
（付記９）
プログラム生成装置として動作するコンピュータの動作制御のためのコンピュータ・プログラムであって、そのコンピュータ・プログラムにより、
１つ以上のファイルからなるファイル群に含まれるマルチスレッドプログラムを記述するコードのうち、
動的メモリ領域を確保するコードを含むスレッドを記述するコードの中から、
あるスレッドが確保した動的メモリ領域が、確保したスレッドの外から使用される可能性のある場合には、当該スレッドに関連するコードを除き、
その結果残ったコードを解析することにより、
前記スレッドが開始されるコードの場所を示すスレッド開始点と、前記スレッドが終了されるコードの場所を示すスレッド終了点と、前記スレッド内で動的なメモリ領域を確保するコードの場所を示す動的メモリ確保点と、前記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す動的メモリ解放点とを検出するコード解析機能と、
前記解析機能によって検出された前記各スレッド開始点に対応する場所に対して、前記スレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第１追加コードを追加し、
前記解析機能によって検出された前記各動的メモリ確保点に対応する場所に対して、前記管理情報に、前記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第２追加コードを追加し、
前記解析機能によって検出された前記各動的メモリ解放点に対応する場所に対して、前記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第３追加コードを追加し、
前記解析機能によって検出された前記各スレッド終了点に対応する場所に対して、前記スレッドが終了する前に前記動的メモリ領域を解放していない場合には、前記管理情報に含まれる前記動的メモリに関する前記場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第４追加コードを追加する処理を実施することにより、
前記第１乃至第４追加コードの少なくともいずれかが追加されたファイルである修正コードを生成する修正コード生成機能とを、前記コンピュータに実現させる
ことを特徴とするコンピュータ・プログラム。
【０１７５】
（付記１０）
前記動的メモリ領域を確保したスレッドの外では、前記スレッドが確保する動的メモリ領域を利用しないことを示す通知情報をユーザが入力可能な入力機能を更に備え、
前記コード解析機能は、前記入力機能から前記通知情報が入力された場合には、通知の対象であるスレッドに関連するコードも含めて解析する
ことを特徴とする付記９記載のコンピュータ・プログラム。
【０１７６】
（付記１１）
前記マルチスレッドプログラムを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、コンパイラがオブジェクトコードを生成する過程においてソースプログラムコードを変換する中間コードと同等の形式であり、
前記修正コード生成機能が追加する前記第１乃至第４追加コードと前記修正コードとを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、前記中間コードと同等の形式である
ことを特徴とする付記９または１０記載のコンピュータ・プログラム。
【０１７７】
（付記１２）
前記修正コード生成機能は、前記中間コードと同等の記述形式である前記各修正コードを、さらに、コンパイラが出力するオブジェクトコードと同等の記述形式に変換することにより、修正オブジェクトコードを生成する
ことを特徴とする付記１１記載のコンピュータ・プログラム。
【符号の説明】
【０１７８】
１００    二次記憶装置
１０１    ソースプログラム
１０２    修正ソースプログラム
１１０    処理装置
１１１    ソースプログラム解析部
１１２    修正ソースプログラム生成部
１２０    主記憶装置
１２１    スレッド内部情報テーブル
６００    第１のスレッド
６０１    第２のスレッド
６０２    非スレッド
７００〜７０３、８００〜８０２    追加コード
９００    管理テーブル
９０１〜９０５    要素
９１０〜９１３    動的メモリ領域
９２０    管理テーブルの先頭アドレスの指す位置
１０００    処理装置
１１００    コンパイラ処理系
１１０１    中間コード生成部
１１０２    中間コード解析部
１１０３    修正中間コード生成部
１１０４    最適化部
１１０５    オブジェクトコード生成部
１２００    主記憶装置
１２０１    スレッド内部情報テーブル
１３００    二次記憶装置
１３０１    ソースプログラム
１３０２    中間コード
１３０３    修正中間コード
１３０４    修正オブジェクトコード
２０００    処理装置
２０１０    コード解析部
２０１１    修正コード生成部
２０２０    コード
２０２１    修正コード
【図１】
2014130401.tif 000003
【図２】
2014130401.tif 000004
【図３】
2014130401.tif 000005
【図４】
2014130401.tif 000006
【図５】
2014130401.tif 000007
【図６】
2014130401.tif 000008
【図７】
2014130401.tif 000009
【図８】
2014130401.tif 000010
【図９】
2014130401.tif 000011
【図１０】
2014130401.tif 000012
【図１１】
2014130401.tif 000013
【図１２】
2014130401.tif 000014
【図１３】
2014130401.tif 000015