(57)【要約】【課題】  静的コード解析は関数コールをなぞる処理フローによる解析であり、マルチスレッド間でデータのやり取りを行う場合、送信側と受信側で関数が別々であるため処理フローが分断される。  マルチスレッドであるため平行して処理することができ、送信側で確保した動的メモリに必要なデータを格納して受信側に渡した場合、確保した送信側で解放することはできず受信側で解放する必要がある。  このため、このソースを静的コード解析で解析したとき送信側では動的メモリの確保のみが検出でき解放漏れであることが、受信側では動的メモリの解放のみが検出でき未確保領域の解放を指摘するという誤った動作をしてしまう。  また、一貫して送受信を行うにはディスクリプタ（識別子）を用いて通信を行っている。【解決手段】  静的コード解析するときにこのディスクリプタを記録することで、解析時に送信側と受信側の処理フローが関連付いていることを認識し誤指摘を防止する。【選択図】図１
2010282380.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータシステムにおけるマルチスレッド用プログラムの動的メモリ領域の解放漏れの誤検出を防ぐスレッド間メモリリーク解析システムであって、マルチスレッド間でディスクリプタを用いて通信を行うことにより一貫して送受信を行い、静的コード解析するときに前記ディスクリプタを記録することで、送信側と受信側の処理フローが関連付いていることを認識して誤検出を防止することを特徴とするスレッド間メモリリーク解析システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータシステムにおけるマルチスレッド用プログラムの静的コード解析時に検出する、動的確保のメモリ領域の解放漏れつまりメモリリークの誤検出を防ぐものに関する。
【背景技術】
【０００２】
コンピュータシステムにおいてメモリは、起動から終了まで利用することを主目的とした静的に確保するメモリと、必要に応じて利用することを主目的とした動的に確保するメモリがある。
【０００３】
静的に確保したメモリは予めそのサイズが判っていることもあり問題とならないが、動的に確保したメモリは、そのシステムのリソースの上限以上は利用できないため、必要がなくなったメモリは開放することで、そのメモリを再利用できるようにし、システムのリソース内での運用を行う。
【０００４】
コンピュータシステムは、Ｃ／Ｃ＋＋言語に代表される言語で記述されたソースプログラムをコンパイルすることで実現されるがコンパイルする前に静的コード解析を利用して、機械的に摘出できる問題、一例として動的メモリの取得と解放が対応しているかを解析することで、事前にシステム障害となる要因を警告する方法が知られている。
【０００５】
またコンピュータシステムは関数（サブルーチン）をスレッドとして複数並行に実行するマルチスレッド環境になっておりスレッド間のデータの通信に動的メモリを利用する。
【０００６】
このマルチスレッド間で一貫して送受信を行うにはディスクリプタ（識別子）を用いて通信を行っている。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】静的コード解析http://ja.wikipedia.org/wiki/%E9%9D%99%E7%9A%84%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E6%9E%90
【発明の概要】
【発明が解決しようとする課題】
【０００８】
図２はマルチスレッド間で通信する例のＰＡＤである。
【０００９】
送信側スレッドは通信初期化２０１でディスクリプタを初期化し、メモリ確保２０２、メモリ確保した領域にデータ２１０を積み、ディスクリプタを用いて送信２０３、通信破棄２０４でディスクリプタの破棄と動作する。
【００１０】
受信側スレッドは通信初期化２０５でディスクリプタを初期化し、ディスクリプタを用いてデータ２１０の受信２０６、受信したメモリ領域のメモリ解放２０７、通信破棄２０８でディスクリプタの破棄と動作する。
【００１１】
ディスクリプタはユニークであるための情報を用いて初期化され送信側、受信側それぞれの別の値で初期化される。
【００１２】
静的コード解析は関数（サブルーチン）コールをなぞる処理フローによる解析であり、マルチスレッド間でデータのやり取りを行う場合、送信側は送信関数、受信側は受信関数と別々であるため処理フローが分断される。
【００１３】
マルチスレッドであるため送信側と受信側は平行して処理することができ、送信側で確保した動的メモリに必要なデータを格納して受信側に渡した場合、確保した送信側で解放することはできず受信側で解放する必要がある。
【００１４】
このため、このソースを静的コード解析で解析したとき、データ２１０は、送信２０３と受信２０６で受け渡されるにもかかわらず、送信側の処理フロー２０９では動的メモリの確保のみが検出でき動的メモリの解放漏れであることの指摘が、受信側の処理フロー２１１では動的メモリの解放のみが検出でき未確保の動的メモリの解放を指摘するという誤った動作をしてしまう。
【課題を解決するための手段】
【００１５】
静的コード解析するときにディスクリプタを記録することで、解析時に送信側と受信側の処理フローが関連付いていることを認識することで、動的メモリの確保と解放の誤指摘を防止する。
【発明の効果】
【００１６】
静的コード解析の解析時にディスクリプタの記録により送信側で確保した動的メモリを受信側で解放することが認識でき誤指摘しないようにできる。
【図面の簡単な説明】
【００１７】
【図１】本発明の実施形態の例を表すＰＡＤである。
【図２】マルチスレッド間で通信する例のＰＡＤである。
【図３】本発明の実施形態の例を表すブロック図
【図４】静的コード解析システム３０２に入力する関数例を表すＰＡＤである。
【図５】静的コード解析システム３０２に入力する関数例を表すＰＡＤである。
【図６】静的コード解析時にソースコードの解析に用いる関数テーブルの例を表すテーブルである。
【図７】静的コード解析時にディスクリプタを記録するディスクリプタテーブルの例を表すテーブルである。
【図８】静的コード解析時にメモリポインタを記録するメモリポインタテーブルの例を表すテーブルである。
【図９】静的コード解析時にディスクリプタとメモリポインタの関係を記録する通信情報テーブルの例を表すテーブルである。
【発明を実施するための形態】
【００１８】
静的コード解析システム３０２は、図３に示すように、解析するソースファイル３０１を入力としテーブル３０４を参照／更新しながら解析し、解析結果３０３を出力する。
【００１９】
静的コード解析システム３０２は、図２に示すＰＡＤに従い動作し、流れに沿って以下に説明する。
【００２０】
まず、関数テーブルの設定１０１で解析時に判定するのに用いるテーブル３０４の関数テーブル６０１を設定する。
【００２１】
通信初期化関数情報６０２として任意の関数名とディスクリプタのパラメタ位置とディスクリプタがユニークであるための情報を格納する。
【００２２】
ディスクリプタがユニークであるための情報には、例えば、関数の第一パラメタが通信に用いるポート情報を表している場合、通信の識別子としてユニークな情報を得られるのでこの第一パラメタを利用するように格納する。
【００２３】
通信破棄関数情報６０３として任意の関数名と破棄するディスクリプタが指定されるパラメタ位置を格納する。
【００２４】
送信関数情報６０４として任意の関数名と通信に用いるディスクリプタのパラメタ位置と通信データが格納されるメモリポインタのパラメタ位置を格納する。
【００２５】
受信関数情報６０５として任意の関数名と通信に用いるディスクリプタのパラメタ位置と通信データを格納するメモリポインタのパラメタ位置を格納する。
【００２６】
メモリ確保関数情報６０６として任意の関数名と確保したメモリポインタを格納するパラメタ位置を格納する。
【００２７】
メモリ解放関数情報６０７として任意の関数名と解放するメモリポインタを指示するパラメタ位置を格納する。
【００２８】
ソースファイルが終了するまで１０２と1行読み込み１０４にて、通信初期化４０１を読み込む。
【００２９】
読み込んだ情報には関数名とパラメタが指定されており、通信初期化関数検出？１０５にて関数テーブル６０１の通信初期化関数情報６０２の関数名と比較を行い、真となるため、ディスクリプタの登録１１１の処理で通信初期化関数情報６０２のパラメタ位置からディスクリプタのパラメタを特定しディスクリプタテーブル７０１のディスクリプタ情報７０２にディスクリプタがユニークであるための情報と共に登録する。
【００３０】
ソースファイルが終了するまで１０２と1行読み込み１０４にて、メモリ確保４０２を読み込む。
【００３１】
読み込んだ情報には関数名とパラメタが指定されており、通信初期化関数検出？１０５にて関数テーブル６０１の通信初期化関数情報６０２の関数名と比較を行い偽となり、通信破棄関数検出？１０６にて通信破棄関数情報６０３の関数名と比較を行い偽となり、送信関数検出？１０７にて送信関数情報６０４の関数名と比較を行い偽となり、受信関数検出？１０８にて受信関数情報６０５の関数名と比較を行い偽となり、メモリ確保関数検出？１０９にてメモリ確保関数情報６０６の関数名との比較を行い、真となるため、メモリポインタの登録１１５の処理で、メモリ確保関数情報６０６のメモリポインタを格納するパラメタ位置からメモリポインタのパラメタを特定しメモリポインタテーブル８０１のメモリポインタ情報８０２に登録する。
【００３２】
ソースファイルが終了するまで１０２と1行読み込み１０４にて、送信４０３を読み込む。
【００３３】
読み込んだ情報には関数名とパラメタが指定されており、通信初期化関数検出？１０５にて関数テーブル６０１の通信初期化関数情報６０２の関数名と比較を行い偽となり、通信破棄関数検出？１０６にて通信破棄関数情報６０３の関数名と比較を行い偽となり、送信関数検出？１０７にて送信関数情報６０４の関数名との比較を行い、真となるためテーブル確認？１１３の処理で、送信関数情報６０４の通信に用いるディスクリプタのパラメタ位置に指定されているパラメタとディスクリプタテーブル７０１のディスクリプタ情報７０２のパラメタが同じでかつ通信データが格納されるメモリポインタのパラメタ位置に指定されているパラメタとメモリポインタテーブル８０１のメモリポインタ情報８０２のパラメタが同じ場合に、通信情報の登録１１８の処理で、通信情報テーブル９０１のディスクリプタ情報９０２にディスクリプタ情報７０２の内容を、メモリポインタ情報９０３にメモリポインタ情報８０２の内容を登録する。
【００３４】
ソースファイルが終了するまで１０２と1行読み込み１０４にて、通信破棄４０４を読み込む。
【００３５】
読み込んだ情報には関数名とパラメタが指定されており、通信初期化関数検出？１０５にて関数テーブル６０１の通信初期化関数情報６０２の関数名と比較を行い偽となり、通信破棄関数検出？１０６にて通信破棄関数情報６０３の関数名との比較を行い、真となるためディスクリプタの破棄１１２の処理で、通信破棄関数情報６０３の破棄するディスクリプタが指定されるパラメタ位置のパラメタとディスクリプタテーブル７０１のディスクリプタ情報７０２のパラメタが同じ場合に、ディスクリプタ情報７０２を破棄する。
【００３６】
この時点で送信処理のソースファイルが終了したがメモリテーブル８０１に情報が登録されたままであるため、メモリリークの可能性があると判断できる従来の静的コード解析システムでは誤指摘をしてしまうが本発明では誤指摘とならないように以下の処理でメモリテーブル８０１を更新する。
【００３７】
ソースファイルが終了するまで１０２と1行読み込み１０４にて、通信初期化５０１を読み込む。
【００３８】
読み込んだ情報には関数名とパラメタが指定されており、通信初期化関数検出？１０５にて関数テーブル６０１の通信初期化関数情報６０２の関数名と比較を行い、真となるため、ディスクリプタの登録１１１の処理で通信初期化関数情報６０２のパラメタ位置からディスクリプタのパラメタを特定しディスクリプタテーブル７０１のディスクリプタ情報７０２にディスクリプタがユニークであるための情報と共に登録する。
【００３９】
ソースファイルが終了するまで１０２と1行読み込み１０４にて、受信５０２を読み込む。
【００４０】
読み込んだ情報には関数名とパラメタが指定されており、通信初期化関数検出？１０５にて関数テーブル６０１の通信初期化関数情報６０２の関数名と比較を行い偽となり、通信破棄関数検出？１０６にて通信破棄関数情報６０３の関数名と比較を行い偽となり、送信関数検出？１０７にて送信関数情報６０４の関数名と比較を行い偽となり、受信関数検出？１０８にて受信関数情報６０５の関数名との比較を行い、真となるためテーブル確認？１１４の処理で、受信関数情報６０５の通信に用いるディスクリプタのパラメタ位置に指定されているパラメタとディスクリプタテーブル７０１のディスクリプタ情報７０２のパラメタが同じでかつディスクリプタ情報７０２のディスクリプタがユニークであるための情報と通信情報テーブル９０１のディスクリプタ情報９０２のディスクリプタがユニークであるための情報が同じ場合、通信情報の更新１１９の処理で、受信関数情報６０５のメモリポインタのパラメタ位置に指定されているパラメタでメモリポインタテーブル８０１のメモリポインタ情報８０２を更新する。
【００４１】
ソースファイルが終了するまで１０２と1行読み込み１０４にて、メモリ解放５０３を読み込む。
【００４２】
読み込んだ情報には関数名とパラメタが指定されており、通信初期化関数検出？１０５にて関数テーブル６０１の通信初期化関数情報６０２の関数名と比較を行い偽となり、通信破棄関数検出？１０６にて通信破棄関数情報６０３の関数名と比較を行い偽となり、送信関数検出？１０７にて送信関数情報６０４の関数名と比較を行い偽となり、受信関数検出？１０８にて受信関数情報６０５の関数名と比較を行い偽となり、メモリ確保関数検出？１０９にてメモリ確保関数情報６０６と比較を行い偽となり、メモリ解放関数検出？１１０にてメモリ解放関数情報６０７の関数名との比較を行い、真となるためテーブル確認？１１６の処理で、メモリ解放関数情報６０７の解放するメモリポインタを指示するパラメタ位置のパラメタと、メモリポインタテーブル８０１のメモリポインタ情報８０２に登録のパラメタが同じ場合、メモリポインタの破棄１２０の処理で、メモリポインタ情報８０２を破棄する。
【００４３】
ソースファイルが終了するまで１０２と1行読み込み１０４にて、通信破棄５０４を読み込む。
【００４４】
読み込んだ情報には関数名とパラメタが指定されており、通信初期化関数検出？１０５にて関数テーブル６０１の通信初期化関数情報６０２の関数名と比較を行い偽となり、通信破棄関数検出？１０６にて通信破棄関数情報６０３の関数名との比較を行い、真となるためテーブル確認？１１２の処理で、通信破棄関数情報６０３の破棄するディスクリプタが指定されるパラメタ位置のパラメタとディスクリプタテーブル７０１のディスクリプタ情報７０２のパラメタが同じ場合、ディスクリプタの破棄１１７の処理で、ディスクリプタ情報７０２を破棄する。
【００４５】
最後に解析結果の出力１０３にてメモリポインタテーブル８０１のメモリポインタ情報８０２を確認し、破棄済みであるため、メモリリークが発生してないことを解析結果３０３に出力する。
このようにディスクリプタの情報とメモリポインタの情報を関連つけることにより、メモリリークの誤指摘を防止する。
【符号の説明】
【００４６】
３０１  ソースファイル
３０２  静的コード解析システム
３０３  解析結果
３０４  テーブル
６０１  関数テーブル
７０１  ディスクリプタテーブル
８０１  メモリポインタテーブル
９０１  通信情報テーブル
【図１】
2010282380.tif 000003
【図２】
2010282380.tif 000004
【図３】
2010282380.tif 000005
【図４】
2010282380.tif 000006
【図５】
2010282380.tif 000007
【図６】
2010282380.tif 000008
【図７】
2010282380.tif 000009
【図８】
2010282380.tif 000010
【図９】
2010282380.tif 000011