[go: up one dir, main page]

JP2018156568A - コンパイル装置 - Google Patents

コンパイル装置 Download PDF

Info

Publication number
JP2018156568A
JP2018156568A JP2017054709A JP2017054709A JP2018156568A JP 2018156568 A JP2018156568 A JP 2018156568A JP 2017054709 A JP2017054709 A JP 2017054709A JP 2017054709 A JP2017054709 A JP 2017054709A JP 2018156568 A JP2018156568 A JP 2018156568A
Authority
JP
Japan
Prior art keywords
read
write
dummy
basic block
area
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2017054709A
Other languages
English (en)
Inventor
内田 勝也
Katsuya Uchida
勝也 内田
鈴木 厚
Atsushi Suzuki
厚 鈴木
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Toshiba Corp
Toshiba Electronic Devices and Storage Corp
Original Assignee
Toshiba Corp
Toshiba Electronic Devices and Storage Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Toshiba Corp, Toshiba Electronic Devices and Storage Corp filed Critical Toshiba Corp
Priority to JP2017054709A priority Critical patent/JP2018156568A/ja
Publication of JP2018156568A publication Critical patent/JP2018156568A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

【課題】ソースプログラムのコンパイル時にライト命令に対応するダミーリードの挿入漏れを検出することができるコンパイル装置を提供する。
【解決手段】実施形態のコンパイル装置は、ソースプログラムにおけるライト命令を検出するライト検出部と、前記ライト命令が検出された後のリード命令を検出するリード検出部と、前記ライト命令により書き込み領域が指定され、前記リード命令により読み出し領域が指定され、前記読み出し領域が前記書き込み領域と一致するか否かを判定する判定部とを備える。
【選択図】図5

Description

