(58)【調査した分野】(Int.Cl.,DB名)
前記マルチスレッドプログラムを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、コンパイラがオブジェクトコードを生成する過程においてソースプログラムコードを変換する中間コードと同等の形式であり、
前記修正コード生成手段が追加する前記第1乃至第4追加コードと前記修正コードとを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、前記中間コードと同等の形式である
ことを特徴とする請求項1または2記載のプログラム生成装置。
前記修正コード生成手段は、前記第1〜第4追加コードと修正コードとが前記中間コード形式の場合に、前記中間コードと同等の記述形式である前記各修正コードを、さらに、コンパイラが出力するオブジェクトコードと同等の記述形式に変換することにより、修正オブジェクトコードを生成する
ことを特徴とする請求項3記載のプログラム生成装置。
前記マルチスレッドプログラムを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、コンパイラがオブジェクトコードを生成する過程においてソースプログラムコードを変換する中間コードと同等の形式であり、
前記修正コード生成機能が追加する前記第1乃至第4追加コードと前記修正コードとを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、前記中間コードと同等の形式である
ことを特徴とする請求項7または8記載のコンピュータ・プログラム。
前記修正コード生成機能は、前記中間コードと同等の記述形式である前記各修正コードを、さらに、コンパイラが出力するオブジェクトコードと同等の記述形式に変換することにより、修正オブジェクトコードを生成する
ことを特徴とする請求項9記載のコンピュータ・プログラム。
【発明を実施するための形態】
【0025】
次に、本発明の実施形態について図面を参照して詳細に説明する。
【0026】
<第1の実施形態>
図1は、本発明の第1の実施形態の構成を示すブロック図である。
【0027】
図1を参照すると、本実施形態は、二次記憶装置100および処理装置110から構成される。
【0028】
処理装置110は、プログラム制御により動作する一般的な情報処理装置(コンピュータ)によって構成されても良いし、専用のハードウェアによって構成されても良い。また、処理装置110は、プロセッサであってもよい。
【0029】
二次記憶装置100は、ハードディスクなどの記憶装置であり、処理装置110が処理対象とするプログラムのソースプログラム101を記憶している。また、二次記憶装置100には、処理装置110が生成する修正コードである修正ソースプログラム102を格納する。ソースプログラム101および修正ソースプログラム102は、それぞれ1つのプログラムとして実行するプログラムについて記述したコードを含む、1つ以上のファイルの集合体である。
【0030】
処理装置110は、ソースプログラム解析部111、修正ソースプログラム生成部112および主記憶装置120を含む。
【0031】
ソースプログラム解析部111は、二次記憶装置100からソースプログラム101を読み込み、該ソースプログラム101のコードを解析することによって検出した、例えば4種のスレッド内部情報を、後述するスレッド内部情報テーブル121に登録する。
【0032】
4種のスレッド内部情報とは、「スレッド開始点SP」、「スレッド終了点EP」、「動的メモリ確保点MP」、そして、「動的メモリ解放点FP」である。なお、本説明では、動的に確保されたメモリ領域を「動的メモリ」または「動的メモリ領域」とも称する。
【0033】
具体的には、「スレッド開始点SP」は、プログラム中でスレッドが開始されるコードの場所である。「スレッド終了点EP」は、プログラム中でスレッドが終了されるコードの場所である。「動的メモリ確保点MP」は、スレッド内で動的なメモリ領域を確保したコードの場所である。「動的メモリ解放点FP」は、スレッド内で確保された動的メモリ領域を解放したコードの場所である。ソースプログラム解析部111は、一つのコードの場所に対して1つのスレッド内部情報を作成する。スレッド内部情報は、コードの場所を示す「ファイル名」情報および「行番号」情報、スレッド内部情報の種別を示す「種別」情報とで構成する。
【0034】
修正ソースプログラム生成部112は、ソースプログラム101およびスレッド内部情報テーブル121に登録された情報から修正コードをを生成し、二次記憶装置100に出力する。本実施形態では、修正コードは、修正ソースプログラム102である。
【0035】
主記憶装置120は、例えば、半導体メモリ装置を用いて実現され、スレッド内部情報テーブル121を記憶する。
【0036】
スレッド内部情報テーブル121は、ソースプログラム解析部111から登録される上記4種のスレッド内部情報を記憶する。
【0037】
次に、上述した構成を備える本実施形態の動作について詳細に説明する。
【0038】
本実施形態に係る処理装置110の動作は、ソースプログラムのコードを解析する解析処理と、そのソースプログラムの修正ソースプログラムを生成する生成処理とを含む。まず、
図2〜
図5を参照して、ソースプログラムのコード解析処理の動作を説明する。
【0039】
図2は、本発明の第1の実施形態におけるソースプログラム101に含まれる第1のファイル(file01.c)の一例を示す図である。
図3は、本発明の第1の実施形態におけるソースプログラム101に含まれる第2のファイル(file02.c)の一例を示す図である。
図4は、本発明の第1の実施形態におけるソースプログラム101に含まれる第3のファイル(file03.c)の一例を示す図である。
図5は、本発明の第1の実施形態におけるソースプログラムのコードの解析処理の動作を示すフローチャートである。
【0040】
まず、本実施形態におけるソースプログラム101は、例えば、C言語で記述されており、
図2〜
図4に示す3つのファイルから構成されるものとする。なお、ソースプログラム101を構成する第1〜第3のファイルのファイル名は、それぞれfile01.c(
図2)、file02.c(
図3)およびfile03.c(
図4)である。また、
図2〜
図4の各図における各行の先頭の3桁の数字は、説明のために表示した行番号であり、ソースプログラムのコードには含まれない。
【0041】
また、本実施形態の動作開始前においては、二次記憶装置100は、ソースプログラム101のみを格納している。修正ソースプログラム102は、動作開始前においては、まだ存在しない。
【0042】
次に、利用者(図示せず)が、解析対象であるソースプログラム101に含まれる全てのファイル(file01.c、file02.cおよびfile03.c)を指定して、ソースプログラム解析部111を起動する。
【0043】
起動したソースプログラム解析部111は、指定されたファイル名の示す3つのファイルからなるソースプログラム101を、二次記憶装置100から読み込む。そして、ソースプログラム解析部111は、読み込んだソースプログラム101の全ファイルを解析し、解析結果を基にプログラムの処理フローを作成する(ステップS100)。ここで、処理フローとは、プログラムを実行したときに通る可能性のあるサブルーチンを通過する順番につないだ全経路を表したものであり、制御フローグラフとも呼ばれる。処理フローの一例として、ソースプログラム解析部111がソースプログラム101を解析した際の処理フローを
図6に示す。
図6は、本発明の第1の実施形態におけるソースプログラムのコードの解析処理において作成される処理フローの一例である。なお、
図6において、点線の枠で示す部分は、説明のために記載した参考情報であり、本ステップで作成する処理フローには存在しない情報である。また、処理フローを作成するための解析方法については、データフロー解析などの一般的な技法を採用することができるので、本実施形態における説明を省略する。
【0044】
なお、サブルーチンとは、複数の作業の固まりを一つの手続きとしてまとめたものであり、C言語のソースコードにおいては、一番外側の「{」と「}」とで囲まれるコードブロックとして識別することができる。一般に、このようなサブルーチンも「関数」と呼ぶことがあるが、本明細書では、標準関数やAPI(Application Programming Interface)として開発者に提供される関数と区別するために、原則として、開発者がソースプログラム101の中に作成した上記のようなコードブロックのことを「サブルーチン」と呼ぶ。
【0045】
次に、ソースプログラム解析部111は、作成した処理フローに基づいて決定した順番で、読み込んだソースプログラム101の全ファイルから、スレッドを生成する関数(以降、「スレッド生成関数」と呼ぶ。)を検索する(ステップS101)。
【0046】
まず、ソースプログラム解析部111は、処理フローの一番上のサブルーチンから検索を始め、以降、経路の下の方にあるサブルーチンを順に検索する。処理フローの経路中に分岐点がある場合、ソースプログラム解析部111は、処理フローの最も左側のサブルーチンを先に検索し、その経路の下端のサブルーチンを検索し終えた後、当該分岐点に戻って右隣のサブルーチンの検索に進む。以下、同様にして、ソースプログラム解析部111は、処理フローの上から下、左から右の順に、サブルーチンの検索順を定める。
【0047】
ソースプログラム解析部111は、上述したようにして処理フローに基づいて検索対象のサブルーチンを決めた後、スレッド生成関数の関数名を表す文字列を検索キーとして、当該検索対象のサブルーチンが含まれるソースプログラム101のファイル内の当該サブルーチンのコードブロックを検索する。本実施形態では、スレッド生成関数の関数名を表す文字列を「create_thread」とする。
【0048】
すなわち、
図6を参照すると、ソースプログラム解析部111は、初めに第1のファイルの「main」サブルーチン(
図2の050行目から090行目まで)を検索し、これにより
図2の070行目および075行目の2箇所でスレッド生成関数の関数名を含むコードを検出する。次に、ソースプログラム解析部111は、分岐点の一番左端の「start_thread」サブルーチンを検索し、その次に、その配下の「func01」サブルーチン、「func03」サブルーチンおよび「func02」サブルーチンを検索する。その後、ソースプログラム解析部111は、当該分岐点に戻って右隣の「start_thread2」サブルーチンおよびその配下を検索する。ソースプログラム解析部111は、最後の「func200」サブルーチンまで、ソースプログラム101に含まれる全てのプログラムコードを漏れなく検索する。本実施形態では、ソースプログラム解析部111が検出するスレッド生成関数は、上述した「main」サブルーチン内の2箇所だけである。
【0049】
ここで、もし、スレッド生成関数が1つも検出されず、ソースプログラム101にスレッド生成関数が存在しない場合は、当該ソースプログラム101はスレッドを利用するプログラムではないため、本実施形態の適用対象外であることを意味する。したがって、この場合、ソースプログラム解析部111は、全ての処理を中止して終了する。
【0050】
なお、ソースプログラム解析処理部111は、これ以降の解析処理(ステップS102〜ステップS108)を各スレッド生成関数で生成されるスレッドごとに順番に行う。すなわち、ソースプログラム解析処理部111は、先に検出された第1のファイル(
図2)の070行目(第1のスレッド生成関数)に関連する部分について一連の解析処理を行ってから、次に検出された第1のファイル(
図2)の075行目(第2のスレッド生成関数)に関連する部分について同様の解析処理を繰り返す。なお、
図6に示す非スレッド602の枠内の処理フローは、スレッド生成関数が呼ばれずに実行される部分(すなわち、スレッド内ではなく親プロセス自身が実行するコードの部分)である。
【0051】
以下では、先に検出された第1のスレッド生成関数(
図2の070行目)で生成された「第1のスレッド600(
図6)」に対する処理を主な例として説明する。
【0052】
スレッド生成関数が存在する場合、次に、ソースプログラム解析部111は、読み込んだソースプログラム101を構成するファイルの中から、スレッド生成関数で生成したスレッドを開始する関数(以降、「スレッド開始関数」と呼ぶ。)が定義されている場所である「スレッド開始点SP」を検索する。ここで、ソースプログラム解析部111が検索する順番は、処理フローに基づいて決定した順番とする。そして、ソースプログラム解析部111は、検出したスレッド開始関数の定義の場所を示すファイル名と行番号とを、「スレッド開始点SP」のスレッド内部情報として、スレッド内部情報テーブル121に登録する(ステップS102)。
【0053】
なお、C言語において、スレッド開始関数の関数名は、スレッド生成関数の引数(関数に続く括弧の中)として指定される。すなわち、スレッド開始関数においては、開発者の作成した「サブルーチン」が「関数」でもある。
【0054】
ステップS102において、まず、ソースプログラム解析部111は、ステップS101で検出したスレッド生成関数の引数の文字列からスレッド開始関数の関数名を得る。すなわち、本実施形態では、第1のスレッド生成関数は「create_thread(start_thread)」であるから、スレッド開始関数の関数名は「start_thread」である。
【0055】
次に、ソースプログラム解析部111は、スレッド開始関数の関数名の文字列を検索キーとして、読み込んだソースプログラム101を構成するファイルの中から、スレッド開始関数が定義されている場所を検索する。ソースプログラム解析部111がスレッド開始関数を検索する方法は、スレッド生成関数の検索(ステップS101)と同様である。ただし、スレッド開始関数の定義の場所は、ソースプログラム101内で1箇所だけなので、スレッド開始関数の定義を検出した時点で検索を終了してよい。本実施形態では、ソースプログラム解析部111は、「start_thread」を検索キーとして検索を行い、第1のファイル(
図2)の100行目に第1のスレッド開始関数を定義するコードを検出する。
【0056】
次に、ソースプログラム解析部111は、検出したスレッド開始関数の定義の場所を示すファイル名と行番号とを、「スレッド開始点SP」のスレッド内部情報として、スレッド内部情報テーブル121に登録する。
【0057】
ソースプログラム解析部111は、初めてスレッド内部情報を登録するとき、主記憶装置120にスレッド内部情報テーブル121を生成する。
【0058】
スレッド内部情報テーブル121は、スレッド内部情報の通し番号情報を登録する項番欄と、スレッド内部情報を検出したソースプログラムのファイル名情報を登録するファイル名欄と、スレッド内部情報を検出したコードの場所を示す当該ソースプログラム内の行番号情報を登録する行番号欄と、スレッド内部情報の種別を示す種別情報を登録する種別欄とから構成される。スレッド内部情報の種別情報には、「スレッド開始点」、「スレッド終了点」、「動的メモリ確保点」および「動的メモリ解放点」の4種がある。
図7は、本発明の第1の実施形態におけるスレッド内部情報テーブル121の構成を示す図である。
【0059】
ここでは、ソースプログラム解析部111は、4種のうちの「スレッド開始点SP」を登録する。すなわち、ソースプログラム解析部111は、スレッド内部情報テーブル121を生成した後、項番欄を「1」とし、ファイル名欄を「file01.c」とし、行番号欄を「100」とし、さらに種別欄を「スレッド開始点」としたスレッド内部情報をスレッド内部情報テーブル121に登録する。
【0060】
以上が、ソースプログラム解析部111のステップS102における処理である。
【0061】
次に、ソースプログラム解析部111は、検出したスレッド開始関数の終了する場所である「スレッド終了点EP」を検索する。そして、ソースプログラム解析部111は、検出した全てのスレッド終了点EPの場所を示すファイル名と行番号とを、1つのスレッド終了点EPに対して1つのスレッド内部情報として、スレッド内部情報テーブル121に登録する(ステップS103)。
【0062】
C言語では、スレッド開始関数の終了する場所は、スレッド開始関数であるサブルーチン内に含まれる「return」というコードがある行(以降、「return行」と言う。)、および、当該サブルーチンの最後の行(すなわち、スレッド開始関数の初めの中括弧「{」に対応する閉じ中括弧「}」のある行)である。なお、スレッド開始関数の終了方法は、言語の仕様に応じて様々である。
【0063】
スレッド終了点EPの検索において、まず、ソースプログラム解析部111は、スレッド開始関数の定義の場所から、「return」という文字列を検索キーとして、スレッド開始関数の最終行まで検索を行う。なお、一つのスレッド開始関数に対してスレッド終了点EPは複数存在することがあるので、ソースプログラム解析部111は、途中でスレッド終了点EPを検出したとしても、スレッド開始関数であるサブルーチンの最終行まで検索する。本実施形態では、ソースプログラム解析部111は、スレッド開始関数のサブルーチンの範囲である第1のファイル(
図2)の100行目〜108行目の間で「return」という文字列を検索し、これにより106行目にのみ当該文字列を検出する。すなわち、ソースプログラム解析部111が、ここで検出するスレッド終了点EPは、return行である106行目と、スレッド開始関数の最終行である108行目の2つである。
【0064】
その後、ソースプログラム解析部111は、検出した全てのスレッド終了点EPの場所を示すファイル名と行番号とを、1つのスレッド終了点EPに対して1つのスレッド内部情報として、スレッド内部情報テーブル121に登録する。すなわち、ソースプログラム解析部111は、検出した「return」行について、項番欄を「2」とし、ファイル名欄を「file01.c」とし、行番号欄を「106」とし、さらに種別欄を「スレッド終了点」としたスレッド内部情報をスレッド内部情報テーブル121に登録する。ソースプログラム解析部111は、スレッド開始関数の最終行についても、同様にスレッド内部情報テーブル121に登録する。登録した結果は、
図7の項番2及び項番3の列に示すとおりである。
【0065】
次に、ソースプログラム解析部111は、現在解析しているスレッドのスレッド開始関数から呼び出される全てのサブルーチンに対して、作成した処理フローに基づいて決定した順番で、動的メモリ領域を確保する関数(動的メモリ確保点MP)を検索する。(ステップS104)。
【0066】
C言語では、利用するAPIなどに応じて動的メモリ領域を確保する動作を含む関数はいくつかある。ただし、本実施形態では、動的メモリ領域を確保する関数の関数名を表す文字列を「malloc」とする。
【0067】
また、ここでソースプログラム解析部111が行う検索の対象範囲は、現在解析中である第1のスレッドのスレッド開始関数以下の範囲(
図6に示す第1のスレッド600の枠内)である。すなわち、ソースプログラム解析部111による検索は、「malloc」という文字列を検索キーとし、処理フローの「start_thread」サブルーチンから検索を始めて、次に「func01」サブルーチン、そして「func02」サブルーチンを検索して終了する。なお、動的メモリ確保点MPは複数存在することがあるので、ソースプログラム解析部111は、途中で動的メモリ確保点MPが検出されたとしても、検索順が最後のサブルーチンの最終行まで検索する。本実施形態では、ソースプログラム解析部111は、「func01」サブルーチンの中で1箇所(第2のファイル(
図3)の102行目)だけ動的メモリ領域を確保する関数を示す文字列を検出する。
【0068】
次に、ソースプログラム解析部111は、動的メモリ領域を確保する関数が存在したかどうかを確認する(ステップS105)。
【0069】
もし、ステップS104で動的メモリ領域を確保する関数が1つも検出されないならば、現在解析中のスレッドでは動的メモリ領域を使用していないので、すなわち、メモリ解放漏れの問題も起こらないことを意味する。したがって、この場合、ソースプログラム解析部111は、現在解析中のスレッドに関するスレッド内部情報テーブル121に登録した情報を削除すると共に、当該スレッドに関する処理を中止する。すなわち、ソースプログラム解析部111は、スレッド内部情報テーブル121に登録された最後のスレッド開始点SP以降のスレッド内部情報を消去する。そして、次の未処理スレッドがあれば(ステップS108)、ソースプログラム解析部111は、ステップS102に戻って、以降の処理を同様に行う。
【0070】
本実施形態では、ステップ108で上述したとおり、動的メモリ領域を確保する関数が存在するので、ソースプログラム解析部111は、動的メモリ確保点MPのスレッド内部情報をスレッド内部情報テーブル121に登録する。すなわち、ソースプログラム解析部111は、検出した全ての動的メモリ確保点MPの場所を示すファイル名と行番号とを、1つの動的メモリ確保点MPに対して1つのスレッド内部情報として、スレッド内部情報テーブル121に登録する。すなわち、ソースプログラム解析部111は、項番欄を「4」とし、ファイル名欄を「file02.c」とし、行番号欄を「102」とし、さらに種別欄を「動的メモリ確保点」としたスレッド内部情報をスレッド内部情報テーブル121に登録する。登録した結果は、
図7に示す項番4の列に示すとおりである。
【0071】
次に、ソースプログラム解析部111は、親プロセスや他のスレッド(スレッド外)からステップS104で検出した動的メモリ領域を利用している可能性がないことを確認する(ステップS106)。
【0072】
確認方法は様々あるが、本実施形態では、現在解析しているスレッドに含まれるサブルーチン内で、グローバル変数にポインタ値を設定しているかどうかに基づいて、スレッド外からの動的メモリ領域の利用の可能性を判断する。これは、あるスレッドが確保した動的メモリ領域をスレッド外から利用する場合、メモリ領域を確保したスレッドが、確保した動的メモリ領域の先頭アドレスを示すポインタ値をグローバル変数を設定し、そのグローバル変数を介して当該動的メモリ領域の先頭アドレスをスレッド外に教える必要があるためである。
【0073】
ここで、グローバル変数とは、外部変数とも呼ばれ、親プロセス自身および親プロセスに含まれる全スレッドから参照可能な変数である。C言語では、グローバル変数の定義は、ソースプログラムファイル内のサブルーチンの外に記述する。また、C言語では、他のソースプログラムファイルで定義されたグローバル変数を使用する場合には、グローバル変数を利用するソースプログラムファイル内のサブルーチンの外に、「extern」という文字列を付加した宣言を記述する。すなわち、ソースプログラム解析部111は、検索対象のサブルーチンが含まれるソースプログラムファイル内において、サブルーチンの外にある定義文を分析することで、グローバル変数名を得ることができる。
【0074】
したがって、ソースプログラム解析部111は、まず、現在解析しているスレッドのスレッド開始関数から呼び出される全てのサブルーチンに対して、作成した処理フローに基づいて決定した順番で、ポインタ型(ポインタ値を格納できる型)のグローバル変数の定義を検索する。ポインタ型のグローバル変数を検出した場合は、さらに、ソースプログラム解析部111は、そのグローバル変数に対して値を設定していないことを確認する。すなわち、第1のスレッド600(
図6)の解析においては、ソースプログラム解析部111は、まず、第1のファイル(
図2)の001行目に「extv」というポインタ型のグローバル変数を検出する。そして、ソースプログラム解析部111は、処理フロー(
図6)の第1のスレッド600に含まれるどのサブルーチンでも、当該グローバル変数に対してポインタ値を設定していないことを確認する。このような場合、ソースプログラム解析部111は、第1のスレッド600内で確保する動的メモリ領域は第1のスレッド600外で利用されることはないと判断し、解析処理を継続する。
【0075】
次に、ソースプログラム解析部111は、現在解析しているスレッドのスレッド開始関数から呼び出される全てのサブルーチンに対して、作成した処理フローに基づいて決定した順番で、動的メモリ領域を解放する関数(動的メモリ解放点FP)を検索する。そして、ソースプログラム解析部111は、検出した全ての動的メモリ解放点FPの場所を示すファイル名と行番号とを、1つの動的メモリ解放点FPに対して1つのスレッド内部情報として、スレッド内部情報テーブル121に登録する(ステップS107)。
【0076】
動的メモリ領域を解放する関数は、動的メモリ領域を確保する関数に対応する動的メモリ解放関数とする。ここでは、「free」という関数を動的メモリ領域を解放する関数とする。なお、C言語では、「free」関数の引数に「malloc」関数で確保した動的メモリ領域の先頭アドレスを指定すると、当該動的メモリ領域が解放される。なお、動的メモリ解放点FPは、複数存在することがある。ここでソースプログラム解析部111が行う検索順番と検索方法は、ステップS104の「動的メモリ確保点MP」の検索と同様なので、本実施形態における詳細な説明を省略する。
【0077】
本実施形態では、ソースプログラム解析部111は、「func02」サブルーチンの中で1箇所(第2のファイル(
図3)の151行目)だけ動的メモリ領域を解放する関数を示す文字列を検出する。
【0078】
その後、ソースプログラム解析部111は、検出した全ての動的メモリ解放点FPの場所を示すファイル名と行番号とを、1つの動的メモリ解放点FPに対して1つのスレッド内部情報として、スレッド内部情報テーブル121に登録する。すなわち、ソースプログラム解析部111は、項番欄を「5」とし、ファイル名欄を「file02.c」とし、行番号欄を「151」とし、さらに種別欄を「動的メモリ解放点」としたスレッド内部情報をスレッド内部情報テーブル121に登録する。登録した結果は、
図7の項番5の列に示すとおりである。以上で、第1のスレッド600(
図6)の範囲内に示すサブルーチンのコードの解析処理は終了する。
【0079】
ここで、もしまだ解析処理を行っていないスレッドがあれば、ステップS102に戻って次のスレッドに関連するコードの解析処理を行う(ステップS108)。
【0080】
本実施形態では、ソースプログラム解析部111は、第1のスレッド600(
図6)に関連する部分の解析処理のあと、第2のスレッド601(
図6)に関連する部分の解析処理を行う。第2のスレッド601の解析では、検出した動的メモリ確保点MPのスレッド内部情報テーブル121へ登録する(ステップS105)までは第1のスレッド600と同様に処理が進む。ただし、第2のスレッド601に関する処理では、親プロセスや他のスレッドから動的メモリ領域を利用している可能性がないことの確認(ステップS106)の処理結果は、第1のスレッド600の場合のそれと異なる。
【0081】
ステップS106における第2のスレッド601(
図6)の解析では、ソースプログラム解析部111は、第3のファイル(
図4)の001行目に「extern」で始まる「extv」というグローバル変数を利用する宣言文を検出し、さらに「func30」サブルーチン内でポインタ値を設定していることを検出する。このような場合、ソースプログラム解析部111は、第2のスレッド601内で確保する動的メモリ領域を第2のスレッドの外で利用する可能性があるとみなし、それまでに登録した第2のスレッドに関するスレッド内部情報テーブル121内のスレッド内部情報を削除して、当該スレッドの処理を中止する。そして、次の未処理スレッドがあれば、ソースプログラム解析部111は、ステップS102に戻って、以降の処理を同様に行う(ステップS108)。本実施形態では、スレッドは2つだけなので、ここでソースプログラム解析部111は、コードの解析処理を終了する。
【0082】
最終的に、ソースプログラム解析部111は、
図2〜
図4のソースプログラム101を解析した結果、
図6のようなスレッド内部情報テーブル121を生成する。
【0083】
ソースプログラム解析部111によるコードの解析処理が終了すると、引き続き修正ソースプログラム生成部112が修正ソースプログラムの生成処理を実行する。修正ソースプログラム生成部112は、ソースプログラム解析部111と同時に起動しておいてもよいし、ソースプログラム解析部111が処理を終了した後などに起動してもよい。
【0084】
図8〜
図11を参照して、修正ソースプログラムの生成処理の動作を説明する。なお、
図9および
図10の各図における各行の先頭の3桁の数字は、説明のために表示した修正前のソースプログラムファイルの行番号であり、ソースプログラムのコードには含まれない。
【0085】
図8は、本発明の第1の実施形態における修正ソースプログラムの修正コードの生成処理の動作を示すフローチャートである。
図9は、本発明の第1の実施形態における修正ソースプログラム102に含まれる第1のファイル(file01.c)の一例を示す図である。
図10は、本発明の第1の実施形態における修正ソースプログラム102に含まれる第2のファイル(file02.c)の一例を示す図である。
図11は、本発明の第1の実施形態における修正後のソースプログラムに基づいて動作させたマルチスレッドプログラムの動作中の一時点での管理テーブルと動的メモリ領域の関係を示す模式図である。
【0086】
まず、修正ソースプログラム生成部112は、ソースプログラム解析部111が生成したスレッド内部情報テーブル121を読み込み、管理テーブル関連の定義コードを、ファイル名欄に登録されている名称に対応する各ソースプログラムファイルの先頭に追加する(ステップS200)。
【0087】
管理テーブルは、プログラムの実行中に各スレッドごとに個別に生成される記憶領域であり、当該スレッドが実行中に確保した全ての動的メモリ領域の場所を示す場所情報を記憶することができる。本実施形態では、確保した動的メモリ領域の場所を示す場所情報として、該動的メモリ領域の先頭アドレスを用いる。
図11に管理テーブル900の一例を示す。また、管理テーブルは、該管理テーブルを定義したスレッド内のコードからのみアクセス可能な記憶領域に作成され、当該スレッドの終了と共に消滅する。以降、定義したスレッド内のコードからのみアクセス可能な記憶領域に作成されることを「スレッドローカル」と言う。
【0088】
C言語では、サブルーチンから管理テーブルの参照や更新などを行う場合、当該サブルーチンを含むソースプログラムファイルに管理テーブル関連の定義コードを記述しておく必要がある。
【0089】
本ステップで修正ソースプログラム生成部112が追加する管理テーブル関連の定義コードは、
図9の追加コード700に示した例のように、管理テーブル900(
図11)の先頭アドレス920(
図11)を保持するためのスレッドローカルな変数である「管理テーブルアドレス」変数(__pt)の定義と、管理テーブル900の未使用部分の先頭位置を示すインデックス値を保持するスレッドローカルな変数である「管理テーブルインデックス」変数(__idx)の定義と、管理テーブルのサイズを示す定数値である「管理テーブルサイズ定数」(MAXSZ)の定義との3つからなる。なお、本実施形態では、管理テーブルのサイズを10000としたが、プログラムの実行中にスレッドが確保する全ての動的メモリ領域の場所の情報(先頭アドレス)を記憶するに足りるサイズであれば、どのような値でも構わない。
【0090】
本実施形態では、修正ソースプログラム生成部112は、スレッド内部情報テーブル121のファイル名欄に登録されている第1のファイル(file01.c)と第2のファイル(file02.c)の2つのファイルに対して、それぞれコードを追加する。追加した結果を
図9の追加コード700および
図10の追加コード800に示す。
【0091】
次に、修正ソースプログラム生成部112は、スレッド内部情報テーブル121を「項番」欄が1のスレッド内部情報から順に読み込む。そして、修正ソースプログラム生成部112は、読み込んだスレッド内部情報の「ファイル名」欄に対応したファイル中の「行番号」欄の示す行番号に基づいて定めた位置に対して、当該スレッド内部情報の「種別」欄に対応したステップS201〜ステップS204の処理を選んで実行することを、全スレッド内部情報について繰り返す。
【0092】
読み込んだスレッド内部情報の「種別」欄が「スレッド開始点」の場合、修正ソースプログラム生成部112は、読み込んだスレッド内部情報の「ファイル名」欄に対応したファイル中の「行番号」欄の示す行の次の行に、管理テーブルを生成し初期化するためのコードを追加する(ステップS201)。ここで、修正ソースプログラム生成部112が、スレッド内部情報テーブル121の項番欄が「1」のスレッド内部情報を処理したときに追加する追加コードの一例を
図9の追加コード701に示す。
【0093】
ここで追加する追加コード701の行う処理内容は、スレッドが開始したすぐ後に、管理テーブルの実体となる領域をスレッドローカルなメモリ領域内に確保し、確保した管理テーブル900(
図11)の領域の先頭アドレス920(
図11)を管理テーブルアドレス変数(__pt)に格納することである。さらに、追加コード701には、言語の仕様に応じて、管理テーブルの要素を、ポインタ値が有効なアドレスではないことを示す値で初期化する処理も含める。本実施形態では、C言語の仕様に従って、「NULL」値で初期化する。
【0094】
読み込んだスレッド内部情報の「種別」欄が「スレッド終了点」の場合、修正ソースプログラム生成部112は、読み込んだスレッド内部情報の「ファイル名」欄に対応したファイル中の「行番号」欄の示す行の前の行に、管理テーブルの動的メモリ領域のアドレス情報から動的メモリ領域の解放漏れを検知し、まだ解放していない動的メモリ領域を強制的に解放するためのコードを追加する(ステップS202)。ここで、修正ソースプログラム生成部112が、スレッド内部情報テーブル121の項番欄が「2」および「3」の各スレッド内部情報を処理したときに追加する追加コードの一例を
図9の追加コード702および追加コード703に示す。
【0095】
ここで追加する追加コード702および追加コード703の行う処理内容は、スレッドが終了する前に、管理テーブルに残っている有効なアドレスを示すポインタ値を検索して、まだ解放していない全ての動的メモリ領域を強制的に解放することである。本実施形態では、修正ソースプログラム生成部112は、動的メモリ解放点FPを検索したときに検索キーとした関数名と同じ「free」関数を用いて動的メモリ領域の解放を行う。すなわち、修正ソースプログラム生成部112は、管理テーブル900に残っている全ての有効な(NULL値以外の値の)アドレス値902について、当該アドレス値902を引数としてfree関数を実行するコードを追加する。
【0096】
読み込んだスレッド内部情報の「種別」欄が「動的メモリ確保点」の場合、修正ソースプログラム生成部112は、読み込んだスレッド内部情報の「ファイル名」欄に対応したファイル中の「行番号」欄の示す行に対して、確保した動的メモリ領域の場所を示す情報である先頭アドレスを管理テーブル900に登録するコードを追加する(ステップS203)。ここで、修正ソースプログラム生成部112が、スレッド内部情報テーブル121の項番欄が「4」のスレッド内部情報を処理したときに追加する追加コードの一例を
図10の追加コード801に示す。
【0097】
ここで追加する追加コード801の行う処理内容は、スレッドが動的メモリ領域を確保したときに、確保した動的メモリ領域の先頭アドレスを管理テーブルインデックス変数(__idx)が指し示す管理テーブル900の未使用部分の先頭に登録することである。
図11を用いて説明すると、追加コード801の動作は、例えば、動的メモリ領域913を確保した後、動的メモリ領域913の先頭アドレスを管理テーブル900の要素904に格納し、インデックス変数を次の要素905を示すように変更するという動作となる。
【0098】
読み込んだスレッド内部情報の「種別」欄が「動的メモリ解放点」の場合、修正ソースプログラム生成部112は、読み込んだスレッド内部情報の「ファイル名」欄に対応したファイル中の「行番号」欄の示す行の次の行に対して、管理テーブルから解放した動的メモリ領域の先頭アドレスを削除(無効化)するコードを追加する(ステップS204)。ここで、修正ソースプログラム生成部112が、スレッド内部情報テーブル121の項番欄が「1」のスレッド内部情報を処理したときに追加するコードの一例を
図10の追加コード802に示す。
【0099】
ここで追加する追加コード802の行う処理内容は、スレッドが動的メモリ領域を解放したときに、管理テーブル900から、解放した動的メモリ領域の場所を示す情報である先頭アドレスを削除(有効なアドレスではないことを示す値で無効化)することである。
図11を用いて説明すると、追加コード802の動作は、例えば、動的メモリ領域910を解放した後、動的メモリ領域910の先頭アドレスの値で管理テーブルを検索して、要素901に動的メモリ領域910の先頭アドレスの値が格納されていたことを検出し、それをNULL値で無効化するという動作となる。
【0100】
このようにしてスレッド内部情報テーブル121に登録された全てのスレッド内部情報についてステップS201〜S204のいずれかの処理を行った後、修正ソースプログラム生成部112は、ソースプログラム101のファイルに対して各種の追加コードを挿入した修正ソースプログラム102を、二次記憶装置100に出力する(ステップS205)。
【0101】
修正ソースプログラム102における第1のファイル(file01.c)は、
図9に例示するようになり、第2のファイル(file02.c)は、
図10に例示するようになる。なお、修正ソースプログラム生成部112は、第3のファイル(file03.c)を変更しないので、修正ソースプログラム102の構成に第3のファイルを加えてもよいし、加えなくてもよい。
【0102】
以上のようにして、処理装置110は、ソースプログラム101から修正ソースプログラム102を自動的に生成し、利用者に提供する。利用者は、出力された修正ソースプログラム102を一般のソースプログラムと同様に扱うことができる。
【0103】
ここで、修正ソースプログラム102を基に作成した実行可能なプログラム(以下、修正プログラムMPと言う。)をコンピュータで実行したとき、メモリリークを防止する動作について説明する。
【0104】
図2を参照すると、元のソースプログラム101のファイルの1つである第1のファイル(file01.c)の104行目から106行目のコードにメモリリークが発生するコードが存在している。詳しく説明すると、第1のスレッド600(
図6)では、105行目で呼び出す「func02」サブルーチン内で動的メモリ領域の解放を行っている(スレッド内部情報テーブル121の項番5の動的メモリ解放点FP)が、その前の104行目の条件「rがゼロであること」に適合しなかった場合は、動的メモリ領域を解放する「func02」サブルーチンを実行せずに第1のスレッド600が終了してしまう。すなわち、104行目を実行する時点で「rがゼロでない」場合には、第1のスレッド600では、スレッド終了後にも動的メモリが解放されずに残るというメモリリークが発生する構造となっている。なお、このメモリリークが発生する場所は、修正ソースプログラム102の第1のファイル(
図9)にもそのまま存在する。このメモリリーク発生箇所を例として、修正プログラムMPにおける第1のスレッド600が、メモリリークをどのように防止するかを説明する。
【0105】
まず、修正プログラムMPは、起動した後に、第1のスレッド600を開始する(
図9の100行目)。すると、第1のスレッド600内で、動的メモリ確保点MPの後にある追加コード701が動作する。追加コード701の処理により、第1のスレッド600は、スレッドローカルなメモリ領域内に、管理テーブルサイズ定数の指定するサイズで、管理テーブル900(
図11)の実体を確保した後、確保した管理テーブル900の全要素をNULL値で初期化する。そして、追加コード701の処理により、第1のスレッド600は、管理テーブルアドレス変数に管理テーブル900の先頭アドレスを格納する。
【0106】
次に、第1のスレッド600は、「func01」サブルーチンを呼び出し(
図9の102行目)、「func01」サブルーチン内で動的メモリ領域(動的メモリ領域910と呼ぶ。)を確保する処理を実行する(
図10の102行目)。このあと、第1のスレッド600内では、動的メモリ確保点MPにある追加コード801が動作する。追加コード801の処理により、第1のスレッド600は、管理テーブルアドレス変数が示す場所にある管理テーブル900の最初の要素901(
図11)に、確保した動的メモリ領域910の先頭アドレスを登録した後、管理テーブルインデックス変数の内容を次の要素902を示すように変更する。
【0107】
さらに、第1のスレッド600は、その処理が
図9の104行目に達したとき、「rがゼロ」の場合であれば、「func02」サブルーチンを呼び出す(
図9の105行目)。そして、第1のスレッド600は、「func02」サブルーチン内で動的メモリ領域910を解放する処理を実行する(
図10の151行目)。このあと、第1のスレッド600では、動的メモリ解放点FPの後にある追加コード802が動作する。追加コード802の動作により、第1のスレッド600は、管理テーブルの要素901(
図11)に登録されていた動的メモリ領域910の先頭アドレスをNULL値に書き換えることで無効化する。
【0108】
「func02」サブルーチンが終了すると、第1のスレッド600は、
図9の106行目にあるスレッド終了点EPの前にある追加コード702を実行する。このときは、上述したとおり、すでに管理テーブル900の要素901に格納されていた動的メモリ領域910の先頭アドレスはNULL値になっている。したがって、追加コード702の処理では動的メモリ領域910の解放を行う必要がなく、第1のスレッド600は、追加コード702の次にある、106行目のreturn行で終了する。このように、もし、元のプログラムがすべての動的メモリ領域をすでに解放していれば、第1のスレッドは、スレッド終了点EPの前にある追加コード702の処理において動的メモリ領域の解放を行わない(行う必要がない)。
【0109】
一方、第1のスレッド600は、その処理が
図9の104行目に達したとき、「rがゼロでない」場合には、「func02」サブルーチンを呼び出さず、スレッド終了点EPの前にある追加コード703を実行する(
図9の107行目)。このときは、管理テーブル900の要素901に有効なアドレス値(NULL値以外)が残っている。したがって、追加コード703の処理により、第1のスレッド600は、要素901に格納されたアドレス値の示す動的メモリ領域910を強制解放する。その後、第1のスレッド600は、次の108行目のスレッド最終行に到達して終了する。すなわち、修正プログラムMPで発生するはずだった動的メモリ領域910の解放漏れ(メモリリーク)は、第1のスレッド600が、追加コード703の処理によって、自らが終了する前に動的メモリ領域910を強制解放したために発生しなくなっている。
【0110】
このようにして、本実施形態によれば、マルチスレッドプログラムの元のソースプログラム101において、各スレッドが終了する時点で動的メモリ領域を解放せずに残してしまうコードを含んでいた場合でも、修正プログラムMPではメモリリークを防ぐことができる。
【0111】
その理由は、処理装置110は、未解放の動的メモリ領域を強制的に解放してから、当該動的メモリを確保したスレッドを終了するための処理をソースプログラム101に対して追加した修正ソースプログラム102を生成することができるからである。
【0112】
また、本実施形態によれば、ソースプログラム101から修正ソースプログラム102を人手による解析や修正の手間なしに自動的に生成することができるという効果もある。そのため、もしソースプログラム101の処理内容が不明であった場合に、通常ならば人手によるメモリリーク発生箇所の特定やプログラム修正が著しく困難であるところが、本実施形態ならば、メモリリーク発生時の対処に要する時間や費用を劇的に抑えることが可能となる。
【0113】
なお、本実施形態での修正ソースプログラム生成部112が、修正ソースプログラムの生成処理に含まれる各ステップにおいて、ソースプログラム101の各ファイルに対して各種追加コードを追加する位置は一例であり、言語の仕様に適した場所であればファイルのどの位置であっても構わない。また、各種追加コードを他のファイルやライブラリ関数として用意しておき、追加コードに含まれるコードでは、用意したファイルやライブラリ関数の処理を呼び出すだけとしてもよい。このようにして、ファイル内の記述位置や追加コードの簡略化を行うことによって、さらに修正ソースプログラム102の可読性の向上をさせることができる。
【0114】
なお、本実施形態ではC言語で記述されたソースプログラムを使用したが、本実施形態を適用可能なプログラミング言語は、これに限定されるものではない。本実施形態は、例えば、動的メモリ領域を利用者から明示的に確保および解放することが可能な各種プログラミング言語などに広く適用することができる。
【0115】
また、本実施形態に利用者からの通知を受け付ける入力部を追加して、スレッド内で確保した動的メモリ領域を親プロセスや他のスレッドから利用している可能性がないことを利用者からソースプログラム解析部111に対して通知してもよい。例えば、プログラムの設計仕様上、スレッド内で確保した動的メモリ領域をスレッド外(親プロセスや他のスレッド)で利用していないことが明確な場合に、利用者が上記の通知を行うとする。これにより、ソースプログラム解析部111は、ソースプログラム101の中にポインタ型のグローバル変数へポインタ値を設定しているコードが含まれていても、ステップS106におけるスレッド外利用を確認する処理を中止せず、それ以降の解析処理を継続するという動作が可能となる。これにより、本実施形態を適用できるソースプログラムの対象範囲がより広くなる効果がある。
【0116】
<第2の実施形態>
次に、上述した第1の実施形態を基本とする第2の実施形態について説明する。以下では、第2の実施形態に係る特徴的な部分を中心に説明し、第1の実施形態と同様な構成を有する第2の実施形態の構成要素については、その構成要素について重複する詳細な説明は省略する。
【0117】
本実施形態では、処理装置は、動的メモリ領域のメモリリークを防ぐように修正した修正コードとして、修正ソースプログラムの代わりに修正中間コードを作成し、さらに、作成した修正中間コードを変換した修正オブジェクトコードも提供する点が異なる。
【0118】
オブジェクトコードとは、プログラムを実行する対象のコンピュータシステムやオペレーティングシステムで動作させるための機械語(マシン語)ファイルのフォーマットに準じた形式で、プログラムのソースコードに対応する機械語の列が格納されているファイルである。複数のオブジェクトコードを結合することで、コンピュータ上で実行可能な実行形式ファイルとなる。オブジェクトコードは、コンパイラ(コンパイラ処理系)と呼ばれる変換プログラムでソースコードを変換した結果として出力される。
【0119】
また、中間コードとは、人間に理解しやすい高水準言語であるソースコードとコンピュータが直接実行できる機械語のコード(オブジェクトコード)との中間にあたる中間表現の言語で記述されたコードであり、コンパイラにおいては処理中に一次的に利用するために生成しているものである。
【0120】
一般的なコンパイラは、ソースプログラムファイルからソースコードを読み込むと、読み込んだソースコードをトークンと呼ばれる字句の並びに分解する字句解析処理、トークンの並びからプログラムの構造を表現する木構造を生成する構文解析処理、木構造からシンボルテーブルの作成や各種チェックを行う意味解析処理、意味解析処理結果から中間コードを生成する中間コード生成処理、中間コードを効率化し実行時間やメモリ使用量を最小限にする最適化処理、および、最適化した中間コードから最終的なオブジェクトコードに変換を行うオブジェクトコード生成処理の順に変換処理を行っている。
【0121】
本実施形態に係る処理装置1000は、そのコンパイラによる変換処理過程に、動的メモリ領域のメモリリークを防止するための修正を行う処理を組み込む。
【0122】
図12は、本発明の第2の実施形態の構成を示すブロック図である。
【0123】
図12を参照すると、本実施形態は、二次記憶装置1300および処理装置1000から構成される。
【0124】
処理装置1000は、プログラム制御により動作する一般的な情報処理装置(コンピュータ)によって構成されても良いし、専用のハードウェアによって構成されても良い。また、処理装置1000は、プロセッサであってもよい。
【0125】
二次記憶装置1300は、ハードディスクなどの記憶装置であり、処理装置1000が処理対象とするプログラムのソースプログラム1301を記憶している。また、二次記憶装置1300には、処理装置1000が生成する中間コード1302、修正中間コード1303、および、修正オブジェクトコード1304を出力する。なお、ソースプログラム1301、中間コード1302、修正中間コード1303、および、修正オブジェクトコード1304は、それぞれ1つのプログラムとして実行するプログラムについて記述したコードを含む、1つ以上のファイルの集合体である。
【0126】
処理装置1000は、中間コード生成部1101、中間コード解析部1102、修正中間コード生成部1103、最適化部1104、オブジェクトコード生成部1105、および主記憶装置1200を含む。
【0127】
中間コード生成部1101は、二次記憶装置1300からソースプログラム1301を読み込んで、中間コード1302に変換し、二次記憶装置1300に格納する。中間コード生成部1101が行う処理は、一般的なコンパイラのソースコード読み込み、字句解析処理、構文解析処理、意味解析処理、および、中間コード生成処理に相当する。
【0128】
中間コード解析部1102は、第1の実施形態におけるソースプログラム解析部111に相当する。中間コード解析部1102は、二次記憶装置1300から中間コード1302を読み込み、該中間コード1302を解析して検出した4種のスレッド内部情報を、スレッド内部情報テーブル1201に登録する。4種のスレッド内部情報、およびスレッド内部情報テーブル1201の構造は、ソースプログラム1301を中間コード1302と読み替えれば、第1の実施形態と同様である。ただし、コードの場所を示す「行番号」情報は、ファイル先頭からのバイト数などの他の表現形式を用いてもよい。
【0129】
修正中間コード生成部1103は、第1の実施形態における修正ソースプログラム生成部112に相当する。修正中間コード生成部1103は、中間コード1302およびスレッド内部情報テーブル1201に登録された情報から、中間コード1302を基にして修正を施した修正コードである修正中間コード1303を生成し、二次記憶装置1300に出力する。修正中間コード1303を生成するために追加するコードの記述言語が異なるだけであり、修正中間コード生成部1103が行う処理の手順は、ソースプログラム1301を中間コード1302と読み替え、修正ソースプログラム102を修正中間コード1303と読み替えれば、第1の実施形態と同様である。
【0130】
最適化部1104は、修正中間コード1303を読み込み、読み込んだ修正中間コード1303に対して実行時間やメモリ使用量を最小限にする最適化を行う。最適化部1104が行う処理は、一般的なコンパイラの最適化処理に相当する。
【0131】
オブジェクトコード生成部1105は、最適化部1104による最適化の結果を反映した修正中間コード1303を機械語に翻訳することで修正オブジェクトコード1304を生成し、二次記憶装置1300に出力する。オブジェクトコード生成部1105が行う処理は、一般的なコンパイラのオブジェクトコード生成処理に相当する。
【0132】
主記憶装置1200は、例えば、半導体メモリ装置を用いて実現され、スレッド内部情報テーブル1201を記憶する。
【0133】
次に、上述した構成を備える本実施形態の動作について詳細に説明する。
【0134】
本実施形態では、中間コード生成部1101、中間コード解析部1102、修正中間コード生成部1103、最適化部1104、および、オブジェクトコード生成部1105を合わせたコンパイラ処理系1100は、ソースプログラム1301をオブジェクトコードに変換するために使用する一般的なコンパイラの機能を包含しているので、一般的なコンパイラと置き換えて使用する。
【0135】
まず、本実施形態の利用者は、ソースプログラム1301を二次記憶装置1300に格納した後、解析対象であるソースプログラム1301に含まれる全てのファイルを指定して、中間コード生成部1101を起動する。なお、中間コード生成部1101以外の部分(中間コード解析部1102、修正中間コード生成部1103、最適化部1104、および、オブジェクトコード生成部1105)は、中間コード生成部1101と同時あるいはほぼ同時に起動しておいてもよいし、各部分の処理終了後などに次の部分を起動してもよい。
【0136】
起動した中間コード生成部1101は、指定されたソースプログラム1301のファイルを読み込み、そのソースプログラム1301をコード変換した中間コード1302を生成して、生成した中間コード1302を二次記憶装置1300に格納する。なお、中間コード生成部1101が行う処理は、一般的なコンパイラのソースコード読み込み、字句解析処理、構文解析処理、意味解析処理、および、中間コード生成処理に相当し、一般的な技法を採用することができるので、本実施形態における詳細な説明を省略する。
【0137】
中間コード生成部1101の処理が終了すると、引き続き中間コード解析部1102が中間コード解析処理を実行する。
【0138】
中間コード解析部1102は、二次記憶装置1300から中間コード1302を読み込み、該中間コード1302を解析して検出した「スレッド開始点SP」と「スレッド終了点EP」と「動的メモリ確保点MP」と「動的メモリ解放点FP」との4種のスレッド内部情報を、スレッド内部情報テーブル1201に登録する。なお、第1の実施形態と解析対象の記述言語が異なるだけであり、中間コード解析部1102が行う解析の手順や生成するスレッド内部情報テーブル1201の構造と内容は、第1の実施形態と同様であるため、詳細な説明を省略する。最終的に、中間コード解析部1102は、第1の実施形態と同等の内容のスレッド内部情報テーブル1201を生成する。
【0139】
中間コード解析部1102の処理が終了すると、引き続き修正中間コード生成部1103が修正中間コード生成処理を実行する。
【0140】
修正中間コード生成部1103は、中間コード1302およびスレッド内部情報テーブル1201に登録された情報から、「スレッド開始点SP」と「スレッド終了点EP」と「動的メモリ確保点MP」と「動的メモリ解放点FP」とに動的メモリ領域のメモリリークを防止するための追加コードを追加することで修正中間コード1303を生成し、生成した修正中間コード1303を二次記憶装置1300に出力する。なお、修正中間コード1303を生成するために追加する各追加コードは、中間コードの言語を用いて記述されているが、当該各コードの処理内容は第1の実施形態と同様である。また、その他の修正中間コード生成部1103が行う処理の手順と内容は、第1の実施形態と同様であるため省略する。最終的に、修正中間コード生成部1103は、第1の実施形態と同等の内容の修正中間コード1303を二次記憶装置1300に出力する。
【0141】
中間コード生成部1103の処理が終了すると、引き続き最適化部1104が修正中間コードの最適化処理を実行する。
【0142】
最適化部1104は、二次記憶装置1300から修正中間コード1303を読み込み、読み込んだ修正中間コード1303に対して実行時間やメモリ使用量を最小限にする最適化を行うことにより、修正中間コード1303を更新する。最適化部1104が行う処理は、一般的なコンパイラの最適化処理に相当し、一般的な技法を採用することができるので、本実施形態における詳細な説明を省略する。
【0143】
次に、オブジェクトコード生成部1105が、最適化された修正中間コード1303を機械語に翻訳することで修正オブジェクトコード1304を生成し、生成した修正オブジェクトコード1304を二次記憶装置1300に出力する。ここで、オブジェクトコード生成部1105は、中間コード1302と修正中間コード1303を削除しても構わない。オブジェクトコード生成部1105が行う処理は、一般的なコンパイラのオブジェクトコード生成処理に相当し、一般的な技法を採用することができるので、本実施形態における詳細な説明を省略する。
【0144】
このようにして、処理装置1000は、ソースプログラム1301から修正オブジェクトコード1304を自動的に生成する。利用者は、出力された修正オブジェクトコード1304を一般的なコンパイル済みのオブジェクトコードと同様に扱うことができる。
【0145】
修正オブジェクトコード1304を基に作成した実行可能なプログラムをコンピュータ上で実行したとき、マルチスレッドプログラムにおけるメモリリークを防止するために追加した各コードの動作は、第1の実施形態と同様である。
【0146】
以上、説明したように、本実施形態には、マルチスレッドプログラムにおける動的メモリ領域のメモリリークを防止するという第1の実施形態と同様の効果に加えて、さらに、ソースプログラム管理における利用者の手間が増えないという効果がある。
【0147】
その理由は、ソースプログラム1301から修正の追加コードを加えた修正オブジェクトコード1304を直接生成するので、第1の実施形態がソースプログラムとは別に修正ソースプログラムを生成することに比べて、本実施形態ではソースプログラムが増えないからである。
【0148】
なお、本実施形態では、オブジェクトコードを機械語としたが、ソースプログラムの言語や、プログラムを実行するコンピュータシステム(オペレーティングシステム)にあわせて、異なる言語を用いてもよい。
【0149】
<第3の実施形態>
次に、上述した各実施形態に共通する概念について説明する。
【0150】
図13は、本発明の第3の実施形態の構成を示すブロック図である。
【0151】
図13を参照すると、本実施形態は、処理装置2000から構成される。
【0152】
処理装置2000は、プログラム制御により動作する一般的な情報処理装置(コンピュータ)によって構成されても良いし、専用のハードウェアによって構成されても良い。また、処理装置2000は、プロセッサであってもよい。
【0153】
処理装置2000は、コード解析部2010と、修正コード生成部2011とを含む。
【0154】
コード解析部2010は、第1の実施形態におけるソースプログラム解析部111、および、第2の実施形態における中間コード解析部1102に相当する。
【0155】
コード解析部2010は、マルチスレッドプログラムを記述するコード(ファイル)2020を読み込み、読み込んだコード2020を解析することで、「スレッド開始点SP」と「スレッド終了点EP」と「動的メモリ確保点MP」と「動的メモリ解放点FP」とを検出する。
【0156】
コード解析部2010が解析を行うコードの範囲は、読み込んだコード2020のうち、動的メモリ領域を確保するコードを含むスレッドを記述するコードである。ただし、あるスレッドが確保した動的メモリ領域が、確保したスレッドの外(親プロセスや他のスレッド)から使用される可能性がある場合には、コード解析部2010は、当該スレッドに関連するコードを除いた範囲において解析する。
【0157】
「スレッド開始点SP」は、動的メモリ領域を確保するスレッドが開始されるコードの場所を示す。「スレッド終了点EP」は、上記スレッドが終了されるコードの場所を示す。「動的メモリ確保点MP」は、上記スレッド内で動的なメモリ領域を確保するコードの場所を示す。「動的メモリ解放点FP」は、上記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す。
【0158】
なお、コード解析部2010は、当該コード2020を含む1つ以上のファイルからなるファイル群などからコード2020を読み込むことができる。
【0159】
修正コード生成部2011は、第1の実施形態における修正ソースプログラム生成部112、および、第2の実施形態における修正中間コード生成部1103に相当する。
【0160】
修正コード生成部2011は、コード解析部2010によって検出された各スレッド開始点SPに対応する場所に対して、動的メモリ領域を確保するスレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第1追加コードを追加する。
【0161】
また、修正コード生成部2011は、コード解析部2010によって検出された各動的メモリ確保点MPに対応する場所に対して、上記管理情報に、上記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第2追加コードを追加する。
【0162】
また、修正コード生成部2011は、コード解析部2010によって検出された各動的メモリ解放点FPに対応する場所に対して、上記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第3追加コードを追加する。
【0163】
また、修正コード生成部2011は、コード解析部2010によって検出された各スレッド終了点EPに対応する場所に対して、上記スレッドが終了する前に動的メモリ領域を解放していない場合には、上記管理情報に含まれる当該動的メモリに関する場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第4追加コードを追加する。
【0164】
最後に、修正コード生成部2011は、上記第1〜第4追加コードの少なくともいずれかが追加された修正コード2021を生成する。修正コード生成部2011は、修正コード2021を1つ以上のファイルなどとして出力することができる。
【0165】
なお、本発明は上述した実施形態の一部または全部は、以下の付記のようにも記載されうるが、以下の付記に限定されるものではない。
【0166】
(付記1)
1つ以上のファイルからなるファイル群に含まれるマルチスレッドプログラムを記述するコードのうち、
動的メモリ領域を確保するコードを含むスレッドを記述するコードの中から、
あるスレッドが確保した動的メモリ領域が、確保したスレッドの外から使用される可能性のある場合には、当該スレッドに関連するコードを除き、
その結果残ったコードを解析することにより、
前記スレッドが開始されるコードの場所を示すスレッド開始点と、前記スレッドが終了されるコードの場所を示すスレッド終了点と、前記スレッド内で動的なメモリ領域を確保するコードの場所を示す動的メモリ確保点と、前記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す動的メモリ解放点とを検出するコード解析手段と、
前記解析手段によって検出された前記各スレッド開始点に対応する場所に対して、前記スレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第1追加コードを追加し、
前記解析手段によって検出された前記各動的メモリ確保点に対応する場所に対して、前記管理情報に、前記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第2追加コードを追加し、
前記解析手段によって検出された前記各動的メモリ解放点に対応する場所に対して、前記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第3追加コードを追加し、
前記解析手段によって検出された前記各スレッド終了点に対応する場所に対して、前記スレッドが終了する前に前記動的メモリ領域を解放していない場合には、前記管理情報に含まれる前記動的メモリに関する前記場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第4追加コードを追加する処理を実施することにより、
前記第1乃至第4追加コードの少なくともいずれかが追加されたファイルをなす修正コードを生成する修正コード生成手段とを備える
ことを特徴とするプログラム生成装置。
【0167】
(付記2)
前記動的メモリ領域を確保したスレッドの外では、前記スレッドが確保する動的メモリ領域を利用しないことを示す通知情報をユーザが入力可能な入力手段を更に備え、
前記コード解析手段は、前記入力手段から前記通知情報が入力された場合には、通知の対象であるスレッドに関連するコードも含めて解析する
ことを特徴とする付記1記載のプログラム生成装置。
【0168】
(付記3)
前記マルチスレッドプログラムを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、コンパイラがオブジェクトコードを生成する過程においてソースプログラムコードを変換する中間コードと同等の形式であり、
前記修正コード生成手段が追加する前記第1乃至第4追加コードと前記修正コードとを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、前記中間コードと同等の形式である
ことを特徴とする付記1または2記載のプログラム生成装置。
【0169】
(付記4)
前記修正コード生成手段は、前記第1〜第4追加コードと修正コードとが前記中間コード形式の場合に、前記中間コードと同等の記述形式である前記各修正コードを、さらに、コンパイラが出力するオブジェクトコードと同等の記述形式に変換することにより、修正オブジェクトコードを生成する
ことを特徴とする付記3記載のプログラム生成装置。
【0170】
(付記5)
1つ以上のファイルからなるファイル群に含まれるマルチスレッドプログラムを記述するコードのうち、
動的メモリ領域を確保するコードを含むスレッドを記述するコードの中から、
あるスレッドが確保した動的メモリ領域が、確保したスレッドの外から使用される可能性のある場合には、当該スレッドに関連するコードを除き、
その結果残ったコードを解析することにより、
前記スレッドが開始されるコードの場所を示すスレッド開始点と、前記スレッドが終了されるコードの場所を示すスレッド終了点と、前記スレッド内で動的なメモリ領域を確保するコードの場所を示す動的メモリ確保点と、前記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す動的メモリ解放点とを、情報処理装置を用いて検出し、
検出された前記各スレッド開始点に対応する場所に対して、前記スレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第1追加コードを追加し、
検出された前記各動的メモリ確保点に対応する場所に対して、前記管理情報に、前記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第2追加コードを追加し、
検出された前記各動的メモリ解放点に対応する場所に対して、前記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第3追加コードを追加し、
検出された前記各スレッド終了点に対応する場所に対して、前記スレッドが終了する前に前記動的メモリ領域を解放していない場合には、前記管理情報に含まれる前記動的メモリに関する前記場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第4追加コードを追加する処理を、情報処理装置を用いて実施することにより、
前記第1乃至第4追加コードの少なくともいずれかが追加されたファイルである修正コードを、情報処理装置を用いて生成する
ことを特徴とするプログラム生成方法。
【0171】
(付記6)
前記動的メモリ領域を確保したスレッドの外では、前記スレッドが確保する動的メモリ領域を利用しないことを示す通知情報をユーザが入力可能とし、
前記コードを解析する際に、前記通知情報が入力された場合には、通知の対象であるスレッドに関連するコードも含めて解析する
ことを特徴とする付記5記載のプログラム生成方法。
【0172】
(付記7)
前記マルチスレッドプログラムを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、コンパイラがオブジェクトコードを生成する過程においてソースプログラムコードを変換する中間コードと同等の形式であり、
前記第1乃至第4追加コードと前記修正コードとを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、前記中間コードと同等の形式である
ことを特徴とする付記5または6記載のプログラム生成方法。
【0173】
(付記8)
前記修正コードを生成する際に、前記中間コードと同等の記述形式である前記各修正コードを、さらに、コンパイラが出力するオブジェクトコードと同等の記述形式に変換することにより、修正オブジェクトコードを生成する
ことを特徴とする付記3記載のプログラム生成方法。
【0174】
(付記9)
プログラム生成装置として動作するコンピュータの動作制御のためのコンピュータ・プログラムであって、そのコンピュータ・プログラムにより、
1つ以上のファイルからなるファイル群に含まれるマルチスレッドプログラムを記述するコードのうち、
動的メモリ領域を確保するコードを含むスレッドを記述するコードの中から、
あるスレッドが確保した動的メモリ領域が、確保したスレッドの外から使用される可能性のある場合には、当該スレッドに関連するコードを除き、
その結果残ったコードを解析することにより、
前記スレッドが開始されるコードの場所を示すスレッド開始点と、前記スレッドが終了されるコードの場所を示すスレッド終了点と、前記スレッド内で動的なメモリ領域を確保するコードの場所を示す動的メモリ確保点と、前記スレッド内で確保された動的メモリ領域を解放するコードの場所を示す動的メモリ解放点とを検出するコード解析機能と、
前記解析機能によって検出された前記各スレッド開始点に対応する場所に対して、前記スレッドが実行中に確保する動的メモリ領域に関する場所情報を管理する管理情報を作成可能な第1追加コードを追加し、
前記解析機能によって検出された前記各動的メモリ確保点に対応する場所に対して、前記管理情報に、前記スレッドが確保する各動的メモリ領域に関する場所情報を登録可能な第2追加コードを追加し、
前記解析機能によって検出された前記各動的メモリ解放点に対応する場所に対して、前記管理情報に含まれる解放済みの動的メモリ領域に関する場所情報を無効化可能な第3追加コードを追加し、
前記解析機能によって検出された前記各スレッド終了点に対応する場所に対して、前記スレッドが終了する前に前記動的メモリ領域を解放していない場合には、前記管理情報に含まれる前記動的メモリに関する前記場所情報のうちの無効化されていない場所情報に基づいて、未解放の動的メモリ領域を解放可能な第4追加コードを追加する処理を実施することにより、
前記第1乃至第4追加コードの少なくともいずれかが追加されたファイルである修正コードを生成する修正コード生成機能とを、前記コンピュータに実現させる
ことを特徴とするコンピュータ・プログラム。
【0175】
(付記10)
前記動的メモリ領域を確保したスレッドの外では、前記スレッドが確保する動的メモリ領域を利用しないことを示す通知情報をユーザが入力可能な入力機能を更に備え、
前記コード解析機能は、前記入力機能から前記通知情報が入力された場合には、通知の対象であるスレッドに関連するコードも含めて解析する
ことを特徴とする付記9記載のコンピュータ・プログラム。
【0176】
(付記11)
前記マルチスレッドプログラムを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、コンパイラがオブジェクトコードを生成する過程においてソースプログラムコードを変換する中間コードと同等の形式であり、
前記修正コード生成機能が追加する前記第1乃至第4追加コードと前記修正コードとを記述するコードの記述形式は、ソースプログラムコードを記述する形式、もしくは、前記中間コードと同等の形式である
ことを特徴とする付記9または10記載のコンピュータ・プログラム。
【0177】
(付記12)
前記修正コード生成機能は、前記中間コードと同等の記述形式である前記各修正コードを、さらに、コンパイラが出力するオブジェクトコードと同等の記述形式に変換することにより、修正オブジェクトコードを生成する
ことを特徴とする付記11記載のコンピュータ・プログラム。