JP2661562B2 - プログラム評価装置 - Google Patents

プログラム評価装置

Info

Publication number
JP2661562B2
JP2661562B2 JP6271739A JP27173994A JP2661562B2 JP 2661562 B2 JP2661562 B2 JP 2661562B2 JP 6271739 A JP6271739 A JP 6271739A JP 27173994 A JP27173994 A JP 27173994A JP 2661562 B2 JP2661562 B2 JP 2661562B2
Authority
JP
Japan
Prior art keywords
program
identification number
subprogram
variable
output
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.)
Expired - Lifetime
Application number
JP6271739A
Other languages
English (en)
Other versions
JPH08110866A (ja
Inventor
邦夫 丹羽
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.)
NEC Corp
Original Assignee
Nippon Electric Co Ltd
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 Nippon Electric Co Ltd filed Critical Nippon Electric Co Ltd
Priority to JP6271739A priority Critical patent/JP2661562B2/ja
Publication of JPH08110866A publication Critical patent/JPH08110866A/ja
Application granted granted Critical
Publication of JP2661562B2 publication Critical patent/JP2661562B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明はプログラム評価装置に関
し、特に未初期化変数の参照の検出を行うプログラム評
価装置に関する。
【0002】
【従来の技術】プログラムを開発するときによく犯して
しまう過ちの1つに、変数の初期化を忘れてしまい、未
初期化の変数、すなわちプログラムの論理上意図されて
いない値を有する変数を参照するようなプログラムを書
いてしまうというものがある。このようなプログラムを
実行させた場合、正しい結果を得ることができないのは
もちろんのこと、プログラムが暴走してしまうことも非
常に多い。
【0003】そのため、最近のコンパイラでは、未初期
化変数の参照の有無をコンパイル時に検査するようにな
っている。また、UNIX(AT&T社の登録商標)上
には、LINTと呼ばれるソースプログラムチェックツ
ールがあり、これを使用して未初期化変数の参照の有無
を検査することもある。しかしながら、これらによる検
査では、ソースプログラムの文法的な検査のみとなるた
め、繰返しブロック内や条件分岐ブロック内で変数の初
期化を行うようなプログラムに対しては、未初期化変数
の参照を正しく検出できない場合がある。
【0004】一方、特開昭62−118448号公報で
は、これを解決する手段として、擬似不定値を利用し、
プログラムの実行時に、未初期化変数の参照を検出する
方法を述べている。擬似不定値とは、未初期化変数を検
出する目的で選択された、変数が絶対にとり得ることの
ない値であり、変数が参照されたときに、この値を有し
ていた場合、変数が未初期化であるとみなすことができ
る。
【0005】図7は、擬似不定値を利用した場合の処理
の流れを示すフローチャートである。ステップS1にお
いて、ソースプログラムを文法的に検査して初期値が設
定されない可能性のある変数を抽出する。ステップS2
において、ソースプログラム中で、前記変数を参照して
いる箇所を抽出する。ステップS3において、前記変数
に擬似不定値を設定する処理を、ソースプログラム中に
挿入する。ステップS4において、ソースプログラム中
の前記変数参照箇所の直前の部分に、参照されている前
記変数の内容が擬似不定値と同値であるか否かを検査す
る処理と、同値であった場合にエラーを出力する処理と
を埋め込む。ステップS5において、これらの処理が埋
め込まれたソースプログラムをコンパイルし、実行プロ
グラムを生成する。ステップS6において、このプログ
ラムを実行し、エラー出力の有無を検査する。以上によ
り、未初期化変数の参照を検出することができる。
【0006】この他に、ハードウェアによる未初期化変
数の参照を検出する方法として、図8に示すような回路
による検出も行われている。図8中の符号1は、被デバ
ッグプログラムを実行する評価用プロセッサを示し、ア
ドレス23,リードストローブ信号21およびライトス
トローブ信号22は、データアクセス用のデータ格納メ
モリ(図示せず)に出力されている。また、評価用プロ
セッサ1は、プログラムフェッチ用のプログラム格納メ
モリ(図示せず)とも接続されている。さらに、ライト
ストローブ信号22およびアドレス23は、データライ
トの履歴を記録するカバレッジメモリ24にも出力され
ている。カバレッジメモリ24は、データアクセス用の
データ格納メモリと同一のアドレス空間をもつ1ビット
幅のメモリであり、被デバッグプログラムの実行前に別
のプロセッサ(図示せず)により全メモリ領域がLレベ
ルでクリアされ、また被デバッグプログラムの実行中
に、データ格納メモリにデータライトが行われたとき、
対応するアドレスのカバレッジメモリ24にHレベルが
セットされるようになっている。ORゲート25は、被
デバッグプログラムの実行中に、データ格納メモリから
データリードが行われたとき、対応するアドレス23の
カバレッジメモリ24の内容が、データライトが行われ
ていないことを示すLレベルのままであったならば、外
部インターフェース回路20のILLACCS入力を有
効にし、未初期化変数の参照があったことを知らせる。
【0007】
【発明が解決しようとする課題】上述した従来の擬似不
定値を使用する方法では、変数が絶対にとり得ることの
ない値を擬似不定値とすることになっているが、このよ
うな値は各変数ごとに異なるものであり、すべての変数
で共通に使用できるような擬似不定値というものはな
い。したがって、この方法を実際に使用する場合には、
各変数ごとに擬似不定値を変化させる必要があるが、ソ
ースプログラムのみでは擬似不定値を決定するのに必要
な情報を得られないことが多く、デバッグ作業者がソー
スプログラム以外のドキュメントを参照しながら各変数
ごとに擬似不定値を指定しなければならないことが多
い。また、変数がすべての値をとり得るような場合に
は、擬似不定値そのものが存在せず、そのような変数に
対しては本手法を適用することができないため、未初期
化変数の参照を検出することができないという問題点が
あった。
【0008】さらに、この方法では、初期値が設定され
ていない可能性のある変数が参照されている箇所ごと
に、その変数の内容が擬似不定値と同値であるか否かを
検査する処理が付加されるため、プログラムサイズが増
大し、かつプログラム実行速度が低下するという問題点
もある。その程度は、被デバッグプログラムの性質によ
って変化するが、少なく見積もっても、プログラムサイ
ズは2倍以上に肥大し、プログラム実行速度は1/2以
下に低下してしまうと考えられる。このような問題があ
るため、プログラムサイズやプログラム実行時間に制限
のあるアプリケーションプログラムでは、この方法を導
入することは難しい。特に、機器組込み用のアプリケー
ションプログラムでは、プログラムを格納するROM
(ReadOnly Memory)サイズによってプ
ログラムサイズが制限されたり、制御対象となるハード
ウェアにより処理時間が制限されたりする場合が多いた
め、この方法はほとんど使われない。
【0009】一方、従来のハードウェアによる検出方法
では、複数の変数で同じメモリ領域を使用しないような
変数に対しては正しく未初期化変数の参照を検出できる
が、C言語の自動変数のように、同じメモリ領域が複数
の変数で使用されるような変数に対しては、正しく未初
期化変数の参照を検出できないという問題点がある。以
下、この点について図を用いて説明する。
【0010】図9(a)および(b)はC言語のソース
プログラム、図9(c)および(d)はこれらをコンパ
イルして作成したオブジェクトプログラムのアセンブル
リストである。通常、C言語では自動変数はスタック上
に割り付けられており、図10(a)は関数y()が関
数x()から呼び出されたときのスタックの様子であ
る。図9(c)および(d)では、各関数の自動変数の
ベースのアドレスはベースポインタとなるh1レジスタ
に格納され、自動変数へのアクセスはh1レジスタによ
る相対アドレッシングで行われるようになっている。な
お、図9(a)〜(d)の例は、日本電気株式会社製の
マイクロプロセッサμCOM78K/2シリーズ用の日
本電気株式会社製のCコンパイラであるCC78K2の
ものであり、h1レジスタは本マイクロプロセッサに内
蔵されている汎用レジスタの1つである。ここで、自動
変数のアドレスは一意に確定したものではなく、関数が
呼び出されたときのスタックトップのアドレスによって
変化する。例えば、同じy()という関数であっても、
それが呼び出されたときのスタックトップのアドレスが
0FE08h(hは16進数であることを表すものとす
る)の場合(図10(b)参照)と0FE10hの場合
(図10(c)参照)とでは、自動変数c,d,eおよ
びfのアドレスも8バイト異なる。このように、自動変
数のアドレスが一意に決まったものではなく変化するも
のであるということは、逆に複数の自動変数が同一のア
ドレスに割り付けられるということでもある。例えば、
スタックトップが0FE04hのとき(図10(d)参
照)に呼び出された関数x()の自動変数aとスタック
トップが0FE08hのとき(図10(e)参照)に呼
び出された関数y()の自動変数eは、どちらも0FE
02hというアドレスになる。
【0011】このように、複数の自動変数で同じメモリ
領域を使用するので、従来のハードウェアによる検出方
法では、一度そのメモリ領域を使用している自動変数に
対する初期化のデータライトがカバレッジメモリ24に
記録されると、以後、そのメモリ領域を使用する別の自
動変数に対しても初期化のデータライトが行われたこと
になってしまい、実際には未初期化であっても初期化が
行われたと判定されてしまう。
【0012】本発明の目的は、上述の点に鑑み、擬似不
定値を使用せず、被デバッグプログラムに一切変更を加
えることなく、ハードウェアによって未初期化の自動変
数の参照を検出できるようにしたプログラム評価装置を
提供することにある。
【0013】さらに、本発明の他の目的は、未初期化の
自動変数以外の未初期化変数をも検出できるようにした
プログラム評価装置を提供することにある。
【0014】
【課題を解決するための手段】本発明のプログラム評価
装置は、情報処理装置が実行するプログラムを識別する
識別番号を生成する識別番号生成手段と、識別番号を記
憶する識別番号記憶手段と、プログラム毎に変数の領域
を記憶する変数領域記憶手段と、実行中のプログラムの
識別番号と前記識別番号記憶手段に記憶された識別番号
とを比較する識別番号比較手段と、プログラム実行によ
るデータアドレスと前記変数領域記憶手段に記憶された
変数領域とを比較する変数領域比較手段とを有し、前記
識別番号比較手段の比較結果と前記変数領域比較手段の
比較結果とにより情報処理装置の未初期化変数の参照を
検出することを特徴とする。
【0015】さらに、本発明のプログラム評価装置は、
前記識別番号記憶手段に初期値を設定しておき、前記識
別番号記憶手段より読み出された識別番号が初期値であ
ることを検出する検出手段を有し、前記識別番号が初期
値のままであった場合に情報処理装置の未初期化変数の
参照が行われたことを検出する。
【0016】
【実施例】次に、本発明について図面を参照して詳細に
説明する。
【0017】図1は、本発明の第1実施例に係るプログ
ラム評価装置の回路図である。本実施例のプログラム評
価装置は、評価用プロセッサ1と、コールカウンタ2
と、スタックカウンタ3と、スタックメモリ4と、自動
変数領域サイズメモリ7と、加算器8と、下限比較器9
と、上限比較器10と、ORゲート11と、カバレッジ
メモリ14と、識別番号比較器15と、ORゲート1
6,17および18と、ANDゲート19と、外部イン
ターフェース回路20とから、その主要部が構成されて
いる。
【0018】本実施例のプログラム評価装置は、プログ
ラムに誤りを含む可能性がありデバッグを必要とする被
デバッグプログラムを対象とする。被デバッグプログラ
ムは、すべてのサブルーチンコールの最上位階層に位置
するプログラム単位と、プログラム単位が直接あるいは
階層的にサブルーチンコールする下位のプログラム単位
であるサブプログラムとを持つ。被デバッグプログラム
は、サブプログラムコール時にそのサブプログラムで使
用する変数を割り付けるためのメモリ領域を確保し、サ
ブプログラムリターン時にサブプログラムで使用してい
た変数に割り付けられていたメモリ領域を解放し、メモ
リ領域を別のサブプログラムコールで同じく変数として
再使用する(以下、こうして再利用されるメモリ空間に
割り付けられる変数を自動変数という)という機能と、
各サブプログラムコールごとにそのサブプログラムで使
用する1個ないし複数個の自動変数に対して基準となる
アドレスを被デバッグプログラムを実行しているプロセ
ッサのレジスタに格納し、レジスタ(以下、ベースポイ
ンタという)に対する相対オフセットを使用して自動変
数にアクセスするという機能とを持つ。本実施例のプロ
グラム評価装置では、同じメモリ領域に割り付けられた
自動変数を区別するために、各サブプログラムコール
(呼出し)に対して一意となるサブプログラム識別番号
を用いる。
【0019】評価用プロセッサ1は、被デバッグプログ
ラムを実行しプログラムの誤りを発見するための情報を
出力することができるプロセッサである。詳しくは、評
価用プロセッサ1は、プログラムの誤りを発見するため
に、リードストローブ信号21,ライトストローブ信号
22およびアドレス23を出力することはもちろんのこ
と、プログラムカウンタの値13やベースポインタの値
12を出力するとともに、サブプログラムコール命令の
実行時にサブプログラムコール命令を実行したことを示
すCALLストローブ信号5を出力し、サブプログラム
リターン命令の実行時にサブプログラムリターン命令が
実行されたことを示すRETストローブ信号6を出力す
る。
【0020】コールカウンタ2は、評価用プロセッサ1
が被デバッグプログラムのサブプログラムコール命令を
実行したことを示す評価用プロセッサ1から出力される
CALLストローブ信号5を入力し、評価用プロセッサ
1が被デバッグプログラムの実行を開始した時点からの
順序比較可能な一意なサブプログラム識別番号を出力す
るカウンタである。コールカウンタ2は、被デバッグプ
ログラムの実行開始からのCALLストローブ信号5の
数をカウントし、これをサブプログラム識別番号として
出力する。コールカウンタ2は、被デバッグプログラム
の実行前に別のプロセッサ(図示せず)により初期値1
にセットされる。初期値1にセットする理由は後で述べ
る。
【0021】スタックカウンタ3とスタックメモリ4と
は連動しており、CALLストローブ信号5およびRE
Tストローブ信号6に応じてサブプログラム識別番号を
プッシュ・ポップするサブプログラム識別番号スタック
として機能する。このサブプログラム識別番号スタック
は、CALLストローブ信号5と、評価用プロセッサ1
が被デバッグプログラムのサブプログラムリターン命令
を実行したことを示す評価用プロセッサ1から出力され
るRETストローブ信号6と、コールカウンタ2の出力
であるサブプログラム識別番号とを入力し、CALLス
トローブ信号5の発生時に、それ以前にコールカウンタ
2から出力されていたサブプログラム識別番号を待避し
てコールカウンタ2から出力された新しいサブプログラ
ム識別番号を出力し、RETストローブ信号6の発生時
に、待避されていたサブプログラム識別番号を復帰さ
せ、復帰させたサブプログラム識別番号を出力する後入
れ先出し方式の記憶回路である。スタックカウンタ3
は、被デバッグプログラムの実行前に別のプロセッサに
より初期値0にクリアされる。
【0022】ここで、図2を参照してコールカウンタ
2,スタックカウンタ3およびスタックメモリ4の動作
を説明する。なお、図2は、被デバッグプログラムの実
行がある程度進んだところから説明を開始しており、図
2中の{a}は説明開始時点のスタックカウンタ3の出
力の値を示し、{n}は説明開始時点のコールカウンタ
2の出力の値を示す。
【0023】サブプログラムがコールされた場合(図2
のA)、評価用プロセッサ1からCALLストローブ信
号5が出力され、スタックカウンタ3およびコールカウ
ンタ2がインクリメントされ、値がそれぞれ{a+1}
および{n+1}に変化する。そして、スタックメモリ
4のアドレス{a+1}にサブプログラム識別番号{n
+1}がライトされ、ライトされた値はそのままスタッ
クメモリ4から出力される。このとき、以前のサブプロ
グラム識別番号{n}はそのままスタックメモリ4のア
ドレス{a}に残る。
【0024】さらに、サブプログラムがコールされた場
合(図2のB)、図2のAのときと同様に、評価用プロ
セッサ1からCALLストローブ信号5が出力され、ス
タックカウンタ3およびコールカウンタ2がインクリメ
ントされ、値がそれぞれ{a+2}および{n+2}に
変化し、スタックメモリ4から{n+2}が出力され
る。
【0025】サブプログラムがリターンする場合(図2
のC)、評価用プロセッサ1からRETストローブ信号
6が出力され、スタックカウンタ3がデクリメントさ
れ、値が{a+1}に戻る。その結果、スタックメモリ
4の出力は以前のサブプログラム識別番号{n+1}に
戻る。ただし、このときには、コールカウンタ2はデク
リメントされずに、被デバッグプログラムの実行開始か
らのサブプログラムのコール回数を維持する。
【0026】さらに、この後にサブプログラムがコール
されると(図2のD)、図2のBのときと同様に、スタ
ックカウンタ3およびコールカウンタ2がインクリメン
トされ、値がそれぞれ{a+2}および{n+3}に変
化する。このとき、コールカウンタ2の値、すなわちサ
ブプログラム識別番号は{n+3}となり、図2のBの
ときの値{n+2}とは異なる値になり、個々のサブプ
ログラムコールを区別することができる。
【0027】本実施例のプログラム評価装置では、変数
にライトしたときのサブプログラム識別番号と、変数を
リードしたときのサブプログラム識別番号とを比較する
ことにより、未初期化変数の参照を検出するようになっ
ている。このため、正常な初期化が行われていても、ラ
イトしたときのサブプログラム識別番号とリードしたと
きのサブプログラム識別番号とが異なる場合があるよう
な変数に対しては、サブプログラム識別番号の比較を行
わないようにする必要がある。このような変数として、
大域変数や上位側のサブプログラムの自動変数がある。
大域変数はどのサブプログラムからもアクセス可能であ
り、また上位側のサブプログラムの自動変数は下位のサ
ブプログラムからアクセス可能であるからである。
【0028】例えば、図2のZでは、現在実行中のサブ
プログラムのサブプログラム識別番号は{n+1}であ
るが、このサブプログラムが大域変数をリードした場
合、その大域変数を初期化したプログラムは、図2の
W,XまたはYのときに実行中であったサブプログラム
であってもよく、その場合、サブプログラム識別番号は
{n},{n+1}または{n+2}となり、{n+
1}との相関はない。
【0029】また、同様に、このサブプログラムがサブ
プログラム識別番号{n}で示される上位側のサブプロ
グラムの自動変数をリードした場合、その自動変数を初
期化したプログラムは、図2のW,XまたはYのときに
実行中であったサブプログラムであってもよく、その場
合、サブプログラム識別番号は{n},{n+1}また
は{n+2}となり、{n+1}との相関はない。
【0030】このように、大域変数や上位側のサブプロ
グラムの自動変数をリードする場合、サブプログラム識
別番号の比較を行ってはならない。
【0031】加えて、現在実行中のサブプログラムとい
うのはかならず最下位のサブプログラムであり、現在実
行中のサブプログラムの下位側のサブプログラムという
ものは存在しない。したがって、本実施例のプログラム
評価装置では、現在実行中のサブプログラムの自動変数
をリードする場合のみ、サブプログラム識別番号の比較
を行っている。
【0032】一方、現在実行中のサブプログラムの自動
変数をリードする場合でも、自動変数の初期化が別のサ
ブプログラムにより行われる場合もある。
【0033】例えば、図2のYのときに実行中であった
サブプログラム識別番号{n+2}のサブプログラム
が、上位側のサブプログラム識別番号{n+1}のサブ
プログラムの自動変数を初期化することもある。この場
合、図2のZでは、現在実行中のサブプログラムのサブ
プログラム識別番号は{n+1}であるが、そのサブプ
ログラムの自動変数を初期化したサブプログラムのサブ
プログラム識別番号は{n+2}である。
【0034】このように、現在実行中のサブプログラム
のサブプログラム識別番号よりも大きなサブプログラム
識別番号のサブプログラムにより自動変数が初期化され
ることがあるが、現在実行中のサブプログラムのサブプ
ログラム識別番号よりも小さなサブプログラム識別番号
のサブプログラムにより自動変数が初期化されることは
なく、このような状況は、未初期化の自動変数を参照し
た場合にのみ発生する。
【0035】すでに述べたように、本実施例のプログラ
ム評価装置では、現在実行中のサブプログラムに属する
自動変数をリードする場合のみ、サブプログラム識別番
号の比較を行う必要がある。そのため、リードされた変
数が現在実行中のサブプログラムの自動変数であるかど
うかを判定しなければならない。現在実行中のサブプロ
グラムの自動変数は、現在のベースポインタの値12で
示されるアドレスと、その値に現在実行中のサブプログ
ラムが使用する自動変数領域のサイズを加算したアドレ
スとの間にあるため、リードしたアドレスが、この範囲
内にあるかどうかを判定すればよい。
【0036】各サブプログラムの自動変数領域の情報
は、コンパイラが、ソースプログラムをコンパイルして
実行プログラムを生成するときに、これとともに生成さ
れる。この情報は、図3に示すように、各サブプログラ
ムの開始アドレス,各サブプログラムのサイズ,および
各サブプログラムが使用する自動変数領域のサイズのテ
ーブルで構成される。
【0037】本実施例のプログラム評価装置では、被デ
バッグプログラムの実行プログラムを読み込むときに、
この各サブプログラムの自動変数領域の情報をともに読
み込み、別のプロセッサにより図4に示すように自動変
数領域サイズメモリ7に格納する。自動変数領域サイズ
メモリ7は、プログラムフェッチ用のプログラム格納メ
モリと同一のアドレス空間をもち、自動変数領域のサイ
ズを、各サブプログラムの開始アドレスから、各サブプ
ログラムのサイズ分の領域に対して格納することができ
るようになっている。自動変数領域サイズメモリ7は、
評価用プロセッサ1から出力されるプログラムカウンタ
の値13をアドレスとして入力し、予め前記アドレスに
書き込んでおいたところの前記アドレスでの被デバッグ
プログラムのサブプログラムの自動変数で使用されるメ
モリ領域のサイズを出力する。
【0038】加算器8,下限比較器9,上限比較器10
およびORゲート11からなる自動変数判定回路は、評
価用プロセッサ1から出力されるベースポインタの値1
2と、自動変数領域サイズメモリ7から出力される自動
変数領域のサイズと、評価用プロセッサ1がデータ格納
メモリ(図示せず)にアクセスする場合に評価用プロセ
ッサ1が出力するアドレス23とを入力し、アドレス2
3がベースポインタの値12と自動変数領域のサイズと
で示されるアドレス範囲の上限と下限との間に含まれる
かどうかを比較し、含まれていた場合にはその出力を有
効を示すLレベルにする回路である。
【0039】評価用プロセッサ1から出力されたベース
ポインタの値12は、現在実行中のサブプログラムの自
動変数領域の下限のアドレスとして下限比較器9に入力
される。また、現在実行中のサブプログラムの自動変数
領域のサイズは、データリード時のプログラムカウンタ
の値13を自動変数領域サイズメモリ7のアドレスとす
ることで、自動変数領域サイズメモリ7の出力から得る
ことができる。この値とベースポインタの値12とを加
算器8で加算し、現在実行中のサブプログラムの自動変
数領域の上限のアドレスとして上限比較器10に入力す
る。下限比較器9と上限比較器10との出力は、ORゲ
ート11に入力される。結果として、ORゲート11の
出力は、アドレス23が現在実行中のサブプログラムの
自動変数であった場合にLレベルになる。
【0040】カバレッジメモリ14は、データアクセス
用のデータ格納メモリと同一のアドレス空間をもつメモ
リであり、被デバッグプログラムの実行前に別のプロセ
ッサにより全メモリ領域に対して初期値0が格納され
る。カバレッジメモリ14は、スタックメモリ4の出力
であるサブプログラム識別番号と、評価用プロセッサ1
がデータ格納メモリにアクセスするときに出力するアド
レス23と、評価用プロセッサ1がデータ格納メモリに
データライトするときに出力するライトストローブ信号
22とを入力し、ライトストローブ信号22の発生時に
アドレス23にスタックメモリ4の出力であるサブプロ
グラム識別番号を記憶し、また評価用プロセッサ1がデ
ータ格納メモリにアクセスするときに出力するアドレス
23に記憶されているサブプログラム識別番号を出力す
る。カバレッジメモリ14では、データライト時にライ
トしたアドレス23に対してサブプログラム識別番号を
書き込み、データリード時にリードしたアドレス23に
対して前回ライトしたときのサブプログラム識別番号を
出力する。
【0041】識別番号比較器15,ORゲート16,1
7および18ならびにANDゲート19は、未初期化変
数参照検出回路を構成する。未初期化変数参照検出回路
中の識別番号比較器15およびORゲート16は、カバ
レッジメモリ14の出力であるサブプログラム識別番号
と、スタックメモリ4の出力であるサブプログラム識別
番号と、評価用プロセッサ1がデータ格納メモリからデ
ータリードするときに出力するリードストローブ信号2
1と、自動変数判定回路の出力(ORゲート11の出
力)とを入力し、リードストローブ信号21が発生し、
かつ自動変数判定回路の出力(ORゲート11の出力)
が有効を示すLレベルであり、かつカバレッジメモリ1
4の出力であるサブプログラム識別番号とスタックメモ
リ4の出力であるサブプログラム識別番号とを順序比較
した結果が前者が後者よりも先に生成されたことを示し
ていた場合に、未初期化の自動変数の参照を検出したこ
とを示すLレベルの信号を出力する。
【0042】識別番号比較器15は、カバレッジメモリ
14から出力されたサブプログラム識別番号、すなわち
データライト時のサブプログラム識別番号と、現在実行
中のサブプログラムのサブプログラム識別番号、すなわ
ちデータリード時のサブプログラム識別番号とを比較
し、カバレッジメモリ14から出力されたサブプログラ
ム識別番号が小さかった場合には出力をLレベルにす
る。
【0043】先に述べたように、サブプログラム識別番
号の比較は、現在実行中のサブプログラムの自動変数を
リードしたときのみ有効であるため、ORゲート16
で、識別番号比較器15の出力と、リードストローブ信
号21と、データアクセスが現在実行中のサブプログラ
ムの自動変数に対するものであることを示すORゲート
11の出力との論理和をとっている。ORゲート16の
出力は、未初期化の自動変数を参照したかどうかを示し
ており、未初期化の自動変数を参照した場合には出力が
Lレベルになる。
【0044】また、未初期化変数参照検出回路中のOR
ゲート17とORゲート18とは、データリード時に、
カバレッジメモリ14から出力されたサブプログラム識
別番号が0であったならば、Lレベルを出力するように
なっている。先に述べたように、カバレッジメモリ14
は、被デバッグプログラムの実行前に全メモリ領域に初
期値0が格納され、コールカウンタ2は、被デバッグプ
ログラムの実行前に初期値1がセットされるようになっ
ている。コールカウンタ2の初期値が1であるため、カ
ウントが一周しない限り、サブプログラム識別番号は0
以外の値となる。一方、カバレッジメモリ14は、デー
タライト時にかならずサブプログラム識別番号が書き込
まれるようになっている。したがって、データリード時
に、カバレッジメモリ14から出力されたサブプログラ
ム識別番号が0であった場合、被デバッグプログラムの
実行開始から一度もデータライトが行われていないこと
を示しており、これは明らかな未初期化変数の参照を示
している。
【0045】ANDゲート19は、ORゲート16とO
Rゲート18との出力をまとめ、未初期化変数の参照を
検出した場合にLレベルの未初期化変数参照検出信号を
出力し、外部インターフェース回路20に未初期化変数
の参照があったことを知らせる。
【0046】外部インターフェース回路20は、評価用
プロセッサ1にて実行中の被デバッグプログラムが未初
期化変数の参照を行ったことを検出したLレベルの未初
期化変数参照検出信号を入力し、それをデバッグ作業者
に通知する回路である。
【0047】次に、このように構成された本実施例のプ
ログラム評価装置の動作の概要について、図5に示すフ
ローチャートを参照しながら説明する。
【0048】まず、カバレッジメモリ14の全メモリ領
域に初期値0を、コールカウンタ2に初期値1を、スタ
ックカウンタ3に初期値0を、自動変数領域サイズメモ
リ7に図4に示したように自動変数領域のサイズをそれ
ぞれ初期設定した後(ステップS101)、評価用プロ
セッサ1が被デバッグプログラムの実行を開始する(ス
テップS102)。
【0049】評価用プロセッサ1による被デバッグプロ
グラムの実行中に(ステップS103)、サブプログラ
ムコール命令が実行されると(ステップS104でイエ
ス)、評価用プロセッサ1からCALLストローブ信号
5が出力され、コールカウンタ2の出力であるサブプロ
グラム識別番号がスタックメモリ4に待避されるととも
にスタックカウンタ3が1つカウントアップされてスタ
ックメモリ4の出力にサブプログラム識別番号が出力さ
れる(ステップS105)。また、コールカウンタ2が
1つカウントアップされて、コールカウンタ2の出力に
新しいサブプログラム識別番号が生成される(ステップ
S106)。
【0050】また、サブプログラムリターン命令の実行
時には(ステップS107でイエス)、評価用プロセッ
サ1からRETストローブ信号6が出力され、スタック
カウンタ3が1つカウントダウンされて、スタックメモ
リ4の出力には待避されていた前回のサブプログラムコ
ール時のサブプログラム識別番号が復帰される(ステッ
プS108)。
【0051】さらに、データ格納メモリにデータライト
が行われるたびに(ステップS109でイエス)、評価
用プロセッサ1からライトストローブ信号22が出力さ
れ、データライトが行われたアドレス23と同じアドレ
スでカバレッジメモリ14に、スタックメモリ4の出力
であるサブプログラム識別番号が書き込まれる(ステッ
プS110)。
【0052】さらにまた、データ格納メモリからデータ
リードが行われるたびに(ステップS111でイエ
ス)、評価用プロセッサ1からリードストローブ信号2
1が出力され、ORゲート16および18に入力され
る。これにより、ORゲート16では、自動変数判定回
路の出力(ORゲート11の出力)が、自動変数領域サ
イズメモリ7に記憶された各サブプログラムの自動変数
領域のサイズを参照してデータ格納メモリからのデータ
リードが現在実行中のサブプログラムの自動変数に対す
るものであるかどうかが判断される(ステップS11
2)。そして、それが現在実行中のサブプログラムの自
動変数に対するデータリードであった場合(ステップS
112でイエス)、識別番号比較器15によりスタック
メモリ4の出力である現在実行中のサブプログラムコー
ルのサブプログラム識別番号と、カバレッジメモリ14
に記憶されていた前回のデータライト時のサブプログラ
ム識別番号とが比較され(ステップS113)、前者が
後者より大きくなければ(サブプログラム識別番号の大
小関係が正常でなければ)、識別番号比較器15の出力
がLレベル、ORゲート16の出力がLレベル、AND
ゲート19の出力がLレベルとなって未初期化の自動変
数の参照であることが検出され、外部インターフェース
回路20に通知される(ステップS115)。また、現
在実行中のサブプログラムの自動変数以外の変数に対す
るデータリードであった場合にも(ステップS112で
ノー)、被デバッグプログラムの実行前にカバレッジメ
モリ14の全メモリ領域に初期値0を設定しておき、デ
ータ格納メモリからデータリードが行われたときに、カ
バレッジメモリ14に記憶されていたサブプログラム識
別番号が初期値0であるかどうかを判定することにより
(ステップS114)、初期値0であれば、ORゲート
17の出力がLレベル、ORゲート18の出力がLレベ
ル、ANDゲート19の出力がLレベルとなって未初期
化変数の参照であることが検出され、外部インターフェ
ース回路20に通知される(ステップS115)。
【0053】図6は、本発明の第2実施例に係るプログ
ラム評価装置の回路図である。図1に示した第1実施例
のプログラム評価装置では、コンパイラが生成した実行
プログラムのベースポインタが各サブプログラムの自動
変数領域の下限を指しているような実行プログラムに対
して、データアクセスが現在実行中のサブプログラムの
自動変数に対するアクセスであるかどうかを判定するよ
うになっていた。これに対して、第2実施例のプログラ
ム評価装置では、コンパイラが生成した実行プログラム
のベースポインタが各サブプログラムの自動変数領域の
上限を指しているような実行プログラムに対して、デー
タアクセスが現在実行中のサブプログラムの自動変数に
対するアクセスであるかどうかを判定するようになって
いる。すなわち、第1実施例のプログラム評価装置で
は、ベースポインタの値12と自動変数領域のサイズ値
とを加算器8で加算していたが、第2実施例のプログラ
ム評価装置では、ベースポインタの値12から自動変数
領域のサイズ値を減算器8’で減算するようになってい
る。減算器8’の出力は、現在実行中のサブプログラム
の自動変数領域の下限の値として下限比較器9に入力さ
れ、ベースポインタの値は、現在実行中のサブプログラ
ムの自動変数領域の上限の値として上限比較器10に入
力される。
【0054】また、第2実施例のプログラム評価装置で
は、スタックカウンタ3のカウント動作が、図1に示し
た第1実施例のプログラム評価装置とは逆になってお
り、CALLストローブ信号5によりダウンカウント
し、RETストローブ信号6によりアップカウントする
ようになっている。
【0055】さらに、第2実施例のプログラム評価装置
では、コールカウンタ2’のカウント動作が第1実施例
のプログラム評価装置におけるコールカウンタ2のカウ
ント動作とは逆になっており、CALLストローブ信号
5によりダウンカウントするようになっている。これに
合わせて、第2実施例のプログラム評価装置では、コー
ルカウンタ2’は、被デバッグプログラムの実行前に別
のプロセッサにより(最大値−1)にセットされ、カバ
レッジメモリ14は、被デバッグプログラムの実行前に
別のプロセッサによりコールカウンタ2’の最大値がセ
ットされるようになっている。ここで、最大値とは、コ
ールカウンタ2’の出力のすべてのビットがHレベルに
なった場合の値である。
【0056】同じく、第2実施例のプログラム評価装置
では、識別番号比較器15’の比較条件も第1実施例の
プログラム評価装置における識別番号比較器15の比較
条件とは逆になっており、カバレッジメモリ14から出
力されたサブプログラム識別番号の方が大きかった場合
に出力をLレベルにするようになっている。また、第1
実施例のプログラム評価装置でのORゲート17は、第
2実施例のプログラム評価装置ではNANDゲート1
7’に変更されている。
【0057】なお、その他の特に言及しなかった部分
は、図1に示した第1実施例のプログラム評価装置と同
様に構成されているので、対応する部分に同一符号を付
してそれらの詳しい説明を省略する。
【0058】このように構成された第2実施例のプログ
ラム評価装置でも、図1に示した第1実施例のプログラ
ム評価装置とほぼ同様に動作して、未初期化変数の参照
を検出することができることはいうまでもない。
【0059】
【発明の効果】以上説明したように本発明は、識別番号
生成手段,識別番号記憶手段,変数領域記憶手段,識別
番号比較手段および変数領域比較手段を設け、識別番号
比較手段の比較結果と変数領域比較手段の比較結果とに
より情報処理装置の未初期化の自動変数の参照を検出す
るようにしたことにより、ハードウェアによって未初期
化の自動変数の参照を容易に検出することができ、プロ
グラムの暴走を未然に防止して、デバッグの効率向上と
プログラムの品質向上とを図ることができるという効果
がある。
【0060】さらに、識別番号記憶手段に初期値を設定
しておき、識別番号記憶手段より読み出された識別番号
が初期値であることを検出手段によって検出するように
したことにより、未初期化の自動変数以外の未初期化変
数の参照をも検出できるので、プログラムの暴走をより
未然に防止して、より一層のデバッグの効率向上とプロ
グラムの品質向上とを図ることができるという効果があ
る。
【0061】また、擬似不定値を使用せずに未初期化変
数の検出を行っているため、各変数ごとに擬似不定値を
指定する手間が不要であり、変数によっては擬似不定値
を指定できないといった不都合も生じることがない。
【0062】さらにまた、被デバッグプログラムに一切
変更を加えることなくハードウェアによって未初期変数
を検出しているため、プログラムサイズやプログラム実
行速度が変化することがなく、擬似不定値を使用した場
合のようにプログラムサイズが2倍以上になってしまっ
たり、プログラム実行速度が1/2以下になってしまっ
たりといった不具合がない。
【図面の簡単な説明】
【図1】本発明の第1実施例に係るプログラム評価装置
の回路図である。
【図2】第1実施例のプログラム評価装置におけるサブ
プログラム識別番号の生成タイミングを示す図である。
【図3】第1実施例のプログラム評価装置においてコン
パイラが生成する自動変数領域サイズの情報を示す図で
ある。
【図4】図1中の自動変数領域サイズメモリの内容を示
す図である。
【図5】第1実施例のプログラム評価装置の処理の概要
を示すフローチャートである。
【図6】本発明の第2実施例に係るプログラム評価装置
の回路図である。
【図7】従来の擬似不定値による未初期化変数の参照の
検出を示すフローチャートである。
【図8】従来のハードウェアによる未初期化変数の参照
の検出回路を示す図である。
【図9】(a)および(b)はソースプログラムの例を
示し、(c)および(d)はコンパイル後のオブジェク
トプログラムの例を示す図である。
【図10】(a)〜(e)はスタック上の自動変数の割
付け例を示す図である。
【符号の説明】
1 評価用プロセッサ 2,2’ コールカウンタ 3 スタックカウンタ 4 スタックメモリ 5 CALLストローブ信号 6 RETストローブ信号 7 自動変数領域サイズメモリ 8 加算器 8’ 減算器 9 下限比較器 10 上限比較器 11 ORゲート 12 ベースポインタの値 13 プログラムカウンタの値 14 カバレッジメモリ 15,15’ 識別番号比較器 16 ORゲート 17 ORゲート 17’ NANDゲート 18 ORゲート 19 ANDゲート 20 外部インターフェース回路 21 リードストローブ信号 22 ライトストローブ信号 23 アドレス