実施形態は、ソースプログラムをコンパイルするコンパイル装置に関するものである。
高水準言語、例えばC言語などで記述されたソースプログラムは、コンパイル処理されてオブジェクトプログラムに変換される。このコンパイル処理を実行するプロセッサの仕様によっては、ソースプログラムにおけるあるコア(モジュール)がメモリやレジスタへ値を書き込む場合、書き込み命令の直後に書き込みが完了することが保証できず、書き込み命令の直後に別のコア(モジュール)が値を読み出すと、書き込み前の値(前回値)が読み出される場合がある。
この対策として、あるコア(モジュール)によるメモリへの書き込み後に、同一のコア(モジュール)が同一メモリ領域から値を読み出し、書き込み完了を保証するという手法がある。このような書き込み完了を保証するために必要な読み出しを「ダミーリード」と呼ぶ。
特開2000−305809号公報 特表2004−520643号公報 特開平1−76129号公報
ソースプログラムのコンパイル時にライト命令に対応するダミーリードの挿入漏れを検出することができるコンパイル装置を提供する。
実施形態のコンパイル装置は、ソースプログラムにおけるライト命令を検出するライト検出部と、前記ライト命令が検出された後のリード命令を検出するリード検出部と、前記ライト命令により書き込み領域が指定され、前記リード命令により読み出し領域が指定され、前記読み出し領域が前記書き込み領域と一致するか否かを判定する判定部とを具備する。
図1は、プログラムの開発フローを示す図である。 図2は、第1実施形態のコンパイル装置のハードウェア構成を示す図である。 図3は、第1実施形態におけるソースプログラムをオブジェクトプログラムに変換するコンパイル処理を示す図である。 図4は、図3に示したコンパイル処理中のコード生成の詳細を示すフローチャートである。 図5は、図4に示したコード生成処理中のダミーリードチェックの処理を示すフローチャートである。 図6は、図5に示したダミーリードチェックの処理で生成されるテーブル例を示す図である。 図7は、前記ダミーリードチェック処理中のリード漏れチェックの詳細を示すフローチャートである。 図8は、第1実施形態の変形例1におけるダミーリードチェックの処理を示すフローチャートである。 図9は、第1実施形態の変形例1が適用されるプログラム例を示す図である。 図10は、第1実施形態の変形例1におけるダミーリードチェックの処理で生成されるテーブル例を示す図である。 図11は、第1実施形態の変形例2が適用されるプログラム例を示す図である。 図12は、第1実施形態の変形例2におけるダミーリードチェックの処理で生成されるテーブル例を示す図である。 図13は、第2実施形態のダミーリードチェックの処理を示すフローチャートである。 図14は、図13に示したダミーリードチェック処理中のリード漏れチェックの詳細を示すフローチャートである。 図15は、第2実施形態の変形例が適用されるプログラム例を示す図である。 図16は、第3実施形態のダミーリードチェックの処理を示すフローチャートである。 図17は、図16に示したダミーリードチェックの処理で生成されるテーブル例を示す図である。 図18は、第4実施形態の処理を示すフローチャートである。
以下、図面を参照して実施形態について説明する。以下の説明において、同一の機能及び構成を有する構成要素については同一符号を付す。また、以下に示す各実施形態は、この実施形態の技術的思想を具体化するための装置や方法を例示するものであって、構成部品の材質、形状、構造、及び配置等を下記のものに特定するものではない。
各機能ブロックは、ハードウェア、コンピュータソフトウェアのいずれかまたは両者を組み合わせたものとして実現することができる。各機能ブロックが以下の例のように区別されていることは必須ではない。例えば、一部の機能が例示の機能ブロックとは別の機能ブロックによって実行されてもよい。さらに、例示の機能ブロックがさらに細かい機能サブブロックに分割されていてもよい。
1.第1実施形態
プロセッサ上で実行するプログラムは、例えば図1に示すようなフローで開発される。
(1)プログラム開発者がソースファイル(ソースプログラム)を作成する。
(2)コンパイラを有するコンパイル装置は、ソースファイルをコンパイル処理し、実行形式ファイル(あるいは、オブジェクトプログラム)を生成する。
(3)実行形式ファイルがプロセッサ上のメモリに置かれ、各種アプリケーションが実行される。
ソースプログラムは、コンパイル装置によりコンパイル処理され、中間言語ファイルの生成、およびリンカを介して実行形式ファイルとして生成される。以下に、ソースプログラムをコンパイル処理するコンパイル装置について説明する。
1.1 コンパイル装置の構成
図2は、第1実施形態のコンパイル装置のハードウェア構成を示す図である。コンパイル装置10は、コンピュータ、例えば、汎用コンピュータ、ワークステーション、及びパーソナルコンピュータ等から構成される。図2に示すように、コンパイル装置10は、CPU(Central Processing Unit)11、RAM(Random Access Memory)12、ROM(Read Only Memory)13、及び入出力部14を備える。CPU11、RAM12、ROM13、及び入出力部14はバス15により相互に接続されている。
CPU11は、例えば、ROM13に記憶された制御プログラムに従いハードウェア各部を制御する。CPU11は、コンパイルプログラムに従ってソースプログラムに対してコンパイル処理を実行する。コンパイルプログラムは、例えば、ROM13内に格納されており、起動時にバス15を介してRAM12へロードされる。
RAM12は、CPU11によるコンパイルプログラムの実行時に発生する各種データ、例えば中間コード及びテーブルを一時的に記憶する。RAM12は、例えば、SRAM(Static RAM)または、DRAM(Dynamic RAM)、フラッシュメモリなどを含む。
ROM13は、例えば、制御プログラム及びコンパイルプログラムなどを記憶する。
入出力部14は、外部の装置あるいはユーザから信号及びデータを受け取る入力部と、外部の装置あるいはユーザへ信号及びデータを出力する出力部を備える。入力部は、例えば、外部の装置からソースプログラム、コンパイルプログラム、及びユーザからの操作指示などを受け取る。出力部は、CPU11で処理されたデータあるいはオブジェクトプログラム、RAM12に記憶されたデータなどを出力する。
1.2 コンパイル装置の動作
次に、ソースプログラムをオブジェクトコードに変換するコンパイル処理の手順を説明する。図3は、ソースプログラムを機械語等のオブジェクトコード(オブジェクトプログラム)に変換するコンパイル処理を示す。このコンパイル処理はCPU11によって実行される。
例えば、ソースプログラムP1は、入出力部14から入力され、RAM12に記憶される。ソースプログラムP1は、高水準言語、例えばC言語などで記述されている。
まず、ソースプログラムP1に対して字句解析を実行する(ステップS1)。
次に、ステップS1での字句解析結果が文法的に正しいかどうかを解析する。すなわち、ステップS1で分割された字句が構文規則に従っているか解析し、構文解析情報を生成する(ステップS2)。
続いて、構文解析情報に基づいて中間コードを生成する(ステップS3)。さらに、中間コードを変換して、中間コードを最適化する(ステップS4)。
次に、最適化された中間コードから機械語などのオブジェクトコードを生成する(ステップS5)。このコード生成の処理の詳細については後述する。
続いて、高速実行が可能なように、オブジェクトコードを最適化する(ステップS6)。さらに、最適化されたオブジェクトコードP2を出力する(ステップS7)。
本実施形態では、図3に示す「コード生成」の処理において、ダミーリードの挿入漏れをチェックし、挿入漏れがある場合、警告を出力する処理(以下、ダミーリードチェックと記す)が実行される。なお、ダミーリードチェックは、別の処理、例えば「構文解析」や「中間コード最適化」などの処理で実行してもよい。
また、上述では、ステップS1〜S7はCPU11が実行する処理として説明したが、ステップS1〜S7はそれぞれコンパイルプログラムの1部分(モジュール)として、「字句解析部」、「構文解析部」、「中間コード生成部」、「中間コード最適化部」、「コード生成部」、「コード最適化部」、及び「コード出力部」と捉えることもできる。
図4は、図3に示したコンパイル処理中のコード生成(ステップS5)の詳細を示すフローチャートである。このコード生成の処理はCPU11によって実行される。
まず、中間コード最適化(ステップS4)により最適化された中間コードから基本ブロックを作成する(ステップS11)。中間コードは、高水準言語(例えば、C言語)と機械語の中間的言語からなる。中間コードは、高水準言語で書かれたプログラムを単一の処理に分割したものである。基本ブロックは、分岐や関数呼び出しで区切られた、処理が途中で途切れない連続する中間コードで構成されるブロックをさす。
次に、基本ブロックから流れグラフを作成する(ステップS12)。流れグラフは、基本ブロックをつないだものである。流れグラフによりデータアクセスの流れを追うことができる。
次に、流れグラフ内の中間コードに対してダミーリードチェックを実行する(ステップS13)。ダミーリードチェックは、基本ブロックと流れグラフの情報を必要とするため、流れグラフの作成後に実行する。ダミーリードチェックの詳細については後述する。
次に、レジスタの割り当てを実行する(ステップS14)。ここでは、仮想レジスタがCPU11の有するレジスタに割り当てられる。さらに、基本ブロック及び流れグラフに基づいてオブジェクトコードを生成する(ステップS15)。
なお、ダミーリードチェックの実行は、流れグラフの作成後であればよく、レジスタ割り当ての後、あるいはオブジェクトコード生成の後であってもよい。
1.2.1 ダミーリードチェック
第1実施形態では、基本ブロック単位で中間コードを解析し、ダミーリードの挿入漏れをチェックする。以下に、基本ブロック内でダミーリードの挿入漏れをチェックする手順を説明する。ソースプログラム作成時のダミーリード挿入やその確認を容易にするために、ダミーリードは、ライト命令の直後に置くのが適しており、実際にライトの直後に置かれる場合が多い。このため、基本ブロック単位でダミーリードの挿入漏れをチェックするのが有効である。
図5は、図4に示したコード生成処理中のダミーリードチェックの処理を示すフローチャートである。図6は、ダミーリードチェックの処理で生成されるテーブル例を示す図である。このダミーリードチェックの処理はCPU11によって実行される。
ダミーリードチェックが開始されると、まず、ダミーリードのチェックに使用するテーブルP3を初期化する(ステップS101)。テーブルP3には、図6に示すように、ライト処理(ライト命令)の中間コード、ライト先のアドレス、リード回数、及び次のテーブルへのポインタなどの情報が格納される。テーブルP3はRAM12に生成される。
次に、基本ブロック内の中間コードを順に探索し、中間コードがライト処理(ライト命令)か否かを判定する(ステップS102)。中間コードがライト処理である場合、ライト先のアドレスと同一の(あるいは一致する)アドレスを記録したテーブルが既にあるか否かを判定する(ステップS103)。
ステップS103にて、同一のアドレスを記録したテーブルが既にある場合、そのテーブル内のアドレスのリード回数を“0”にする(ステップS104)。一方、同一のアドレスを記録したテーブルがない場合、新たなテーブル内にそのアドレスを保存する(ステップS105)。その後、ステップS106に進む。
ステップS104に示したように、同一アドレスに対して複数回のライトがあるときは、最後のライトの後にダミーリードがあるかを確認する必要がある。例えば、ライト1回目→リード1回目→ライト2回目の場合、リード1回目はライト2回目のダミーリードにはならない。このため、ライト時にもテーブルを探索し、同一アドレスへのライトがあるとき、リード回数を“0”にクリアする。
次に、ステップS102にて中間コードがライト処理でない場合、中間コードがリード処理(リード命令)か否かを判定する(ステップS107)。中間コードがリード処理である場合、リード先のアドレスが、テーブル内に保存されているライト先のアドレスと同一か否かを判定する(ステップS108)。
ステップS108にて、アドレスが同一の場合は、リード回数を“1”加算する、すなわち、リード回数をインクリメントする。(ステップS109)。その後、ステップS106に進む。一方、アドレスが同一でない場合は、次の中間コードへ移り(ステップS110)、ステップS102へ戻る。
また、ステップS107で中間コードがリード処理でない場合、ステップS106へ進む。
ステップS106では、基本ブロック内の全ての中間コードを調べたか否かを判定する。全ての中間コードを調べていない場合は、次の中間コードへ移り(ステップS110)、ステップS102へ戻る。その後、ステップS102以降の処理を繰り返す。
一方、ステップS106にて、全ての中間コードの調査が終了した場合は、ダミーリードの挿入漏れがあるか否かをチェック(以下、リード漏れチェックと記す)する(ステップS111)。リード漏れチェックでは、ライト先のアドレスを保存したテーブルP3を順に参照する。テーブルを参照した結果、リード回数が“0”のものはダミーリードの挿入漏れがあると判定され、警告信号が出力される。このリード漏れチェックの詳細については後述する。その後、ダミーリードチェックが終了する。
図7は、ダミーリードチェック処理中のリード漏れチェックの詳細を示すフローチャートである。このリード漏れチェックでは、図5の処理で記録したテーブルP3を順に参照する。
まず、図5の処理で記録した全てのテーブルP3を参照したか否かを判定する(ステップS121)。すなわち、参照対象のテーブルP3が終わりか否かを判定する。テーブルP3が終わりでない場合、そのテーブルP3内のリード回数を判定する(ステップS122)。
ステップS122にて、リード回数が0回である場合、ダミーリードの挿入漏れがあると判定して警告信号を出力する(ステップS123)。その後、ステップS124に進む。一方、リード回数が1回以上である場合、必要なダミーリードが挿入されていると判定し、ステップS124に進む。
ステップS124では、参照対象を次のテーブルへ移し、ステップS121に戻る。そして、ステップS121以降の処理を繰り返す。
ステップS121にて、全てのテーブルP3の参照が終了した場合、リード漏れチェックの処理を終了する。
図5に示したダミーリードチェックの処理において、ライトのアドレスとリードのアドレスとが同一か否かの判定は以下のように扱う。ライトとリードのアドレスの数値が同じ場合は、同一アドレスと判定する。また、ライトとリードのアドレスが同じ変数であれば、同一アドレスと判定する。また、ライトとリードのアドレスが同じ配列の異なる要素であれば、同一アドレスと判定する。さらに、ライトとリードのアドレスが同じ構造体、共用体、ビットフィールドの異なるメンバであれば、同一アドレスと判定する。
また、図6に示したテーブルP3は、「ライト処理の中間コードへのポインタ」を保持してもよい。ライト処理の中間コードへのポインタは、その中間コードからソースプログラム上の行番号を導出し、それを警告メッセージとするために必要な情報である。しかし、警告メッセージ中に行番号を出力しないのであれば、不要である。
また、テーブルP3内の「ライト先のアドレス」は、ライト先及びリード先のアドレスとの比較のために必要である。しかし、このためであれば、「ライト処理の中間コードへのポインタ」から導出可能であるため、「ライト処理の中間コードへのポインタ」あるいは「ライト先のアドレス」のどちらか一方のみを保持してもよい。
1.2.2 ダミーリードチェックの変形例1
前述した第1実施形態では、ライト先及びリード先を示す同一変数へのアクセスは同一領域へのアクセスであると判定した。実際は、同じターゲット(プロセッサ毎に定義されるアクセス単位)内へのアクセスは同一領域へのアクセスであると判定する。コンパイル装置としては、同じターゲットであるかどうかは、同じセクション(データをメモリに割り当てる単位)かどうかとして判定する。
変形例1では、ライト先の変数とリード先の変数とが同じセクションに配置されれば、同一領域へのアクセスであるとみなす。変形例1では第1実施形態と異なる点について主に説明する
図8は、変形例1のダミーリードチェックの処理を示すフローチャートである。図9は、変形例1が適用されるプログラム例を示す図である。図10は、ダミーリードチェックの処理で生成されるテーブル例を示す図である。
図8に示すフローチャートにおいて、中間コードがライト処理か否かを判定する(ステップS102)。中間コードがライト処理である場合、ライト先の変数が配置されるセクションと同一のセクションを記録したテーブルP4が既にあるか否かを判定する(ステップS103A)。
ステップS103Aにて、同一のセクションを記録したテーブルP4が既にある場合、そのテーブル内のリード回数を0にする(ステップS104)。一方、同一のセクションを記録したテーブルがない場合、新たなテーブル内にそのセクションを保存する(ステップS105A)。その後、ステップS106に進む。
また、ステップS102にて中間コードがライト処理でない場合、中間コードがリード処理か否かを判定する(ステップS107)。中間コードがリード処理である場合、リード先の変数が配置されるセクションが、テーブルP4内に保存されているライト先のセクションと同一か否かを判定する(ステップS108A)。
ステップS108Aにて、リード先とライト先のセクションが同一の場合は、リード回数を“1”加算する、すなわち、リード回数をインクリメントする。(ステップS109)。その後、ステップS106に進む。一方、セクションが同一でない場合は、次の中間コードへ移り(ステップS110)、ステップS102へ戻る。その他の処理は図5に示した処理と同様である。
図9に示すプログラム例を参照すると、変数ary1と変数ary2は同じセクションに配置される。同じセクションに配置される変数へのライトの後にリードがあるため、このプログラム例では、ダミーリードがある、すなわちダミーリードの挿入漏れがないと判定する。この判定処理のために、図10に示すテーブルP4では、図6に示した「ライト先のアドレス」を「配置セクション名」に変更する。
変形例1では、ライト命令に対応するダミーリードの挿入漏れ判定をセクション単位で行えるため、第1実施形態よりもダミーリード挿入漏れの誤判定を減らすことができる。これにより、変形例1のコンパイル装置が出力する警告に対してプログラム開発者による対応工数を低減できる。
1.2.3 ダミーリードチェックの変形例2
変形例2は、変数ary1と変数ary2が異なるセクションに配置される例である。この場合、変形例1ではダミーリードの挿入漏れがある(ダミーリードが無い)と判定されるが、ダミーリードの挿入漏れがない(ダミーリードがある)と判定してよい場合がある。
図11は、変形例2が適用されるプログラム例を示す図である。図12は、ダミーリードチェックの処理で生成されるテーブル例を示す図である。
図11に示すプログラム例を参照すると、変数ary1と変数ary2は異なるセクションに配置される。このままでは、変形例1のダミーリードチェックではダミーリードが無いと判定される。
そこで、セクションDATA_SEC1とセクションDATA_SEC2とが同一のメモリ領域に割り当てられるように指定する。例えば、「#pragma same_region」でセクションDATA_SEC1とセクションDATA_SEC2とを指定する。
コンパイラプログラムにおいては、セクションDATA_SEC1とセクションDATA_SEC2とを同一のメモリ領域に割り当てる指定がソースプログラム内にあるか否かを判定する処理を備える。この判定により、前記2つのセクションを同一のメモリ領域に割り当てる指定があることを判定できれば、変数ary1と変数ary2は同一のメモリ領域と分かる。これにより、変数ary2の読み出しが変数ary1の書き込みに対応するダミーリードであると判定できる。
1.3 第1実施形態の効果
第1実施形態によれば、ソースプログラムのコンパイル時にライト命令に対応するダミーリードの挿入漏れを検出することができるコンパイル装置を提供できる。
以下に、第1実施形態の効果について詳述する。
ソースプログラムにおいてライト命令の後、ダミーリードが挿入されていない場合、プロセッサ上で動作するプログラムが正常に動作しない場合がある。一方でプロセッサの仕様が複雑でありダミーリードの挿入が必要な箇所が分かりにくいために、ダミーリードの挿入が漏れたり、不要なダミーリードを挿入することでプログラムの性能が低下する場合がある。
本実施形態では、ソースプログラムにおけるダミーリードの挿入漏れを検出できるため、ソースプログラムの品質を向上させることができる。さらに、ソースプログラムからアプリケーションソフト完成までの開発効率を改善することができる。
また、プログラム開発者は必要なダミーリードの挿入漏れを容易に確認することができ、出荷後のダミーリードの挿入漏れによるトラブルを防止できる。
また、本実施形態では、以下のダミーリードの挿入漏れを検出可能である。例えば、メモリへのライト後、セマフォ解放のための関数呼び出し前のダミーリードの挿入漏れ、あるいは、ダミーリード処理にvolatile修飾が無く最適化で削除されることに起因するダミーリード漏れ、あるいは、メモリへのライト直後に関数の処理が終了することによるダミーリードの挿入漏れなどである。
2.第2実施形態
第2実施形態のコンパイル装置について説明する。第1実施形態では基本ブロック毎にダミーリードの挿入漏れをチェックしたが、第2実施形態では全ての基本ブロックを探索した後、ダミーリードの挿入漏れをチェックする。第2実施形態の構成は、図2、図3、図4に示した第1実施形態の構成と同様であるため、記載を省略する。以下に、第1実施形態と異なる点について主に説明する。
2.1 ダミーリードチェック
図13は、第2実施形態のダミーリードチェックの処理を示すフローチャートである。この処理では、基本ブロックごとに作成したテーブルP3をRAM12に記憶しておく。
ダミーリードチェックが開始されると、まず、ダミーリードのチェックに使用するテーブルP3を初期化する(ステップS101)。
次に、基本ブロック内の中間コードを順に探索し、中間コードがライト処理(ライト命令)か否かを判定する(ステップS102)。中間コードがライト処理である場合、ライト先のアドレスと同一のアドレスを記録したテーブルが既にあるか否かを判定する(ステップS103)。
ステップS103にて、同一のアドレスを記録したテーブルP3が既にある場合、そのテーブル内のアドレスのリード回数を“0”にする(ステップS104)。一方、同一のアドレスを記録したテーブルがない場合、新たなテーブル内にそのアドレスを保存する(ステップS105)。その後、ステップS106に進む。
次に、ステップS102にて中間コードがライト処理でない場合、中間コードがリード処理(リード命令)か否かを判定する(ステップS107)。中間コードがリード処理である場合、リード先のアドレスが、テーブル内に保存されているライト先のアドレスと同一か否かを判定する(ステップS108)。
ステップS108にて、アドレスが同一の場合はリード回数を“1”加算する、すなわち、リード回数をインクリメントする。(ステップS109)。その後、ステップS106に進む。一方、アドレスが同一でない場合は、次の中間コードへ移り(ステップS110)、ステップS102へ戻る。
また、ステップS107で中間コードがリード処理でない場合、ステップS106へ進む。
ステップS106では、基本ブロック内の全ての中間コードを調べたか否かを判定する。全ての中間コードを調べていない場合は、次の中間コードへ移り(ステップS110)、ステップS102へ戻る。その後、ステップS102以降の処理を繰り返す。
一方、ステップS106にて、全ての中間コードの調査が終了した場合は、全ての基本ブロックを調べたか否かを判定する(ステップS201)。全ての基本ブロックを調べていない場合は、次の基本ブロックへ移り(ステップS202)、ステップS102へ戻る。その後、ステップS102以降の処理を繰り返す。
ステップS201にて、全ての基本ブロックの調査が終了した場合は、リード漏れチェック、すなわちダミーリードの挿入漏れがあるか否かをチェックする(ステップS111)。このリード漏れチェックの詳細については後述する。その後、ダミーリードチェックが終了する。
図14は、ダミーリードチェック処理中のリード漏れチェックの詳細を示すフローチャートである。このリード漏れチェックでは、図13の処理で記録したテーブルを順に参照する。
まず、図13の処理で記録した全ての支配節の基本ブロックのテーブルP3を参照したか否かを判定する(ステップS211)。すなわち、参照対象のテーブルが終わりか否かを判定する。参照対象のテーブルが終わりでない場合、そのテーブル内のリード回数を判定する(ステップS212)。なお、支配節は、ある基本ブロックを通る際、その後に必ず通ることが保証される基本ブロックをさす。
ステップS212にてリード回数が0回である場合、その基本ブロックの支配節である基本ブロックに関数呼び出しがあるか否かを判定する。関数呼び出しがある場合、ステップS215に進む。一方、関数呼び出しがない場合、支配節の基本ブロックのテーブル内のリード回数を判定する(ステップS214)。リード回数が0回である場合、ステップS215に進む。
ステップS215では、その支配節が最後の支配節か否かを判定する。最後の支配節である場合、ダミーリードの挿入漏れがあると判定して警告信号を出力する(ステップS217)。その後、ステップS211に戻り、ステップS211以降の処理を繰り返す。
一方、ステップS215にて最後の支配節でない場合、次の支配節へ移り(ステップS216)、ステップS213へ戻り、ステップS213以降の処理を繰り返す。
また、ステップS212及びS214にて、リード回数が1回以上である場合、次の基本ブロックのテーブルへ移り(ステップS218)、ステップS211へ戻り、ステップS211以降の処理を繰り返す。
そして、ステップS211にて、全ての支配節の基本ブロックのテーブルの調査が終了した場合、リード漏れチェックの処理を終了する。
前述したように、第2実施形態におけるリード漏れチェックは以下のように実行される。
ある基本ブロックにおいてダミーリードの挿入漏れがあるか否かをチェックする場合、その基本ブロックのテーブルをまずチェックする。その基本ブロックにダミーリードがなければ、その基本ブロックの支配節となる基本ブロックのテーブルをチェックする。
ライト先のアドレスと同じアドレスのリードがある場合、ダミーリードの挿入漏れがない、すなわち、ダミーリードがあると判定する。ライト先のアドレスと同じアドレスのリードがない場合(テーブルがない場合、またはテーブル内のリード回数が0回の場合)、ダミーリードの挿入漏れがある、すなわち、ダミーリードがないと判定する。
また、その基本ブロックの支配節に関数呼び出しがある場合、ダミーリードがあるか不明であるため、次の支配節に移る。その基本ブロックの全ての支配節の基本ブロックを探索し、リード回数が“0”であれば、ダミーリードがないと判定する。
2.2 ダミーリードチェックの変形例
第2実施形態のダミーリードチェックでは、支配節に関数呼び出しがある場合、必ずダミーリードの挿入漏れがあると判定したが、この変形例では、関数呼び出しにより呼び出される関数がアクセスする領域が、ソースプログラムにより指定されているものとする。これにより、ライト先のアクセス領域(メモリ領域)と、呼び出される関数のアクセス領域とが同一か否かを第1実施形態に示した構成で判定できる。
図15は、変形例が適用されるプログラム例を示す図である。アクセスする領域の指定方法としては、例えば、関数修飾子や#pragma指令がある。図15に示すプログラム例を参照すると、関数func1は、セクションDATA_SEC1のデータを読み、関数func2はセクションDATA_SEC2のデータを読む。その後、関数func1の呼び出しにより、セクションDATA_SEC1に置かれる変数ary1への書き込みに対応するダミーリードがあると判定される。同様に、関数func2の呼び出しにより、セクションDATA_SEC2に置かれる変数ary2への書き込みに対応するダミーリードがあると判定される。
前述したように、変形例では、アプリケーションのソースプログラム中の呼び出し関数がアクセスする領域を、ソースプログラム中にプログラム文によって明示する。そして、それをコンパイル装置が解釈することにより、ダミーリードの挿入漏れを、すなわちダミーリードの有無をチェックする。
この変形例では、ダミーリードの挿入対策として用意した関数(例えば、前記関数修飾子や#pragma指令)がライト命令の直後に呼ばれる場合、ダミーリードが挿入されていると判定し、警告出力の対象にしない。これにより、ダミーリード挿入漏れの誤判定を減らすことができるため、変形例のコンパイル装置が出力する警告に対してプログラム開発者による対応工数を低減できる。
2.3 第2実施形態の効果
第2実施形態によれば、ソースプログラムのコンパイル時にライト命令に対応するダミーリードの挿入漏れを検出することができるコンパイル装置を提供できる。
さらに、基本ブロック内にライト命令に対応するダミーリードがない場合、その基本ブロックの支配節となる基本ブロックまでダミーリードの探索範囲を広げることができる。このため、ダミーリード挿入漏れの検出精度を向上させることができる。
3.第3実施形態
プログラム言語規格で定められているライブラリ関数には、例えば「memcpy」や「memset」のように、メモリに書き込む機能を持った関数がある。第3実施形態は、「memcpy」や「memset」のようなメモリに書き込む機能を持つ関数を使用した場合に、関数呼び出しの直後の基本ブロック(及びその支配節)に対してダミーリードチェックを行う例である。第3実施形態の構成は、図2、図3、図4に示した第1実施形態の構成と同様であるため、記載を省略する。以下に、第1実施形態と異なる点について主に説明する。
3.1 ダミーリードチェック
ソースプログラムの書き込み機能を持つライブラリ関数に対して、コンパイル装置は規格で定められる引数がメモリ書き込み先のポインタであることを認識することができる。第3実施形態では、ライブラリ関数のメモリ書き込み先に対してダミーリードの挿入漏れがないか否かをチェックする。
ライブラリ関数が書き込むメモリ領域に対して、ダミーリードを探索する基本ブロックは、関数呼び出し直後の基本ブロックとその支配節である。
第1引数が書き込み先であることは言語規格で定められているため、第1引数をライト先としてテーブルに定義する。その他のテーブル定義は第1実施形態と同様である。
図16は、第3実施形態のダミーリードチェックの処理を示すフローチャートである。図17は、ダミーリードチェックの処理で生成されるテーブル例を示す図である。
ステップS102Aにて、基本ブロック内の中間コードが書き込み機能を持つ関数か否かを判定する。中間コードが書き込み機能を持つ関数である場合、ライト先の引数と同一の引数を記録したテーブルP5が既にあるか否かを判定する(ステップS103B)。
ステップS103Bにて、同一の引数を記録したテーブルが既にある場合、そのテーブル内の引数のリード回数を“0”にする(ステップS104)。一方、同一の引数を記録したテーブルがない場合、新たなテーブル内にその引数を保存する(ステップS105B)。その後、ステップS106に進む。
一方、ステップS102Aにて、中間コードが書き込み機能を持つ関数でない場合、中間コードがリード処理(リード命令)か否かを判定する(ステップS107)。中間コードがリード処理である場合、リード先のアドレスが、テーブルP5内に保存されているライト先の第1引数が示すアドレスと同一か否かを判定する(ステップS108B)。
ステップS108Bにて、アドレスが同一の場合はリード回数を“1”加算する、すなわち、リード回数をインクリメントする。(ステップS109)。その後、ステップS106に進む。一方、引数が同一でない場合は、次の中間コードへ移り(ステップS110)、ステップS102へ戻る。
その他の処理は図5に示した処理と同様である。
3.2 第3実施形態の効果
第3実施形態によれば、ソースプログラムのコンパイル時にライト命令に対応するダミーリードの挿入漏れを検出することができるコンパイル装置を提供できる。
さらに、言語規格で定められている関数については、その関数の仕様に応じたダミーリードの挿入漏れチェックができる。これにより、第1実施形態で検出できなかったダミーリードの挿入漏れを検出することができる。
4.第4実施形態
第4実施形態では、前述した第1〜第3実施形態におけるダミーリードチェックを実行するか否かを選択できるようにした例である。
図18は、第4実施形態の処理を示すフローチャートである。図示するように、ダミーリードチェックの処理(ステップS13)の前に、ダミーリードチェックを実行するか否かの判定処理(ステップS16)を設ける。ダミーリードチェックを実行する場合は、そのままダミーリードチェックへ進む。一方、ダミーリードチェックを実行しない場合は、ダミーリードチェックをパスしてレジスタ割り当ての処理(ステップS14)に進む。
4.2 第4実施形態の効果
第4実施形態よれば、ダミーリードチェックを実行するか否かを選択することができる。これにより、コンパイル処理の自由度が向上する。さらに、ダミーリードチェックを実行しない場合は、コンパイル処理に要する時間を短縮することが可能である。
5.その他変形例等
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
10…コンパイル装置、11…CPU、12…RAM、13…ROM、14…入出力部、15…バス。

Claims (7)

  1. ソースプログラムにおけるライト命令を検出するライト検出部と、
    前記ライト命令が検出された後のリード命令を検出するリード検出部と、
    前記ライト命令により書き込み領域が指定され、前記リード命令により読み出し領域が指定され、前記読み出し領域が前記書き込み領域と一致するか否かを判定する判定部と、
    を具備するコンパイル装置。
  2. 前記ライト命令による書き込み領域が第1変数により示され、前記リード命令による読み出し領域が第2変数により示され、前記第1変数と前記第2変数とが異なる場合、
    前記判定部は、前記第1変数が配置される第1セクションと、前記第2変数が配置される第2セクションとが一致するか否かを判定し、
    前記第1セクションは前記ライト命令によりデータが前記書き込み領域に書き込まれる単位であり、前記第2セクションは前記リード命令によりデータが前記読み出し領域から読み出される単位である請求項1に記載のコンパイル装置。
  3. 前記第1変数が配置される第1セクションと、前記第2変数が配置される第2セクションとが一致しない場合、
    前記判定部は、前記第1セクションと前記第2セクションとを同一のメモリ領域に割り当てる指定が前記ソースプログラム内にあるか否かを判定する請求項2に記載のコンパイル装置。
  4. 前記ライト命令が、前記ソースプログラムが記述された言語規格で定められた書き込み機能を持つ関数による命令である請求項1乃至3のいずれかに記載のコンパイル装置。
  5. 前記ソースプログラムは中間コードを含む基本ブロックに分割され、
    前記ライト検出部は前記基本ブロックに対して前記ライト命令の検出を行い、前記リード検出部は前記基本ブロックに対して前記リード命令の検出を行う請求項1乃至4のいずれかに記載のコンパイル装置。
  6. 前記ソースプログラムは中間コードを含む複数の基本ブロックに分割され、前記複数の基本ブロックは、第1基本ブロックと、前記第1基本ブロックを通った後必ず通る第2基本ブロックを含み、
    前記ライト検出部は前記第1基本ブロック及び前記第2基本ブロックに対して前記ライト命令の検出を行い、前記リード検出部は前記第1基本ブロック及び前記第2基本ブロックに対して前記リード命令の検出を行う請求項1乃至4のいずれかに記載のコンパイル装置。
  7. 前記ライト命令が検出された後に、前記書き込み領域と一致する前記読み出し領域を有する前記リード命令が検出された回数を記憶する記憶部をさらに備え、
    前記判定部は、前記リード命令の回数に基づいて、前記ライト命令の前記書き込み領域と一致する前記読み出し領域を有する前記リード命令が前記ソースプログラムにあるか否かを判定する請求項1乃至6のいずれかに記載のコンパイル装置。
JP2017054709A 2017-03-21 2017-03-21 コンパイル装置 Pending JP2018156568A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2017054709A JP2018156568A (ja) 2017-03-21 2017-03-21 コンパイル装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2017054709A JP2018156568A (ja) 2017-03-21 2017-03-21 コンパイル装置

Publications (1)

Publication Number Publication Date
JP2018156568A true JP2018156568A (ja) 2018-10-04

Family

ID=63715684

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017054709A Pending JP2018156568A (ja) 2017-03-21 2017-03-21 コンパイル装置

Country Status (1)

Country Link
JP (1) JP2018156568A (ja)

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH08328868A (ja) * 1995-05-30 1996-12-13 Toshiba Corp 目的コード最適化装置及び方法
JP2000207223A (ja) * 1999-01-12 2000-07-28 Matsushita Electric Ind Co Ltd 並列処理向けのプログラム処理方法および装置、並びに並列処理向けのプログラム処理を実行するプログラムを記録した記録媒体および並列処理向けの命令列を記録した記録媒体
JP2001067234A (ja) * 1999-08-27 2001-03-16 Fujitsu Ltd コンパイラとプロセッサ
JP2007241612A (ja) * 2006-03-08 2007-09-20 Matsushita Electric Ind Co Ltd マルチマスタシステム
JP2008269078A (ja) * 2007-04-17 2008-11-06 Toshiba Corp バス制御装置
JP2009026260A (ja) * 2007-07-24 2009-02-05 Nec Corp 演算処理装置、演算処理方法
EP3001312A1 (en) * 2014-09-26 2016-03-30 German Research School for Simulation Sciences GmbH Method, device and computer program product for detecting data dependencies within a program

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH08328868A (ja) * 1995-05-30 1996-12-13 Toshiba Corp 目的コード最適化装置及び方法
JP2000207223A (ja) * 1999-01-12 2000-07-28 Matsushita Electric Ind Co Ltd 並列処理向けのプログラム処理方法および装置、並びに並列処理向けのプログラム処理を実行するプログラムを記録した記録媒体および並列処理向けの命令列を記録した記録媒体
JP2001067234A (ja) * 1999-08-27 2001-03-16 Fujitsu Ltd コンパイラとプロセッサ
JP2007241612A (ja) * 2006-03-08 2007-09-20 Matsushita Electric Ind Co Ltd マルチマスタシステム
JP2008269078A (ja) * 2007-04-17 2008-11-06 Toshiba Corp バス制御装置
JP2009026260A (ja) * 2007-07-24 2009-02-05 Nec Corp 演算処理装置、演算処理方法
EP3001312A1 (en) * 2014-09-26 2016-03-30 German Research School for Simulation Sciences GmbH Method, device and computer program product for detecting data dependencies within a program

Similar Documents

Publication Publication Date Title
KR101786156B1 (ko) 사용자 정의 타입을 위한 컴파일 타임 경계 검사 기법
Hovemeyer et al. Finding more null pointer bugs, but not too many
US5581696A (en) Method using a computer for automatically instrumenting a computer program for dynamic debugging
US8458681B1 (en) Method and system for optimizing the object code of a program
US8181170B2 (en) Unwind information for optimized programs
US11526433B2 (en) Data structure allocation into storage class memory during compilation
US8429632B1 (en) Method and system for debugging merged functions within a program
CN105630463A (zh) 用于检测jar包冲突的方法及装置
US7254809B2 (en) Compilation of unified parallel C-language programs
US10409559B2 (en) Single-source-base compilation for multiple target environments
Chalupa et al. Joint forces for memory safety checking
JP4041248B2 (ja) コンパイラ装置、コンパイルプログラムが記録されたコンピュータ読み取り可能な記録媒体及びコンパイル方法
CN117785540A (zh) 内存错误检测方法、装置、设备及介质
US20080120604A1 (en) Methods, Systems, And Computer Program Products For Providing Program Runtime Data Validation
CN100476735C (zh) 程序处理装置
US8918772B1 (en) Statically analyzing program correctness for a dynamic programming language
JP5719278B2 (ja) 情報処理装置、プロファイル対象決定プログラム及び方法
KR102209151B1 (ko) 바이너리 취약점 패치 방법 및 장치
US20120023307A1 (en) Methods, systems, and computer program products for excluding an addressable entity from a translation of source code
US20120023488A1 (en) Methods, systems, and computer program products for processing an excludable addressable entity
US20110202906A1 (en) Compiling method and compiling program
KR102439456B1 (ko) 부분 소스 코드의 컴파일 장치 및 방법
CN116680705B (zh) 基于特征提取的Rust程序缺陷自动检测方法及系统
US20160253120A1 (en) Multicore programming apparatus and method
JP2018156568A (ja) コンパイル装置

Legal Events

Date Code Title Description
A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A712

Effective date: 20170911

A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A711

Effective date: 20170912

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20181127

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20190911

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20191015

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20200407