Claims (2)

    (57)【特許請求の範囲】
  1. 【請求項1】 情報処理装置が実行するプログラムを識
    別する識別番号を生成する識別番号生成手段と、識別番
    号を記憶する識別番号記憶手段と、プログラム毎に変数
    の領域を記憶する変数領域記憶手段と、実行中のプログ
    ラムの識別番号と前記識別番号記憶手段に記憶された識
    別番号とを比較する識別番号比較手段と、プログラム実
    行によるデータアドレスと前記変数領域記憶手段に記憶
    された変数領域とを比較する変数領域比較手段とを有
    し、前記識別番号比較手段の比較結果と前記変数領域比
    較手段の比較結果とにより情報処理装置の未初期化変数
    の参照を検出することを特徴とするプログラム評価装
    置。
  2. 【請求項2】 前記識別番号記憶手段に初期値を設定し
    ておき、前記識別番号記憶手段より読み出された識別番
    号が初期値であることを検出する検出手段を有し、前記
    識別番号が初期値のままであった場合に情報処理装置の
    未初期化変数の参照が行われたことを検出する請求項1
    記載のプログラム評価装置。
JP6271739A 1994-10-11 1994-10-11 プログラム評価装置 Expired - Lifetime JP2661562B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP6271739A JP2661562B2 (ja) 1994-10-11 1994-10-11 プログラム評価装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP6271739A JP2661562B2 (ja) 1994-10-11 1994-10-11 プログラム評価装置

Publications (2)

Publication Number Publication Date
JPH08110866A JPH08110866A (ja) 1996-04-30
JP2661562B2 true JP2661562B2 (ja) 1997-10-08

Family

ID=17504162

Family Applications (1)

Application Number Title Priority Date Filing Date
JP6271739A Expired - Lifetime JP2661562B2 (ja) 1994-10-11 1994-10-11 プログラム評価装置

Country Status (1)

Country Link
JP (1) JP2661562B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2391426A1 (en) * 1999-11-12 2001-05-17 Clay Davis A system and method for replaying a predefined path through the internet
WO2014112317A1 (ja) * 2013-01-21 2014-07-24 日産自動車株式会社 変数アクセス一貫性検査装置、変数アクセス一貫性検査方法、変数アクセス一貫性検査プログラム

Also Published As

Publication number Publication date
JPH08110866A (ja) 1996-04-30

Similar Documents

Publication Publication Date Title
US7873954B2 (en) Stack unique signatures for program procedures and methods
US5590329A (en) Method and apparatus for detecting memory access errors
JP4398538B2 (ja) 命令セット内の命令に応答してプロセスを実行するデータ処理システムおよびその命令処理方法
US6240545B1 (en) Setting instance breakpoints in object oriented computer programs
EP1015974B1 (en) Memory allocation
US7962832B2 (en) Method for detecting memory error
US20030126590A1 (en) System and method for dynamic data-type checking
JPH0836488A (ja) ダイナミック・パッチングを使用するランタイム・エラー・チェック方法と装置
KR20080050118A (ko) 임베디드용 소프트웨어의 오류 검출 방법
US5615369A (en) Automated detection and correction of uninitialized variables
US7181733B2 (en) Method and apparatus for detecting an overflow condition in a kernel stack during operating system development
US6697971B1 (en) System and method for detecting attempts to access data residing outside of allocated memory
US6052801A (en) Method and apparatus for providing breakpoints on a selectable address range
JPH0773032A (ja) ソフトウェアシステムを動的に修正する方法
JP2661562B2 (ja) プログラム評価装置
EP3336626B1 (en) Memory analysis for industrial controllers
US20010049794A1 (en) Write protection software for programmable chip
KR100580071B1 (ko) 메모리 오류 검출방법
US7246206B2 (en) Method and device for storing a computer program in a program memory of a control unit
JP2591432B2 (ja) トレース装置
CN112527660B (zh) 代码的静态检测方法和装置
JP2001202262A (ja) データ格納方法
JP3309792B2 (ja) スタックポインタトレース装置、スタックポインタトレース方法及び記録媒体
KR100280569B1 (ko) 프로세서를이용한메모리관리방법
JPH07152579A (ja) プログラム自動更新方法およびその装置