JPH07225703A - ソフトウェアプログラムのエラー検出方法 - Google Patents
ソフトウェアプログラムのエラー検出方法Info
- Publication number
- JPH07225703A JPH07225703A JP7039426A JP3942695A JPH07225703A JP H07225703 A JPH07225703 A JP H07225703A JP 7039426 A JP7039426 A JP 7039426A JP 3942695 A JP3942695 A JP 3942695A JP H07225703 A JPH07225703 A JP H07225703A
- Authority
- JP
- Japan
- Prior art keywords
- pointer
- memory
- information
- function
- software
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3624—Software debugging by performing operations on the source code, e.g. via a compiler
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Storage Device Security (AREA)
- Stored Programmes (AREA)
Abstract
(57)【要約】
【目的】 ソフトウェアプログラムが、無効なポインタ
をデレファレンスするエラーを検出する。 【構成】 各ポインタについて、最後に既知となったポ
インタの内容と、ポインタの有効メモリ範囲とを含むポ
インタ情報を格納しておく。ソフトウェアプログラムが
ポインタに新しい値が代入することを検出するごとにポ
インタ情報を更新する。次に、ソフトウェアプログラム
によってポインタのデレファレンスが行われることを検
出するごとに実行時ポインタ検査サブルーチンを実装す
る。このサブルーチンは、デレファレンスされたポイン
タに関するポインタ情報を検索し、そのポインタが格納
されているメモリ位置からそのポインタの実際の内容を
取得し、それがポインタ情報に記録されている内容と等
しい場合に限り、その内容によって指示されるメモリ空
間が、有効メモリ範囲内にあるかどうかを判定する。
をデレファレンスするエラーを検出する。 【構成】 各ポインタについて、最後に既知となったポ
インタの内容と、ポインタの有効メモリ範囲とを含むポ
インタ情報を格納しておく。ソフトウェアプログラムが
ポインタに新しい値が代入することを検出するごとにポ
インタ情報を更新する。次に、ソフトウェアプログラム
によってポインタのデレファレンスが行われることを検
出するごとに実行時ポインタ検査サブルーチンを実装す
る。このサブルーチンは、デレファレンスされたポイン
タに関するポインタ情報を検索し、そのポインタが格納
されているメモリ位置からそのポインタの実際の内容を
取得し、それがポインタ情報に記録されている内容と等
しい場合に限り、その内容によって指示されるメモリ空
間が、有効メモリ範囲内にあるかどうかを判定する。
Description
【0001】
【産業上の利用分野】本発明は、ソフトウェアプログラ
ムのテストおよびデバッグ処理システムに関し、詳しく
は「翻訳された原始(ソース)コード」と「コンパイル
された目的(オブジェクト)コード」との両方における
メモリアクセス誤り(エラー)を検出するための方法お
よび装置に関する。
ムのテストおよびデバッグ処理システムに関し、詳しく
は「翻訳された原始(ソース)コード」と「コンパイル
された目的(オブジェクト)コード」との両方における
メモリアクセス誤り(エラー)を検出するための方法お
よび装置に関する。
【0002】
【従来の技術】今日のコンピュータプログラミングの世
界においては、多くの高水準のプログラミング言語が利
用できる。しかし、その中でC、C++、およびPas
calのようなプログラミング言語は、それらの持つ柔
軟性およびパワーによってプログラマの間で非常に人気
のある言語となっている。
界においては、多くの高水準のプログラミング言語が利
用できる。しかし、その中でC、C++、およびPas
calのようなプログラミング言語は、それらの持つ柔
軟性およびパワーによってプログラマの間で非常に人気
のある言語となっている。
【0003】これらのプログラム言語には、ソフトウェ
アにおいてプログラマが実現できることについての制約
がもしあったとしても非常に少ないので、根底にあるア
センブリプログラムが行うタスクであれば実際上どのよ
うなタスクでもプログラムに行わせることが可能であ
る。
アにおいてプログラマが実現できることについての制約
がもしあったとしても非常に少ないので、根底にあるア
センブリプログラムが行うタスクであれば実際上どのよ
うなタスクでもプログラムに行わせることが可能であ
る。
【0004】顕著なパワーおよび柔軟性の得られるこれ
らのプログラミング言語の特徴の1つは、ポインタによ
って制約なしにメモリにアクセスできるという能力であ
る。しかしポインタを制約なしに使用できることから、
従来のデバッグ処理手法では検出および訂正がしばしば
困難であるようなプログラムバグが生じる。
らのプログラミング言語の特徴の1つは、ポインタによ
って制約なしにメモリにアクセスできるという能力であ
る。しかしポインタを制約なしに使用できることから、
従来のデバッグ処理手法では検出および訂正がしばしば
困難であるようなプログラムバグが生じる。
【0005】種々のメモリアクセスエラーの検出用に、
いくつものソフトウェアテストおよびデバッグ処理ツー
ルが開発されている。例えば、米国カリフォルニア州サ
ニーベイルのピュアソフトウェア・インコーポレーテッ
ドから商業的に入手可能で、米国特許第5,193,18
0号に開示されている、商品名「ピュリファイ(Purif
y)」ソフトウェアテストツールは、メモリアクセスエラ
ーおよびメモリ漏洩(リーク)を検出するためのシステ
ムを提供する。この「ピュリファイ」システムは、メモ
リの各バイトについてメモリ割付および初期化の状態を
監視(モニタ)する。
いくつものソフトウェアテストおよびデバッグ処理ツー
ルが開発されている。例えば、米国カリフォルニア州サ
ニーベイルのピュアソフトウェア・インコーポレーテッ
ドから商業的に入手可能で、米国特許第5,193,18
0号に開示されている、商品名「ピュリファイ(Purif
y)」ソフトウェアテストツールは、メモリアクセスエラ
ーおよびメモリ漏洩(リーク)を検出するためのシステ
ムを提供する。この「ピュリファイ」システムは、メモ
リの各バイトについてメモリ割付および初期化の状態を
監視(モニタ)する。
【0006】これに加えて、「ピュリファイ」システム
は、メモリ要素配列(メモリ配列)境界違反および同様
のメモリアクセスエラーを検出するために、割付を受け
たメモリの各ブロックの前後に8バイトのバッファゾー
ンを設けている。バッファゾーン内の各バイトの状態
は、割付も初期化もされていない状態(非割付・非初期
化状態)にセットされる。
は、メモリ要素配列(メモリ配列)境界違反および同様
のメモリアクセスエラーを検出するために、割付を受け
たメモリの各ブロックの前後に8バイトのバッファゾー
ンを設けている。バッファゾーン内の各バイトの状態
は、割付も初期化もされていない状態(非割付・非初期
化状態)にセットされる。
【0007】メモリにアクセスする各命令について、
「ピュリファイ」システムは、割り付けられていないメ
モリへの書き込み、および初期化されていないまたは割
り付けられていないメモリからの読み出しをプログラム
が行っていないことを確実にするための試験を行う。
「ピュリファイ」システムは、割り付けられていないメ
モリへの書き込み、および初期化されていないまたは割
り付けられていないメモリからの読み出しをプログラム
が行っていないことを確実にするための試験を行う。
【0008】「ピュリファイ」システムを用いることに
よって、多くのメモリアクセスエラーを検出するための
有効な基礎は得られるが、このシステムは、割付された
メモリの第1のブロックに連関するポインタが、割付さ
れ初期化されたメモリの第2のブロックに不適切にアク
セスする場合に生じる共通プログラムエラーの検出はし
ない。
よって、多くのメモリアクセスエラーを検出するための
有効な基礎は得られるが、このシステムは、割付された
メモリの第1のブロックに連関するポインタが、割付さ
れ初期化されたメモリの第2のブロックに不適切にアク
セスする場合に生じる共通プログラムエラーの検出はし
ない。
【0009】すなわち、「ピュリファイ」システムは、
ポインタによって指示されたメモリが割付されているこ
とおよび初期化されていることだけを検証し、ポインタ
によって指示されたメモリがそのポインタについて設定
されている適切な境界範囲内にあることの検証は行わな
い。
ポインタによって指示されたメモリが割付されているこ
とおよび初期化されていることだけを検証し、ポインタ
によって指示されたメモリがそのポインタについて設定
されている適切な境界範囲内にあることの検証は行わな
い。
【0010】この制限を克服しようとする試みから、別
のソフトウェアテストおよびデバッグ処理ツールが開発
された。例えば、ステッフェン(Joseph L. Steffen)の
論文「ポータブルCコンパイラへの実行時(ランタイ
ム)検査の追加」(Software-Practice and Experience
誌、第22(4)巻、1992年4月、305−316
ページ)に記述されている、コンパイラを基盤とするメ
モリアクセス検出システムは、各ポインタについて3語
を利用し、それによってポインタがそのポインタの有効
範囲についての情報を得られるようにしたものである。
のソフトウェアテストおよびデバッグ処理ツールが開発
された。例えば、ステッフェン(Joseph L. Steffen)の
論文「ポータブルCコンパイラへの実行時(ランタイ
ム)検査の追加」(Software-Practice and Experience
誌、第22(4)巻、1992年4月、305−316
ページ)に記述されている、コンパイラを基盤とするメ
モリアクセス検出システムは、各ポインタについて3語
を利用し、それによってポインタがそのポインタの有効
範囲についての情報を得られるようにしたものである。
【0011】すなわち、ポインタがメモリにアクセスす
る都度、そのポインタによって指示されたメモリがそれ
ぞれのポインタについての適切な境界範囲内にあること
を確実にするような検査が行われる。
る都度、そのポインタによって指示されたメモリがそれ
ぞれのポインタについての適切な境界範囲内にあること
を確実にするような検査が行われる。
【0012】しかし、プログラマの多くは、自分のソフ
トウェアのテストおよびデバッグ処理を、コンパイラ環
境よりも翻訳器(インタプリタ)環境で行うことを好
む。その理由は、インタプリタを基盤とするデバッグ処
理処理の方が一般に、程度の高い追跡およびその他の診
断手法が得られることから、デバッグ処理中により柔軟
性がありまたより大きな支援が得られるためである。
トウェアのテストおよびデバッグ処理を、コンパイラ環
境よりも翻訳器(インタプリタ)環境で行うことを好
む。その理由は、インタプリタを基盤とするデバッグ処
理処理の方が一般に、程度の高い追跡およびその他の診
断手法が得られることから、デバッグ処理中により柔軟
性がありまたより大きな支援が得られるためである。
【0013】たぶん、より普通なのは、いくつかのファ
イルが「翻訳された原始コード」から構成され他のファ
イルが「コンパイルされた目的コード」から構成される
ような、部分的翻訳である。
イルが「翻訳された原始コード」から構成され他のファ
イルが「コンパイルされた目的コード」から構成される
ような、部分的翻訳である。
【0014】しかし、部分的翻訳の環境で作動するソフ
トウェアデバッグ処理ツール(例えば、センタラインソ
フトウェア・インコーポレーテッドから商業的に入手可
能な、前に「セーバ・C」システムとして知られた「セ
ンタラインコードセンタ」システム)は一般に、「コン
パイルされた目的コード」のエラー検査に関しては、上
に述べた「ピュリファイ」システムと同じ制限がある。
トウェアデバッグ処理ツール(例えば、センタラインソ
フトウェア・インコーポレーテッドから商業的に入手可
能な、前に「セーバ・C」システムとして知られた「セ
ンタラインコードセンタ」システム)は一般に、「コン
パイルされた目的コード」のエラー検査に関しては、上
に述べた「ピュリファイ」システムと同じ制限がある。
【0015】詳しくは、これらの部分的翻訳デバッグ処
理ツールは一般に、「コンパイルされた目的コード」内
でポインタによって指示されたメモリが割付され且つ初
期化されていることだけを検証し、ポインタによって指
示されたメモリがそのポインタについて設定されている
適切な境界範囲内にあることの検証は行わない。
理ツールは一般に、「コンパイルされた目的コード」内
でポインタによって指示されたメモリが割付され且つ初
期化されていることだけを検証し、ポインタによって指
示されたメモリがそのポインタについて設定されている
適切な境界範囲内にあることの検証は行わない。
【0016】
【発明が解決しようとする課題】従来の技術についての
上記の欠点から明らかなように、「翻訳された原始コー
ド」と「コンパイルされた目的コード」との両方を実行
しながらエラー検出タスクを行うことのできるソフトウ
ェアテストおよびデバッグ処理ツールの必要性が存在す
る。さらに、与えられたポインタによって指示されたメ
モリがそれぞれのポインタについての適切な境界範囲内
にあることを確実にするソフトウェアテストおよびデバ
ッグ処理ツールの必要性が存在する。
上記の欠点から明らかなように、「翻訳された原始コー
ド」と「コンパイルされた目的コード」との両方を実行
しながらエラー検出タスクを行うことのできるソフトウ
ェアテストおよびデバッグ処理ツールの必要性が存在す
る。さらに、与えられたポインタによって指示されたメ
モリがそれぞれのポインタについての適切な境界範囲内
にあることを確実にするソフトウェアテストおよびデバ
ッグ処理ツールの必要性が存在する。
【0017】その上、読み出し時またはパーズ時に導出
される情報を利用することにより、実行時に行われる重
複または重合するポインタ検査の数を減少させるよう
な、より効率的なソフトウェアテストおよびデバッグ処
理ツールの必要性が存在する。
される情報を利用することにより、実行時に行われる重
複または重合するポインタ検査の数を減少させるよう
な、より効率的なソフトウェアテストおよびデバッグ処
理ツールの必要性が存在する。
【0018】
【課題を解決するための手段】概略的には、本発明の一
態様によれば、ソフトウェアプログラムにおけるいくつ
ものメモリアクセスエラー、を検出するためのソフトウ
ェアテストおよびデバッグ処理システムとしての処理ツ
ールが設けられる。これらのメモリアクセスエラーは例
えば、配列次元違反、無効ポインタの「関連付けの解除
(関連解除)(デレファレンス)」、解放されたメモリ
へのアクセス、初期化されていないメモリからの読み出
し、およびメモリ漏洩の自動検出である。これに加え
て、本システムは、検出されたエラーの特定および訂正
を行うための診断情報を有する。
態様によれば、ソフトウェアプログラムにおけるいくつ
ものメモリアクセスエラー、を検出するためのソフトウ
ェアテストおよびデバッグ処理システムとしての処理ツ
ールが設けられる。これらのメモリアクセスエラーは例
えば、配列次元違反、無効ポインタの「関連付けの解除
(関連解除)(デレファレンス)」、解放されたメモリ
へのアクセス、初期化されていないメモリからの読み出
し、およびメモリ漏洩の自動検出である。これに加え
て、本システムは、検出されたエラーの特定および訂正
を行うための診断情報を有する。
【0019】本発明の別の態様によれば、ソフトウェア
プログラムにおける各ポインタについてのポインタ情報
を記録するためのシステムが設けられる。記録されたポ
インタ情報は、例えば連関するポインタのアドレスおよ
び内容、ならびに連関するポインタが有効に指示できる
メモリ範囲を含むのが好ましい。
プログラムにおける各ポインタについてのポインタ情報
を記録するためのシステムが設けられる。記録されたポ
インタ情報は、例えば連関するポインタのアドレスおよ
び内容、ならびに連関するポインタが有効に指示できる
メモリ範囲を含むのが好ましい。
【0020】これに加えて、割付されたメモリの各領域
についての割付情報を記録するためのシステムが設けら
れる。記録されたメモリ割付情報は、例えば割付された
メモリの連関領域を現に指示する全ポインタのチェイン
リスト、および割付されたメモリの連関領域の各バイト
の初期化状態を維持する初期化ビットベクトルを含むの
が好ましい。
についての割付情報を記録するためのシステムが設けら
れる。記録されたメモリ割付情報は、例えば割付された
メモリの連関領域を現に指示する全ポインタのチェイン
リスト、および割付されたメモリの連関領域の各バイト
の初期化状態を維持する初期化ビットベクトルを含むの
が好ましい。
【0021】読み出し時エラー検査プロセスが、翻訳さ
れた原始コードに連関する構文木(パーズ木)の各ライ
ンを解析する。翻訳された原始コードに現れる各ポイン
タ割当またはポインタ関連解除の各々に応答して、「読
み出し時エラー検査プロセス」が、パーズ木内にエラー
検査コマンドおよび追加情報を適切に挿入する。
れた原始コードに連関する構文木(パーズ木)の各ライ
ンを解析する。翻訳された原始コードに現れる各ポイン
タ割当またはポインタ関連解除の各々に応答して、「読
み出し時エラー検査プロセス」が、パーズ木内にエラー
検査コマンドおよび追加情報を適切に挿入する。
【0022】「実行時エラー検査プロセス」が、ポイン
タ割当に応答してパーズ木内に挿入された各エラー検査
コマンドについての適切な、記録されたポインタ情報の
更新を開始する。同様に、ポインタ関連解除に応答して
パース木内に挿入された各エラー検査コマンドについ
て、「実行時エラー検査プロセス」が、関連解除(デレ
ファレンス)されたポインタについて記録されているポ
インタ情報のポインタ検査を開始する。
タ割当に応答してパーズ木内に挿入された各エラー検査
コマンドについての適切な、記録されたポインタ情報の
更新を開始する。同様に、ポインタ関連解除に応答して
パース木内に挿入された各エラー検査コマンドについ
て、「実行時エラー検査プロセス」が、関連解除(デレ
ファレンス)されたポインタについて記録されているポ
インタ情報のポインタ検査を開始する。
【0023】実行時ポインタ検査は、関連解除されたポ
インタについての記録されているポインタ情報を検討評
価(または単に、評価)し、関連解除されたポインタが
その有効メモリスペース外を指示しているかどうかを検
出する。
インタについての記録されているポインタ情報を検討評
価(または単に、評価)し、関連解除されたポインタが
その有効メモリスペース外を指示しているかどうかを検
出する。
【0024】本発明のさらに別の特徴によれば、「コン
パイルされた目的コード関数」(または簡単に、「コン
パイルされたコード関数」)に対するエラー検査プロセ
スが、エラー検査を要する「コンパイルされたコード関
数」に連関する翻訳された「ラッパ関数」を用いて行わ
れる。必要なエラー検査プロセスを実現するために、ラ
ッパ関数は、必要に応じて、連関する「コンパイルされ
たコード関数」の前および/または後に実行される。
パイルされた目的コード関数」(または簡単に、「コン
パイルされたコード関数」)に対するエラー検査プロセ
スが、エラー検査を要する「コンパイルされたコード関
数」に連関する翻訳された「ラッパ関数」を用いて行わ
れる。必要なエラー検査プロセスを実現するために、ラ
ッパ関数は、必要に応じて、連関する「コンパイルされ
たコード関数」の前および/または後に実行される。
【0025】関連解除されたポインタの各々についてポ
インタ検査を開始するために、「コンパイルされた目的
コード」の実行中ポインタを関連解除するものとして知
られる「コンパイルされたコード関数」の各々に「実行
前ラッパ関数」を連関させるのが好ましい。「実行前ラ
ッパ関数」は、「コンパイルされたコード関数」へ送ら
れた引数(アーギュメント)についての追加検査も行
う。
インタ検査を開始するために、「コンパイルされた目的
コード」の実行中ポインタを関連解除するものとして知
られる「コンパイルされたコード関数」の各々に「実行
前ラッパ関数」を連関させるのが好ましい。「実行前ラ
ッパ関数」は、「コンパイルされたコード関数」へ送ら
れた引数(アーギュメント)についての追加検査も行
う。
【0026】「コンパイルされたコード」の実行中ポイ
ンタの生成を行うものとして知られる「コンパイルされ
たコード関数」の各々に「実行後ラッパ関数」を連関さ
せるのが好ましく、同様に、ポインタ値を返すものとし
て知られる「コンパイルされた目的コード関数」の各々
に「実行後ラッパ関数」を連関させるのが好ましい。こ
のポインタ値は次に、呼び出し関数によって返されると
すぐに別のポインタに割り当てられる。
ンタの生成を行うものとして知られる「コンパイルされ
たコード関数」の各々に「実行後ラッパ関数」を連関さ
せるのが好ましく、同様に、ポインタ値を返すものとし
て知られる「コンパイルされた目的コード関数」の各々
に「実行後ラッパ関数」を連関させるのが好ましい。こ
のポインタ値は次に、呼び出し関数によって返されると
すぐに別のポインタに割り当てられる。
【0027】もし連関させた「コンパイルされたコード
関数」がポインタを生成する場合、「実行後ラッパ関
数」が、生成されたポインタについてのポインタ情報を
適切なメモリ位置に記録することが好ましい。もし連関
させた「コンパイルされたコード関数」がポインタ値を
呼び出し関数に返す場合、呼び出し関数の実行中に次に
行われる検索取り出しのために、「実行後ラッパ関数」
が、必要なポインタ情報をポインタ保存スタックに位置
させることが好ましい。
関数」がポインタを生成する場合、「実行後ラッパ関
数」が、生成されたポインタについてのポインタ情報を
適切なメモリ位置に記録することが好ましい。もし連関
させた「コンパイルされたコード関数」がポインタ値を
呼び出し関数に返す場合、呼び出し関数の実行中に次に
行われる検索取り出しのために、「実行後ラッパ関数」
が、必要なポインタ情報をポインタ保存スタックに位置
させることが好ましい。
【0028】本発明のさらに別の特徴によれば、割付を
解除されたメモリの領域がアクセスされる場合を検出す
るための方法が提供される。割付されたメモリの領域の
割付の解除後すぐに、そのメモリ領域に連関するメモリ
割付情報に含まれるチェインリストがアクセスされて、
割付されたメモリの領域を現に指示する全ポインタのリ
ストが得られる。その後、ポインタが、割付を解除され
たメモリの領域を今指示している旨の表示が、チェイン
リスト中に列記された各ポインタに連関するポインタ情
報に記録される。
解除されたメモリの領域がアクセスされる場合を検出す
るための方法が提供される。割付されたメモリの領域の
割付の解除後すぐに、そのメモリ領域に連関するメモリ
割付情報に含まれるチェインリストがアクセスされて、
割付されたメモリの領域を現に指示する全ポインタのリ
ストが得られる。その後、ポインタが、割付を解除され
たメモリの領域を今指示している旨の表示が、チェイン
リスト中に列記された各ポインタに連関するポインタ情
報に記録される。
【0029】したがって、もし、割付を解除されたメモ
リスペースをポインタが指示している旨の表示がありな
がら、そのポインタが関連解除される場合に、エラーが
検出される。
リスペースをポインタが指示している旨の表示がありな
がら、そのポインタが関連解除される場合に、エラーが
検出される。
【0030】本発明の別の特徴によれば、初期化されて
いないメモリの領域からの読み出しが行われる場合を検
出する方法が提供される。割付されたメモリの領域の1
個以上のバイトが「翻訳された原始コード」によって初
期化される都度、メモリのその連関領域についてのメモ
リ割付情報における初期化ビットベクトルが、その対応
する数のメモリバイトが初期化されたことを表示するよ
うに更新される。
いないメモリの領域からの読み出しが行われる場合を検
出する方法が提供される。割付されたメモリの領域の1
個以上のバイトが「翻訳された原始コード」によって初
期化される都度、メモリのその連関領域についてのメモ
リ割付情報における初期化ビットベクトルが、その対応
する数のメモリバイトが初期化されたことを表示するよ
うに更新される。
【0031】メモリを初期化する「コンパイルされたコ
ード関数」が実行される都度、初期化ビットベクトル維
持サブルーチンが行われる。初期化ビットベクトル維持
サブルーチンは、「コンパイルされたコード関数」によ
ってメモリの1バイト以上の初期化を検出し、その対応
する数のメモリバイトが初期化されたことを表示するよ
うに初期化ビットベクトルを更新する。
ード関数」が実行される都度、初期化ビットベクトル維
持サブルーチンが行われる。初期化ビットベクトル維持
サブルーチンは、「コンパイルされたコード関数」によ
ってメモリの1バイト以上の初期化を検出し、その対応
する数のメモリバイトが初期化されたことを表示するよ
うに初期化ビットベクトルを更新する。
【0032】メモリの領域からの読み出しを行うように
ポインタが関連解除される都度、初期化ビットベクトル
が評価されて、読み出しが行われているメモリ領域が初
期化された状態にあるかどうかが定められる。
ポインタが関連解除される都度、初期化ビットベクトル
が評価されて、読み出しが行われているメモリ領域が初
期化された状態にあるかどうかが定められる。
【0033】本発明のさらに別の特徴によれば、メモリ
漏洩が自動的に検出可能となる。割付されたメモリの各
領域を現に指示しているポインタのリストがポインタの
割当によって修正される都度、割付されたメモリのその
領域に連関するメモリ割付情報に含まれるチェインリス
トが更新される。もしチェインリストが空きの場合、メ
モリ漏洩が識別される。
漏洩が自動的に検出可能となる。割付されたメモリの各
領域を現に指示しているポインタのリストがポインタの
割当によって修正される都度、割付されたメモリのその
領域に連関するメモリ割付情報に含まれるチェインリス
トが更新される。もしチェインリストが空きの場合、メ
モリ漏洩が識別される。
【0034】本発明のなお別の特徴によれば、データ流
れ解析を利用して、読み出し時パーズ木についての重複
すなわち重合するポインタ検査を削除することによっ
て、実行時において行う必要のあるポインタ検査の数を
最小化する処理が行われる。これに加えて、データ流れ
解析により、空のまたは初期化されていないポインタの
関連解除を読み出し時において検出することが可能とな
る。
れ解析を利用して、読み出し時パーズ木についての重複
すなわち重合するポインタ検査を削除することによっ
て、実行時において行う必要のあるポインタ検査の数を
最小化する処理が行われる。これに加えて、データ流れ
解析により、空のまたは初期化されていないポインタの
関連解除を読み出し時において検出することが可能とな
る。
【0035】
【実施例】本発明に基づくメモリアクセスエラー検出シ
ステムを図1に示す。ここに開示するメモリアクセスエ
ラー検出システムは、ソフトウェア生成システムを基盤
とするソフトウェアテストおよびデバッグ処理ツールで
ある。この場合のソフトウェア生成システムは、翻訳器
(インタプリタ)、またはコンパイラ、あるいはその
他、原始コードを実行可能なフォーマットに変換する能
力を有する類似のシステムとして実施される。
ステムを図1に示す。ここに開示するメモリアクセスエ
ラー検出システムは、ソフトウェア生成システムを基盤
とするソフトウェアテストおよびデバッグ処理ツールで
ある。この場合のソフトウェア生成システムは、翻訳器
(インタプリタ)、またはコンパイラ、あるいはその
他、原始コードを実行可能なフォーマットに変換する能
力を有する類似のシステムとして実施される。
【0036】本メモリアクセスエラー検出システムは、
種々のメモリアクセスエラーを検出するために、検査対
象ソフトウェアプログラムを解析する。これらのメモリ
アクセスエラーは例えば、配列次元違反、無効ポインタ
の関連解除、解放されたメモリへのアクセス、初期化さ
れていないメモリからの読み出し、およびメモリ漏洩の
自動検出である。加えて、本システムは、検出されたエ
ラーの特定および訂正を行うための診断情報を有する。
種々のメモリアクセスエラーを検出するために、検査対
象ソフトウェアプログラムを解析する。これらのメモリ
アクセスエラーは例えば、配列次元違反、無効ポインタ
の関連解除、解放されたメモリへのアクセス、初期化さ
れていないメモリからの読み出し、およびメモリ漏洩の
自動検出である。加えて、本システムは、検出されたエ
ラーの特定および訂正を行うための診断情報を有する。
【0037】本発明を以下5つの主要項目に分けて説明
する。第1に、導入部において、まず図1の概略ブロッ
ク図を参照して、本発明のメモリアクセスエラー検出シ
ステムについて述べる。またこの導入部では、概略的に
は図1にまた詳しくは図2に示すようなポインタ検査表
200についての詳細説明も行う。図2に示すポインタ
検査表200は、図3〜図6を参照して説明するような
連関事例におけるデータからなる。
する。第1に、導入部において、まず図1の概略ブロッ
ク図を参照して、本発明のメモリアクセスエラー検出シ
ステムについて述べる。またこの導入部では、概略的に
は図1にまた詳しくは図2に示すようなポインタ検査表
200についての詳細説明も行う。図2に示すポインタ
検査表200は、図3〜図6を参照して説明するような
連関事例におけるデータからなる。
【0038】第2に、図1に示すメモリアクセスエラー
検出コード挿入器25によって実行されるような、本発
明の「読み出し時エラー検査プロセス」を、[読み出し
時エラー検査動作]と題する項目において、図7〜図1
1を参照して説明する。本項目においてはその終りに、
図23および図24を参照して、実行時において行う必
要のあるポインタ検査の数を最小化することとある読み
出し時エラーを検出できるようにすることとを目的とし
て読み出し時において行われるデータ流れ解析、につい
て述べる。
検出コード挿入器25によって実行されるような、本発
明の「読み出し時エラー検査プロセス」を、[読み出し
時エラー検査動作]と題する項目において、図7〜図1
1を参照して説明する。本項目においてはその終りに、
図23および図24を参照して、実行時において行う必
要のあるポインタ検査の数を最小化することとある読み
出し時エラーを検出できるようにすることとを目的とし
て読み出し時において行われるデータ流れ解析、につい
て述べる。
【0039】第3に、「コンパイルされた目的コード関
数」(または簡単に、「コンパイルされたコード関
数」)についてのエラー検査を実現するための好ましい
実施例を、[コンパイルされた目的コードのエラー検
査]と題する項目において説明する。本項目において
は、連関する「コンパイルされたコード関数」について
のエラー検査を行うために必要に応じて実行される「翻
訳されたラッパ関数」に関して述べる。コンパイルされ
たメモリ割付解除関数の各々に連関する好ましい「実行
前ラッパ関数」についても図12を参照して説明する。
数」(または簡単に、「コンパイルされたコード関
数」)についてのエラー検査を実現するための好ましい
実施例を、[コンパイルされた目的コードのエラー検
査]と題する項目において説明する。本項目において
は、連関する「コンパイルされたコード関数」について
のエラー検査を行うために必要に応じて実行される「翻
訳されたラッパ関数」に関して述べる。コンパイルされ
たメモリ割付解除関数の各々に連関する好ましい「実行
前ラッパ関数」についても図12を参照して説明する。
【0040】第4に、図1に示す評価器35によって実
行されるような、本発明の「実行時エラー検査プロセ
ス」を、[実行時エラー検査動作]と題する項目におい
て、図13〜図22を参照して説明する。
行されるような、本発明の「実行時エラー検査プロセ
ス」を、[実行時エラー検査動作]と題する項目におい
て、図13〜図22を参照して説明する。
【0041】最後に、メモリ漏洩を検査するための方
法、および検出されていないポインタ修正のソースを
「コンパイルされたコード関数」によって特定するため
の方法を、[メモリ漏洩の特定および検出されていない
ポインタ修正のソースの特定]と題する項目において説
明する。
法、および検出されていないポインタ修正のソースを
「コンパイルされたコード関数」によって特定するため
の方法を、[メモリ漏洩の特定および検出されていない
ポインタ修正のソースの特定]と題する項目において説
明する。
【0042】図1に示すように、メモリアクセスエラー
検出システムは、商業的にAT&T社から入手可能な、
Cプログラミング言語用のCIN翻訳器をエラー検査関
数が得られるように改造した翻訳器のような、翻訳器
(インタプリタ)15を用いるのが好ましい。下でさら
に述べるように翻訳器15は「翻訳された原始コード」
および「コンパイルされた目的コード」の両方を実行し
ながらエラー検出タスクを行う。
検出システムは、商業的にAT&T社から入手可能な、
Cプログラミング言語用のCIN翻訳器をエラー検査関
数が得られるように改造した翻訳器のような、翻訳器
(インタプリタ)15を用いるのが好ましい。下でさら
に述べるように翻訳器15は「翻訳された原始コード」
および「コンパイルされた目的コード」の両方を実行し
ながらエラー検出タスクを行う。
【0043】翻訳器15によって受信される原始コード
を、読み出し時においてパーザ(構文解析器)20が解
析し、原始コードを周知のパーザ木(構文木)に変換す
る。これに加えて、原始コードがプログラムメモリに読
み込まれると、内部記号表75がパーザ20によって形
成される。
を、読み出し時においてパーザ(構文解析器)20が解
析し、原始コードを周知のパーザ木(構文木)に変換す
る。これに加えて、原始コードがプログラムメモリに読
み込まれると、内部記号表75がパーザ20によって形
成される。
【0044】内部記号表75には、原始コードに定義さ
れる記号ラベルの各々についてのエントリが既知の方法
で含まれる。内部記号表75の各エントリからその連関
する記号ラベルが判る。またこれらの各エントリは、そ
れぞれの記号ラベルに割付されたメモリ位置のアドレス
を含む。
れる記号ラベルの各々についてのエントリが既知の方法
で含まれる。内部記号表75の各エントリからその連関
する記号ラベルが判る。またこれらの各エントリは、そ
れぞれの記号ラベルに割付されたメモリ位置のアドレス
を含む。
【0045】メモリアクセスエラー検出コード挿入器2
5が設けられ、パーザ20によって生成されたパーズ木
上で、図7〜図11を参照して下にさらに説明するよう
に読み出し時エラー検査プロセスを行う。下にさらに述
べるように、メモリアクセスエラー検出コード挿入器2
5が、原始コードから導出されたパーズ木を解析し、適
切な場合にはエラー検査コマンドおよび追加情報をパー
ズ木の中に挿入する。この追加情報は実行時において評
価される。
5が設けられ、パーザ20によって生成されたパーズ木
上で、図7〜図11を参照して下にさらに説明するよう
に読み出し時エラー検査プロセスを行う。下にさらに述
べるように、メモリアクセスエラー検出コード挿入器2
5が、原始コードから導出されたパーズ木を解析し、適
切な場合にはエラー検査コマンドおよび追加情報をパー
ズ木の中に挿入する。この追加情報は実行時において評
価される。
【0046】それから、メモリアクセスエラー検出コー
ド挿入器25によって生成された修正パーズ木(挿入さ
れたエラー検査コマンドおよび追加情報から構成され
る)が、「木からスタックへコード変換する「木/スタ
ックコード変換器」30に入力される。木/スタックコ
ード変換器30は、機械語内に本来ある内部疑似コード
を生成する。
ド挿入器25によって生成された修正パーズ木(挿入さ
れたエラー検査コマンドおよび追加情報から構成され
る)が、「木からスタックへコード変換する「木/スタ
ックコード変換器」30に入力される。木/スタックコ
ード変換器30は、機械語内に本来ある内部疑似コード
を生成する。
【0047】上に述べたように、翻訳器15は「翻訳さ
れた原始コード」および「コンパイルされた目的コー
ド」の両方を実行しながらエラー検出タスクを行うこと
が好ましい。そのため、コンパイルされた目的コードを
再配置するリンク装置40が設けられる。目的コードが
読み出し時においてリンク装置40によってプログラム
メモリにロードされると、内部記号表75が、目的コー
ドにおいて定義された各記号ラベルについてのエントリ
を含むように、上に述べた方法で更新される。
れた原始コード」および「コンパイルされた目的コー
ド」の両方を実行しながらエラー検出タスクを行うこと
が好ましい。そのため、コンパイルされた目的コードを
再配置するリンク装置40が設けられる。目的コードが
読み出し時においてリンク装置40によってプログラム
メモリにロードされると、内部記号表75が、目的コー
ドにおいて定義された各記号ラベルについてのエントリ
を含むように、上に述べた方法で更新される。
【0048】実行時において、評価器35が、インタプ
リタスタック60を利用して、木/スタックコード変換
器30によって生成された内部疑似コードと、翻訳され
た内部疑似コードから呼び出されたコンパイルされた目
的コードとを、さらに下で述べる方法で実行する。評価
器35の出力をモニタするために、プリンタ45が設け
られる。このプリンタ45は、原始コードフォーマット
で評価器35によって実行される内部疑似コードプログ
ラムを列記する。
リタスタック60を利用して、木/スタックコード変換
器30によって生成された内部疑似コードと、翻訳され
た内部疑似コードから呼び出されたコンパイルされた目
的コードとを、さらに下で述べる方法で実行する。評価
器35の出力をモニタするために、プリンタ45が設け
られる。このプリンタ45は、原始コードフォーマット
で評価器35によって実行される内部疑似コードプログ
ラムを列記する。
【0049】本発明の一特徴によれば、評価器35が、
読み出し時中および実行時状況において内部疑似コード
内に設定されたコマンドおよび情報に基づいて、図2を
参照してさらに下で述べるように、ポインタ検査表20
0を生成する。ポインタ検査表200は、それぞれのポ
インタの使用および修正をモニタするために利用される
各ポインタについての情報を記録する。
読み出し時中および実行時状況において内部疑似コード
内に設定されたコマンドおよび情報に基づいて、図2を
参照してさらに下で述べるように、ポインタ検査表20
0を生成する。ポインタ検査表200は、それぞれのポ
インタの使用および修正をモニタするために利用される
各ポインタについての情報を記録する。
【0050】これに加えて、ポインタ情報を評価器35
が将来使用することが予想されるのでそのために、ポイ
ンタ情報が、キャッシュメモリ74、すなわち非常に高
速のメモリ区域に評価器35によって一時的に記憶され
る。本発明の一実施例においては、キャッシュメモリ7
4が最も最近に参照された2個のポインタのアドレスを
記憶する。これらの値が、下に述べるように実行時にお
ける動作中に評価器35によって次に必要とされる場
合、このような方法で、これらの値が評価器35へ直接
に転送されるので、動作速度が増加する。
が将来使用することが予想されるのでそのために、ポイ
ンタ情報が、キャッシュメモリ74、すなわち非常に高
速のメモリ区域に評価器35によって一時的に記憶され
る。本発明の一実施例においては、キャッシュメモリ7
4が最も最近に参照された2個のポインタのアドレスを
記憶する。これらの値が、下に述べるように実行時にお
ける動作中に評価器35によって次に必要とされる場
合、このような方法で、これらの値が評価器35へ直接
に転送されるので、動作速度が増加する。
【0051】もし望むポインタ情報がキャッシュメモリ
74内に見出されない場合、好ましくは、バケットが最
も最近のポインタ更新によって分類されるような「バケ
ット・ハッシュ・ルックアップ」アルゴリズムを用い
て、ポインタ検査表200がアクセスされる。
74内に見出されない場合、好ましくは、バケットが最
も最近のポインタ更新によって分類されるような「バケ
ット・ハッシュ・ルックアップ」アルゴリズムを用い
て、ポインタ検査表200がアクセスされる。
【0052】例えば、評価器35によって実行されてい
る関数の引数を記憶するために、周知のハードウェアス
タック67が評価器35によってアクセスされる。これ
に加えて、評価器35が、実行時エラー検査動作の好ま
しい実施例を実現化しながら、ポインタ保存スタック6
5にアクセスする。これについてはさらに下に述べる。
る関数の引数を記憶するために、周知のハードウェアス
タック67が評価器35によってアクセスされる。これ
に加えて、評価器35が、実行時エラー検査動作の好ま
しい実施例を実現化しながら、ポインタ保存スタック6
5にアクセスする。これについてはさらに下に述べる。
【0053】さらに下の「コンパイルされた目的コード
のエラー検査」と題する項目で述べるが、コンパイルさ
れたコード関数に連関する「翻訳された実行前および実
行後ラッパ関数」を記憶するために、ラッパ・ライブラ
リ70を設けることが好ましい。「翻訳された実行前お
よび実行後ラッパ関数」によって、連関するコンパイル
されたコード関数について、必要に応じてエラー検査プ
ロセスを行うことが可能となる。
のエラー検査」と題する項目で述べるが、コンパイルさ
れたコード関数に連関する「翻訳された実行前および実
行後ラッパ関数」を記憶するために、ラッパ・ライブラ
リ70を設けることが好ましい。「翻訳された実行前お
よび実行後ラッパ関数」によって、連関するコンパイル
されたコード関数について、必要に応じてエラー検査プ
ロセスを行うことが可能となる。
【0054】さらに下で「実行時エラー検査動作」と題
する項目において述べるように、ポインタ検査表200
の適切なエントリが、ポインタが新しい値を割り当てら
れる都度、評価器35により実行時において更新され
る。この方法で、ポインタ検査表200が、各ポインタ
についての現ポインタ情報を記録する。
する項目において述べるように、ポインタ検査表200
の適切なエントリが、ポインタが新しい値を割り当てら
れる都度、評価器35により実行時において更新され
る。この方法で、ポインタ検査表200が、各ポインタ
についての現ポインタ情報を記録する。
【0055】しかし、周知のように、従来の翻訳器は通
常、コンパイルされた目的コードによってポインタ値に
加えられた修正については気付かない。したがって、本
発明の一態様により、ポインタ検査表200内の適切な
エントリを修正ポインタ情報で更新するために、ポイン
タ値を修正するものとして知られる連関するコンパイル
されたコード関数の実行後に、下の「コンパイルされた
目的コードのエラー検査」と題する項目において説明す
る「実行後ラッパ関数」を実行することが好ましい。
常、コンパイルされた目的コードによってポインタ値に
加えられた修正については気付かない。したがって、本
発明の一態様により、ポインタ検査表200内の適切な
エントリを修正ポインタ情報で更新するために、ポイン
タ値を修正するものとして知られる連関するコンパイル
されたコード関数の実行後に、下の「コンパイルされた
目的コードのエラー検査」と題する項目において説明す
る「実行後ラッパ関数」を実行することが好ましい。
【0056】これに加えて、新しいポインタ値が次に用
いられるときにそのポインタ値についての前に検出され
なかった修正を検出してフラグを付けるためのステップ
1124およびステップ1128(図18)における追
補メカニズムが、下に図18および図19を参照して説
明する実行時ポインタ検査サブルーチンによって得られ
る。
いられるときにそのポインタ値についての前に検出され
なかった修正を検出してフラグを付けるためのステップ
1124およびステップ1128(図18)における追
補メカニズムが、下に図18および図19を参照して説
明する実行時ポインタ検査サブルーチンによって得られ
る。
【0057】図2に示すポインタ検査表200のような
ポインタ検査表は、異なるポインタに各々が連関する横
列220、222、224のような、複数の横列を有す
る。ポインタ検査表200の各横列は、連関するポイン
タについての情報を記憶するための複数のエントリを有
する。
ポインタ検査表は、異なるポインタに各々が連関する横
列220、222、224のような、複数の横列を有す
る。ポインタ検査表200の各横列は、連関するポイン
タについての情報を記憶するための複数のエントリを有
する。
【0058】エントリ230は、連関するポインタが記
憶されているメモリ内のアドレスを記憶する。同様に、
エントリ240は、連関するポインタの内容を記憶す
る。エントリ250aは、連関するポインタの有効下側
メモリ境界を記録し、他方、エントリ250bは、有効
上側メモリ境界を記録を記録する。状態エントリ260
は、連関するポインタについての、さらに下に述べるい
くつもの予め定義されたコードのうちの1つを記録す
る。
憶されているメモリ内のアドレスを記憶する。同様に、
エントリ240は、連関するポインタの内容を記憶す
る。エントリ250aは、連関するポインタの有効下側
メモリ境界を記録し、他方、エントリ250bは、有効
上側メモリ境界を記録を記録する。状態エントリ260
は、連関するポインタについての、さらに下に述べるい
くつもの予め定義されたコードのうちの1つを記録す
る。
【0059】最後に、ファイル/ライン番号エントリ2
70は、ポインタの最後の修正に連関するファイル名お
よびライン番号を指示するポインタを記録する。この最
後の修正データを利用してエラー検出時に診断情報が得
られる。
70は、ポインタの最後の修正に連関するファイル名お
よびライン番号を指示するポインタを記録する。この最
後の修正データを利用してエラー検出時に診断情報が得
られる。
【0060】説明の便宜上、図3に示す原始コードファ
イル例「テストファイル」のライン10からライン21
0までの実行後すぐに宣言され初期化されたポインタに
連関するポインタ情報から構成されるものとする。な
お、原始コードファイル「テストファイル」は、各整数
変数について2バイトおよび各文字変数について1バイ
トを割付するマシン上で作動する。
イル例「テストファイル」のライン10からライン21
0までの実行後すぐに宣言され初期化されたポインタに
連関するポインタ情報から構成されるものとする。な
お、原始コードファイル「テストファイル」は、各整数
変数について2バイトおよび各文字変数について1バイ
トを割付するマシン上で作動する。
【0061】図3に示す原始コードファイル「テストフ
ァイル」のライン10からライン40までの実行中、整
数番号「number」および文字番号「name」を
有する「part」型の構造体「widget」が宣言
される。ポインタ「ptr_part」がライン50に
おいて宣言される。
ァイル」のライン10からライン40までの実行中、整
数番号「number」および文字番号「name」を
有する「part」型の構造体「widget」が宣言
される。ポインタ「ptr_part」がライン50に
おいて宣言される。
【0062】ライン60の実行中、ポインタ「ptr_
part」は、構造体「widget」のアドレスを指
示するように割当を受ける。ライン60におけるこのポ
インタ指示割当によって、ポインタ「ptr_par
t」についてのポインタ情報がポインタ検査表200内
に入れられる。ライン10からライン60までの実行の
結果として得られるメモリ割付を図4に示す。
part」は、構造体「widget」のアドレスを指
示するように割当を受ける。ライン60におけるこのポ
インタ指示割当によって、ポインタ「ptr_par
t」についてのポインタ情報がポインタ検査表200内
に入れられる。ライン10からライン60までの実行の
結果として得られるメモリ割付を図4に示す。
【0063】図4から判るように、ポインタ「ptr_
part」にはアドレス「2048」がメモリ割付され
ており、ポインタ「ptr_part」についてのポイ
ンタ検査表200のポインタエントリ230のポインタ
アドレス欄(図2)に入れられる。ポインタ「ptr_
part」は、構造体「widget」のアドレス、す
なわちアドレス「1000」を指示するように割り当て
られており、ポインタ「ptr_part」についての
ポインタエントリ240のポインタ内容欄(図2)に入
れられる。
part」にはアドレス「2048」がメモリ割付され
ており、ポインタ「ptr_part」についてのポイ
ンタ検査表200のポインタエントリ230のポインタ
アドレス欄(図2)に入れられる。ポインタ「ptr_
part」は、構造体「widget」のアドレス、す
なわちアドレス「1000」を指示するように割り当て
られており、ポインタ「ptr_part」についての
ポインタエントリ240のポインタ内容欄(図2)に入
れられる。
【0064】ポインタ「ptr_part」は、構造体
「widget」内のどの位置、すなわち範囲1000
から1011までの領域内のどのアドレスを指示する割
当も有効であるので、この情報は有効メモリ境界エント
リ250a、250b内に入れられる。
「widget」内のどの位置、すなわち範囲1000
から1011までの領域内のどのアドレスを指示する割
当も有効であるので、この情報は有効メモリ境界エント
リ250a、250b内に入れられる。
【0065】ポインタ検査表200内の状態エントリ2
60は、ポインタ「ptr_part」が「境界あり」
(BOUNDED)とマーク付けした領域を指示するこ
とを表すように更新されることが好ましく、下でさらに
述べるような方法で更新されることが好ましい。ファイ
ル/ライン番号エントリ270は、ポインタ「ptr_
part」がライン60において原始コードファイル
「テストファイル」によって前回更新されたことを表す
ように更新されることが好ましい。
60は、ポインタ「ptr_part」が「境界あり」
(BOUNDED)とマーク付けした領域を指示するこ
とを表すように更新されることが好ましく、下でさらに
述べるような方法で更新されることが好ましい。ファイ
ル/ライン番号エントリ270は、ポインタ「ptr_
part」がライン60において原始コードファイル
「テストファイル」によって前回更新されたことを表す
ように更新されることが好ましい。
【0066】図3に示す原始コードファイル「テストフ
ァイル」のライン70およびライン80の実行中、2個
の変数、すなわち整数変数「testint」および文
字変数「testchar」がそれぞれ宣言される。ポ
インタ「ptr_testint」がライン90におい
て宣言され、整数変数「testint」を指示するよ
うに割当を受ける。ポインタ「ptr_testcha
r」がライン100において宣言され、文字変数「te
stchar」を指示するように割当を受ける。
ァイル」のライン70およびライン80の実行中、2個
の変数、すなわち整数変数「testint」および文
字変数「testchar」がそれぞれ宣言される。ポ
インタ「ptr_testint」がライン90におい
て宣言され、整数変数「testint」を指示するよ
うに割当を受ける。ポインタ「ptr_testcha
r」がライン100において宣言され、文字変数「te
stchar」を指示するように割当を受ける。
【0067】ライン90およびライン100におけるポ
インタ割当によって、ポインタ「ptr_testin
t」およびポインタ「ptr_testchar」につ
いてのポインタ情報がポインタ検査表200内に入れら
れる。ライン70からライン100までの実行の結果と
して得られるメモリ割付を図5に示す。
インタ割当によって、ポインタ「ptr_testin
t」およびポインタ「ptr_testchar」につ
いてのポインタ情報がポインタ検査表200内に入れら
れる。ライン70からライン100までの実行の結果と
して得られるメモリ割付を図5に示す。
【0068】図5から判るように、ポインタ「ptr_
testint」にはアドレス「2086」がメモリ割
付されており、ポインタ「ptr_testchar」
にはアドレス「2090」がメモリ割付されている。こ
の情報は、各ポインタ、すなわちポインタ「ptr_t
estint」およびポインタ「ptr_testch
ar」、についてのポインタ検査表200のポインタエ
ントリ230のポインタアドレス欄(図2)に入れられ
る。
testint」にはアドレス「2086」がメモリ割
付されており、ポインタ「ptr_testchar」
にはアドレス「2090」がメモリ割付されている。こ
の情報は、各ポインタ、すなわちポインタ「ptr_t
estint」およびポインタ「ptr_testch
ar」、についてのポインタ検査表200のポインタエ
ントリ230のポインタアドレス欄(図2)に入れられ
る。
【0069】ポインタ「ptr_testint」は、
整数変数「testint」のアドレス、すなわちアド
レス「1500」を指示するように割り当てられてお
り、ポインタ「ptr_testchar」は、文字変
数「testchar」のアドレス、すなわちアドレス
「1502」を指示するように割り当てられている。こ
の情報は、各ポインタ、すなわちポインタ「ptr_t
estint」およびポインタ「ptr_testch
ar」、についてのポインタ検査表200のポインタエ
ントリ240のポインタ内容欄(図2)に入れられる。
整数変数「testint」のアドレス、すなわちアド
レス「1500」を指示するように割り当てられてお
り、ポインタ「ptr_testchar」は、文字変
数「testchar」のアドレス、すなわちアドレス
「1502」を指示するように割り当てられている。こ
の情報は、各ポインタ、すなわちポインタ「ptr_t
estint」およびポインタ「ptr_testch
ar」、についてのポインタ検査表200のポインタエ
ントリ240のポインタ内容欄(図2)に入れられる。
【0070】ポインタ「ptr_testint」は、
2バイトの整数変数「testint」だけ、すなわち
欄1500から1501までの領域内だけを指示する指
示するので、この情報は、ポインタ「ptr_test
int」についての有効メモリ境界エントリ250a、
250b内に入れられる。
2バイトの整数変数「testint」だけ、すなわち
欄1500から1501までの領域内だけを指示する指
示するので、この情報は、ポインタ「ptr_test
int」についての有効メモリ境界エントリ250a、
250b内に入れられる。
【0071】同様に、ポインタ「ptr_testch
ar」は、1バイトの文字変数「testchar」だ
け、すなわち1バイトアドレス1502だけを指示す
る。したがって、この情報は、ポインタ「ptr_te
stchar」についてのポインタ検査表200内の有
効メモリ境界エントリ250a、250b内に入れられ
る。
ar」は、1バイトの文字変数「testchar」だ
け、すなわち1バイトアドレス1502だけを指示す
る。したがって、この情報は、ポインタ「ptr_te
stchar」についてのポインタ検査表200内の有
効メモリ境界エントリ250a、250b内に入れられ
る。
【0072】ポインタ「ptr_testint」およ
びポインタ「ptr_testchar」についてのポ
インタ検査表200内の状態エントリ260は、それぞ
れのポインタが「境界あり」の領域を指示することを表
すように更新されることが好ましく、下でさらに述べる
ような方法で更新されることが好ましい。ファイル/ラ
イン番号エントリ270は、これらのポインタがライン
90およびライン100において原始コード「テストフ
ァイル」によって前回更新されたことを表すようにそれ
ぞれ更新されることが好ましい。
びポインタ「ptr_testchar」についてのポ
インタ検査表200内の状態エントリ260は、それぞ
れのポインタが「境界あり」の領域を指示することを表
すように更新されることが好ましく、下でさらに述べる
ような方法で更新されることが好ましい。ファイル/ラ
イン番号エントリ270は、これらのポインタがライン
90およびライン100において原始コード「テストフ
ァイル」によって前回更新されたことを表すようにそれ
ぞれ更新されることが好ましい。
【0073】コンパイルされたライブラリ関数「mal
loc」を用いて35バイトのメモリの割付を行い、割
付を受けたメモリの始点アドレスの値を、宣言されたポ
インタ「ptr_alloc」に返す、原始コードファ
イル「テストファイル」のライン200からライン21
0までの実行と、結果として得られるメモリ割付(図6
に示す)とについて、下の「コンパイルされた目的コー
ドのエラー検査」と題する項目において説明する。
loc」を用いて35バイトのメモリの割付を行い、割
付を受けたメモリの始点アドレスの値を、宣言されたポ
インタ「ptr_alloc」に返す、原始コードファ
イル「テストファイル」のライン200からライン21
0までの実行と、結果として得られるメモリ割付(図6
に示す)とについて、下の「コンパイルされた目的コー
ドのエラー検査」と題する項目において説明する。
【0074】図3に示す原始コードファイル「テストフ
ァイル」のライン300の実行中、ポインタ「ptr_
testchar」(前に述べたようにライン100に
おいて前に値を割り当てられている)が、構造体「wi
dget」の構成部分(メンバ)を指示するように指示
について再割当される。したがって、ポインタ「ptr
_testchar」についてのポインタ検査表200
における情報については、指示割当に連関する新しいポ
インタ情報に更新する必要がある。
ァイル」のライン300の実行中、ポインタ「ptr_
testchar」(前に述べたようにライン100に
おいて前に値を割り当てられている)が、構造体「wi
dget」の構成部分(メンバ)を指示するように指示
について再割当される。したがって、ポインタ「ptr
_testchar」についてのポインタ検査表200
における情報については、指示割当に連関する新しいポ
インタ情報に更新する必要がある。
【0075】すなわち、ライン300の実行に続いて、
ポインタ「ptr_testchar」についての「ポ
インタの内容」エントリ240を、ポインタが今、構造
体構成部分(構造体メンバ)「widget.nam
e」 、つまり「1002」を指示することを表すよう
に更新する必要がある。
ポインタ「ptr_testchar」についての「ポ
インタの内容」エントリ240を、ポインタが今、構造
体構成部分(構造体メンバ)「widget.nam
e」 、つまり「1002」を指示することを表すよう
に更新する必要がある。
【0076】なお、もしポインタ構成部分(ポインタメ
ンバ)を含む第1の構造体が第2の構造体にコピーされ
る場合、第1の構造体におけるポインタメンバについて
のポインタ検査表200内に記録されているポインタ情
報を、第2の構造体におけるポインタメンバについての
エントリ内に適切に入れる必要がある。
ンバ)を含む第1の構造体が第2の構造体にコピーされ
る場合、第1の構造体におけるポインタメンバについて
のポインタ検査表200内に記録されているポインタ情
報を、第2の構造体におけるポインタメンバについての
エントリ内に適切に入れる必要がある。
【0077】本発明の一特徴によれば、ポインタ値の有
効性を確実にするために、上に述べたポインタ検査表2
00が、ポインタが関連解除される都度、すなわちその
ポインタによって指示されるメモリがアクセスされる都
度、利用される。例えば、図3に示す原始コードファイ
ル「テストファイル」のライン310の実行後すぐに、
ポインタ「ptr_testint」によって指示され
るアドレスに定数12024が書き込まれるようにポイ
ンタ「ptr_testint」が関連解除される。
効性を確実にするために、上に述べたポインタ検査表2
00が、ポインタが関連解除される都度、すなわちその
ポインタによって指示されるメモリがアクセスされる都
度、利用される。例えば、図3に示す原始コードファイ
ル「テストファイル」のライン310の実行後すぐに、
ポインタ「ptr_testint」によって指示され
るアドレスに定数12024が書き込まれるようにポイ
ンタ「ptr_testint」が関連解除される。
【0078】下でさらに述べるように、ポインタ「pt
r_testint」によって指示されるメモリ位置が
アクセスされる直前に、ポインタ「ptr_testi
nt」が有効なメモリ位置、すなわちポインタ「ptr
_testint」についての有効なメモリ境界エント
リ250a、250bに記録されているような有効なメ
モリ境界1500から1501までの範囲内、を指示し
ていることを確実にするために、ポインタ内容の有効性
を検査する。メモリアクセスエラー検出システムが、
r_testint」によって指示されるメモリ位置が
アクセスされる直前に、ポインタ「ptr_testi
nt」が有効なメモリ位置、すなわちポインタ「ptr
_testint」についての有効なメモリ境界エント
リ250a、250bに記録されているような有効なメ
モリ境界1500から1501までの範囲内、を指示し
ていることを確実にするために、ポインタ内容の有効性
を検査する。メモリアクセスエラー検出システムが、
【0079】本発明の好ましい一実施例において、静的
ポインタについての情報を記録する表と自動ポインタに
ついての情報を記録する表との2個の別個のポインタ検
査表200が維持される。自動ポインタは、自動ポイン
タが定義される特定関数の範囲内でだけ既知であるの
で、連関するポインタ情報を別個の表に記録する方が、
より効率的である。したがって、自動ポインタ検査表2
00は、各関数の実行後、再初期化される。
ポインタについての情報を記録する表と自動ポインタに
ついての情報を記録する表との2個の別個のポインタ検
査表200が維持される。自動ポインタは、自動ポイン
タが定義される特定関数の範囲内でだけ既知であるの
で、連関するポインタ情報を別個の表に記録する方が、
より効率的である。したがって、自動ポインタ検査表2
00は、各関数の実行後、再初期化される。
【0080】ポインタ検査表200には、2種類のポイ
ンタ、すなわち静的データを指示するように初期化され
る静的ポインタと主関数へ送られる「argv」ポイン
タ引数とについてのポインタ情報をプリロードする(先
に入れる)ことが好ましい。これらの原始コードファイ
ルラインの実行は通常、下に述べるポインタ検査表更新
のメカニズムに関連しないので、これらの情報について
は、内部疑似コードの実行に先立ってポインタ検査表2
00内に自動的にプリロードすることが好ましい。
ンタ、すなわち静的データを指示するように初期化され
る静的ポインタと主関数へ送られる「argv」ポイン
タ引数とについてのポインタ情報をプリロードする(先
に入れる)ことが好ましい。これらの原始コードファイ
ルラインの実行は通常、下に述べるポインタ検査表更新
のメカニズムに関連しないので、これらの情報について
は、内部疑似コードの実行に先立ってポインタ検査表2
00内に自動的にプリロードすることが好ましい。
【0081】[読み出し時エラー検査動作]メモリアク
セスエラー検出コード挿入器25がパーズ木の各ライン
について読み出しを行って、図7の流れ図に示す「読み
出し時エラー検査プロセス」を起動実現させる。「読み
出し時エラー検査プロセス」は、ある種のエラー検査コ
マンドと追加情報とをパーズ木に挿入するある種の読み
出し時エラー検査タスクを行うために、パーズ木の各ラ
イン、またはノード、を評価する。
セスエラー検出コード挿入器25がパーズ木の各ライン
について読み出しを行って、図7の流れ図に示す「読み
出し時エラー検査プロセス」を起動実現させる。「読み
出し時エラー検査プロセス」は、ある種のエラー検査コ
マンドと追加情報とをパーズ木に挿入するある種の読み
出し時エラー検査タスクを行うために、パーズ木の各ラ
イン、またはノード、を評価する。
【0082】この、メモリアクセスエラー検出コード挿
入器25によって実現される「読み出し時エラー検査プ
ロセス」は本来、図13から図22までを参照して下に
説明するような、実行時において行われる実際のエラー
検出プロセス、を起動し実行させる役をする前段階タス
クを行う。
入器25によって実現される「読み出し時エラー検査プ
ロセス」は本来、図13から図22までを参照して下に
説明するような、実行時において行われる実際のエラー
検出プロセス、を起動し実行させる役をする前段階タス
クを行う。
【0083】「読み出し時エラー検査プロセス」は、図
7に示すように、もし評価中のコードラインについて実
行すべきエラー検査サブルーチンがあれば、そのうちの
どのエラー検査サブルーチンを実行すべきかを定める。
概略的には、プロセスについてのプログラム実行手順
(以下簡単に、手順)は、パーズ木の各ラインが読み出
されるステップ300において「読み出し時エラー検査
プロセス」に入り、その後、もしステップ310の条件
が満足される場合、「読み出し時配列次元検査サブルー
チン」(図8を参照して下に述べる)が実行される。
7に示すように、もし評価中のコードラインについて実
行すべきエラー検査サブルーチンがあれば、そのうちの
どのエラー検査サブルーチンを実行すべきかを定める。
概略的には、プロセスについてのプログラム実行手順
(以下簡単に、手順)は、パーズ木の各ラインが読み出
されるステップ300において「読み出し時エラー検査
プロセス」に入り、その後、もしステップ310の条件
が満足される場合、「読み出し時配列次元検査サブルー
チン」(図8を参照して下に述べる)が実行される。
【0084】同様に、もしステップ320の条件が満足
される場合、「読み出し時ポインタ検査表更新サブルー
チン」(図9および図10を参照して下に述べる)が実
行される。またもしステップ330の条件が満足される
場合、「読み出し時ポインタ検査サブルーチン」(図1
1を参照して下に述べる)が実行される。最後に、もし
ステップ335の条件が満足される場合、ステップ33
7の間に、適切なフラグ(下に述べる)がセットされ
る。
される場合、「読み出し時ポインタ検査表更新サブルー
チン」(図9および図10を参照して下に述べる)が実
行される。またもしステップ330の条件が満足される
場合、「読み出し時ポインタ検査サブルーチン」(図1
1を参照して下に述べる)が実行される。最後に、もし
ステップ335の条件が満足される場合、ステップ33
7の間に、適切なフラグ(下に述べる)がセットされ
る。
【0085】これに加えて、メモリアクセスエラー検出
コード挿入器25がパーズ木のラインのすべてを読み出
して解析したことがステップ340において検出される
と、「読み出し時エラー検査プロセス」は、ステップ3
50およびステップ360においてデータ流れ解析(下
でさらに説明する)を行う。これによって、実行時にお
いて行う必要のあるポインタ検査の数が削減され、読み
出し時エラーの検出が可能となる。
コード挿入器25がパーズ木のラインのすべてを読み出
して解析したことがステップ340において検出される
と、「読み出し時エラー検査プロセス」は、ステップ3
50およびステップ360においてデータ流れ解析(下
でさらに説明する)を行う。これによって、実行時にお
いて行う必要のあるポインタ検査の数が削減され、読み
出し時エラーの検出が可能となる。
【0086】もし「読み出し時エラー検査プロセス」に
よって評価中の原始コードファイルのラインが、宣言さ
れた配列に対する参照を含むことがステップ310(図
7)において検出された場合、手順はステップ410
(図8)において図8に示す「読み出し時配列次元検査
サブルーチン」に入り、同サブルーチンが開始される。
よって評価中の原始コードファイルのラインが、宣言さ
れた配列に対する参照を含むことがステップ310(図
7)において検出された場合、手順はステップ410
(図8)において図8に示す「読み出し時配列次元検査
サブルーチン」に入り、同サブルーチンが開始される。
【0087】「読み出し時配列次元検査サブルーチン」
は、不正な添字(指標)、すなわち負の添字または宣言
された配列サイズを超過する添字が配列を参照するため
に用いられているかどうかを判定する。多くのプログラ
ミング言語において、多次元配列のうちの1つの次元の
範囲を超過しながらなお配列の全範囲内に収まることは
可能なので、各次元についてその適切な境界が維持され
ているかどうかの検査が行われる。
は、不正な添字(指標)、すなわち負の添字または宣言
された配列サイズを超過する添字が配列を参照するため
に用いられているかどうかを判定する。多くのプログラ
ミング言語において、多次元配列のうちの1つの次元の
範囲を超過しながらなお配列の全範囲内に収まることは
可能なので、各次元についてその適切な境界が維持され
ているかどうかの検査が行われる。
【0088】なお、最大有効配列添字は一般に、その次
元についての宣言された配列サイズよりも小さい。その
理由は、多くのプログラミング言語について、配列の最
初の有効添字が「0」であって「1」ではないからであ
る。
元についての宣言された配列サイズよりも小さい。その
理由は、多くのプログラミング言語について、配列の最
初の有効添字が「0」であって「1」ではないからであ
る。
【0089】図8の「読み出し時配列次元検査サブルー
チン(または簡単に、配列次元検査サブルーチン)」
は、ステップ410において、内部記号表75から配列
の各次元についての、宣言されたサイズの最大値(最大
宣言サイズ)を取得する。もし添字参照が可変の場合、
添字参照の値は読み出し時においては判らず、実行時に
おいて参照が評価されるまでは評価できない。このた
め、配列のある次元についての添字参照が定数かまたは
変数かを定める検査がステップ420においてまず行わ
れる。
チン(または簡単に、配列次元検査サブルーチン)」
は、ステップ410において、内部記号表75から配列
の各次元についての、宣言されたサイズの最大値(最大
宣言サイズ)を取得する。もし添字参照が可変の場合、
添字参照の値は読み出し時においては判らず、実行時に
おいて参照が評価されるまでは評価できない。このた
め、配列のある次元についての添字参照が定数かまたは
変数かを定める検査がステップ420においてまず行わ
れる。
【0090】もしステップ420において、添字参照が
定数であると判断された場合、ステップ430におい
て、コードのラインに現れる定数値がこの次元について
の最大値と比較される。もしステップ430において、
定数参照がこの次元についての最大宣言値を超える値か
または負の値である場合、ステップ435においてエラ
ーメッセージが生成され、ステップ440において、手
順はプロセスから出て、プロセスが終了する。
定数であると判断された場合、ステップ430におい
て、コードのラインに現れる定数値がこの次元について
の最大値と比較される。もしステップ430において、
定数参照がこの次元についての最大宣言値を超える値か
または負の値である場合、ステップ435においてエラ
ーメッセージが生成され、ステップ440において、手
順はプロセスから出て、プロセスが終了する。
【0091】もしステップ430において、定数参照が
有効であると判断された場合、手順はステップ450に
進みここで、この配列に検査すべき他の次元があるかど
うか、すなわちこの配列が多次元かどうかが判定され
る。
有効であると判断された場合、手順はステップ450に
進みここで、この配列に検査すべき他の次元があるかど
うか、すなわちこの配列が多次元かどうかが判定され
る。
【0092】もしステップ450において、検査すべき
他の次元があると判断された場合、手順はステップ42
0に戻り、上に述べた方法で他の残りの次元についての
検査が行われる。もしステップ450において、検査す
べき他の次元が残っていないと判断された場合、手順は
ステップ320(図7)において「読み出し時エラー検
査プロセス」に戻る。
他の次元があると判断された場合、手順はステップ42
0に戻り、上に述べた方法で他の残りの次元についての
検査が行われる。もしステップ450において、検査す
べき他の次元が残っていないと判断された場合、手順は
ステップ320(図7)において「読み出し時エラー検
査プロセス」に戻る。
【0093】もしステップ420(図8)において、添
字参照が可変であると判断された場合、ステップ410
において内部記号表75から検索により取り出されたそ
れぞれの次元についての許容最大サイズとともに、「d
imchk」コマンドノードをステップ425において
パーズ木に挿入することが好ましい。「dimchk」
コマンドノードは、次元参照が配列のこの次元について
の有効な領域範囲内にあるかどうかを定めるための評価
が実行時において行われる。
字参照が可変であると判断された場合、ステップ410
において内部記号表75から検索により取り出されたそ
れぞれの次元についての許容最大サイズとともに、「d
imchk」コマンドノードをステップ425において
パーズ木に挿入することが好ましい。「dimchk」
コマンドノードは、次元参照が配列のこの次元について
の有効な領域範囲内にあるかどうかを定めるための評価
が実行時において行われる。
【0094】「dimchk」コマンドノードがパーズ
木に挿入されてしまうと、手順はステップ450に進み
ここで、この配列に検査すべき他の次元があるかどうか
が上に述べた方法で判断され定められる。配列の次元が
すべて検査されてしまうと、手順はステップ320(図
7)において「読み出し時エラー検査プロセス」に戻
る。
木に挿入されてしまうと、手順はステップ450に進み
ここで、この配列に検査すべき他の次元があるかどうか
が上に述べた方法で判断され定められる。配列の次元が
すべて検査されてしまうと、手順はステップ320(図
7)において「読み出し時エラー検査プロセス」に戻
る。
【0095】もし「読み出し時エラー検査プロセス」に
よって評価中の原始コードファイルのラインが、ポイン
タに値を割り当てることがステップ320(図7)にお
いて検出された場合、手順はステップ505(図9)に
おいて図9および図10に示す「読み出し時ポインタ検
査表更新サブルーチン」に入り、同サブルーチンが開始
される。
よって評価中の原始コードファイルのラインが、ポイン
タに値を割り当てることがステップ320(図7)にお
いて検出された場合、手順はステップ505(図9)に
おいて図9および図10に示す「読み出し時ポインタ検
査表更新サブルーチン」に入り、同サブルーチンが開始
される。
【0096】ポインタ検査表200がそれぞれのポイン
タについての新しい情報によって実行時において適切に
更新されるように、ポインタに値が割り当てられる都
度、「読み出し時ポインタ検査表更新サブルーチン」
が、必要なコマンドおよび情報をパーズ木に挿入する。
タについての新しい情報によって実行時において適切に
更新されるように、ポインタに値が割り当てられる都
度、「読み出し時ポインタ検査表更新サブルーチン」
が、必要なコマンドおよび情報をパーズ木に挿入する。
【0097】「読み出し時ポインタ検査表更新サブルー
チン」が開始されると、ステップ505において、「t
blupd」コマンドノードがパーズ木に挿入される。
「tblupd」コマンドノードは、実行時において評
価されると、ポインタ検査表200の更新を開始する。
実行時におけるポインタ検査表更新を行うために、読み
出し時において取得できる追加情報、すなわち、ポイン
タに割り当てられるポインタ式の型の特性が、「tbl
upd」コマンドノードに入れられる。
チン」が開始されると、ステップ505において、「t
blupd」コマンドノードがパーズ木に挿入される。
「tblupd」コマンドノードは、実行時において評
価されると、ポインタ検査表200の更新を開始する。
実行時におけるポインタ検査表更新を行うために、読み
出し時において取得できる追加情報、すなわち、ポイン
タに割り当てられるポインタ式の型の特性が、「tbl
upd」コマンドノードに入れられる。
【0098】そして、ポインタに割り当てられるポイン
タ式が、ステップ510において解析され、ステップ5
15からステップ560(図10)までにおいて、型の
マッチングが得られるまで、いくつもの条件に対して検
査される。
タ式が、ステップ510において解析され、ステップ5
15からステップ560(図10)までにおいて、型の
マッチングが得られるまで、いくつもの条件に対して検
査される。
【0099】ステップ515において、ポインタが、識
別特定された変数または関数のアドレスを割り当てられ
ているかどうかを定める検査が行われる。もしステップ
515において、ポインタが、識別特定された変数また
は関数のアドレスを割り当てられていると判断された場
合、ステップ518において、特定された変数または関
数についての内部記号表75内の適切なエントリを指示
するポインタが、「tblupd」コマンドノードに入
れられる。
別特定された変数または関数のアドレスを割り当てられ
ているかどうかを定める検査が行われる。もしステップ
515において、ポインタが、識別特定された変数また
は関数のアドレスを割り当てられていると判断された場
合、ステップ518において、特定された変数または関
数についての内部記号表75内の適切なエントリを指示
するポインタが、「tblupd」コマンドノードに入
れられる。
【0100】実行時において、内部記号表75内のこの
エントリが、必要なポインタ情報を得るためにアクセス
される。その後、手順はステップ330(図7)におい
て「読み出し時エラー検査プロセス」に戻る。
エントリが、必要なポインタ情報を得るためにアクセス
される。その後、手順はステップ330(図7)におい
て「読み出し時エラー検査プロセス」に戻る。
【0101】もしステップ515において、ポインタ
が、識別特定された変数または関数のアドレスを割り当
てられていないと判断された場合には、手順はステップ
520に進む。
が、識別特定された変数または関数のアドレスを割り当
てられていないと判断された場合には、手順はステップ
520に進む。
【0102】ステップ520において、ポインタが、第
2のポインタの内容を割り当てられているかどうかを定
める検査が行われる。もしステップ520において、ポ
インタが、第2のポインタの内容を割り当てられている
と判断された場合、手順はステップ522に進む。この
場合、実行時において第2のポインタが何を指示する
か、および第2のポインタの有効な領域の範囲はどこか
を読み出し時において判断することは不可能である。
2のポインタの内容を割り当てられているかどうかを定
める検査が行われる。もしステップ520において、ポ
インタが、第2のポインタの内容を割り当てられている
と判断された場合、手順はステップ522に進む。この
場合、実行時において第2のポインタが何を指示する
か、および第2のポインタの有効な領域の範囲はどこか
を読み出し時において判断することは不可能である。
【0103】しかし、実行時において、第2のポインタ
のアドレスはインタプリタスタック60の最上部に位置
する。したがって、ステップ522において、「rea
dintstk」コマンドが「tblupd」ノード内
に入れられる。「readintstk」コマンドは、
実行時において評価されると、第2のポインタのアドレ
スを、さらに処理するために、インタプリタスタック6
0から検索により取り出させる。その後、手順はステッ
プ330(図7)において「読み出し時エラー検査プロ
セス」に戻る。
のアドレスはインタプリタスタック60の最上部に位置
する。したがって、ステップ522において、「rea
dintstk」コマンドが「tblupd」ノード内
に入れられる。「readintstk」コマンドは、
実行時において評価されると、第2のポインタのアドレ
スを、さらに処理するために、インタプリタスタック6
0から検索により取り出させる。その後、手順はステッ
プ330(図7)において「読み出し時エラー検査プロ
セス」に戻る。
【0104】もしステップ520(図9)において、ポ
インタが、第2のポインタの内容を割り当てられていな
いと判断された場合、手順はステップ525に進む。
インタが、第2のポインタの内容を割り当てられていな
いと判断された場合、手順はステップ525に進む。
【0105】ステップ525において、ポインタが、記
号列(ストリング)を割り当てられているかどうかを定
める検査が行われる。もしステップ525において、ポ
インタが、ストリングを割り当てられていると判断され
た場合、割当を受けようとするポインタについてポイン
タ検査表200の適切な横列に配置する必要のある情
報、すなわちストリングのアドレスおよびサイズ、は読
み出し時において既知である。
号列(ストリング)を割り当てられているかどうかを定
める検査が行われる。もしステップ525において、ポ
インタが、ストリングを割り当てられていると判断され
た場合、割当を受けようとするポインタについてポイン
タ検査表200の適切な横列に配置する必要のある情
報、すなわちストリングのアドレスおよびサイズ、は読
み出し時において既知である。
【0106】そして、ステップ527において、ストリ
ングのアドレスおよびサイズが「tblupd」コマン
ドノード内に入れられる。その後、手順はステップ33
0(図7)において「読み出し時エラー検査プロセス」
に戻る。
ングのアドレスおよびサイズが「tblupd」コマン
ドノード内に入れられる。その後、手順はステップ33
0(図7)において「読み出し時エラー検査プロセス」
に戻る。
【0107】もしステップ525(図9)において、ポ
インタが、ストリングを割り当てられていないと判断さ
れた場合、手順はステップ530に進む。
インタが、ストリングを割り当てられていないと判断さ
れた場合、手順はステップ530に進む。
【0108】ステップ530において、ポインタが、不
正値を割り当てられているかどうかを定める検査が行わ
れる。もしステップ530において、ポインタが、不正
値、すなわち定常的なゼロ、または負の値、を割り当て
られていると判断された場合、ステップ532におい
て、「不正」状態の表示が「tblupd」ノード内に
入れられる。ポインタは不正値を記憶することが許容さ
れるので、エラーメッセージはここでは生成されない。
正値を割り当てられているかどうかを定める検査が行わ
れる。もしステップ530において、ポインタが、不正
値、すなわち定常的なゼロ、または負の値、を割り当て
られていると判断された場合、ステップ532におい
て、「不正」状態の表示が「tblupd」ノード内に
入れられる。ポインタは不正値を記憶することが許容さ
れるので、エラーメッセージはここでは生成されない。
【0109】しかし下でさらに述べるように、もしポイ
ンタが実行時において参照を除去され、しかもなお不正
値を有する場合には、その時点においてエラーメッセー
ジが生成される。ステップ532の実行に続いて、手順
はステップ330(図7)において「読み出し時エラー
検査プロセス」に戻る。
ンタが実行時において参照を除去され、しかもなお不正
値を有する場合には、その時点においてエラーメッセー
ジが生成される。ステップ532の実行に続いて、手順
はステップ330(図7)において「読み出し時エラー
検査プロセス」に戻る。
【0110】もしステップ530(図9)において、ポ
インタが、不正値を割り当てられていないと判断された
場合、手順はステップ535に進む。
インタが、不正値を割り当てられていないと判断された
場合、手順はステップ535に進む。
【0111】ステップ535において、ポインタが、構
造体メンバのアドレスを割り当てられているかどうかを
定める検査が行われる。もしステップ535において、
ポインタが、構造体メンバのアドレスを割り当てられて
いると判断された場合、構造体メンバのサイズは読み出
し時において既知である。しかし、構造体メンバのアド
レスは、実行時になるまで不明のままであり、実行時に
おいて構造体メンバのアドレスは、インタプリタスタッ
ク60の最上部に位置する。
造体メンバのアドレスを割り当てられているかどうかを
定める検査が行われる。もしステップ535において、
ポインタが、構造体メンバのアドレスを割り当てられて
いると判断された場合、構造体メンバのサイズは読み出
し時において既知である。しかし、構造体メンバのアド
レスは、実行時になるまで不明のままであり、実行時に
おいて構造体メンバのアドレスは、インタプリタスタッ
ク60の最上部に位置する。
【0112】そして、ステップ537において、構造体
メンバのサイズおよび「readintstk」コマン
ドが「tblupd」ノード内に入れられる。「rea
dintstk」コマンドが実行時において評価される
と、構造体メンバのアドレスがインタプリタスタック6
0から検索により取り出される。ステップ537の実行
に続いて、手順はステップ330(図7)において「読
み出し時エラー検査プロセス」に戻る。
メンバのサイズおよび「readintstk」コマン
ドが「tblupd」ノード内に入れられる。「rea
dintstk」コマンドが実行時において評価される
と、構造体メンバのアドレスがインタプリタスタック6
0から検索により取り出される。ステップ537の実行
に続いて、手順はステップ330(図7)において「読
み出し時エラー検査プロセス」に戻る。
【0113】もしステップ535(図9)において、ポ
インタが、構造体メンバのアドレスを割り当てられてい
ないと判断された場合、手順はステップ540(図1
0)に進む。
インタが、構造体メンバのアドレスを割り当てられてい
ないと判断された場合、手順はステップ540(図1
0)に進む。
【0114】ステップ540においてポインタが、複合
式、例えばp=*(test?exp1:exp2)に
よって割り当てられているかどうかを定める検査が行わ
れる。ここに、exp1およびexp2はポインタのア
ドレスを評価するポインタ式である。この特殊検査条件
は、「if,then,else」ルーチン実現用のこ
の普通のプログラミング手法についてエラー検査を行う
ために実現される。
式、例えばp=*(test?exp1:exp2)に
よって割り当てられているかどうかを定める検査が行わ
れる。ここに、exp1およびexp2はポインタのア
ドレスを評価するポインタ式である。この特殊検査条件
は、「if,then,else」ルーチン実現用のこ
の普通のプログラミング手法についてエラー検査を行う
ために実現される。
【0115】間接演算子「*」は、検査条件が真かまた
は偽りかに依ってexp1またはexp2のいずれかに
ついて行われるので、これら2式のうちのどちらが新し
いポインタの特性を定めるかについては、読み出し時に
おいては未知である。
は偽りかに依ってexp1またはexp2のいずれかに
ついて行われるので、これら2式のうちのどちらが新し
いポインタの特性を定めるかについては、読み出し時に
おいては未知である。
【0116】本発明の好ましい一実施例において、「s
avptr」コマンドのような命令が、2個の命令スト
リームの各々に入れられる。実行時において実行される
のは、これら2個のうちの1個だけである。「savp
tr」コマンドは、実行された命令に連関するポインタ
についてのポインタ情報をポインタ保存スタック65に
入れるように評価器35に命令する。このポインタ情報
は、次に評価器35からアクセスされる。
avptr」コマンドのような命令が、2個の命令スト
リームの各々に入れられる。実行時において実行される
のは、これら2個のうちの1個だけである。「savp
tr」コマンドは、実行された命令に連関するポインタ
についてのポインタ情報をポインタ保存スタック65に
入れるように評価器35に命令する。このポインタ情報
は、次に評価器35からアクセスされる。
【0117】ポインタ保存スタック65から検索により
取り出されたポインタ情報は、ポインタ検査表200に
入れるため、実行時において評価器35によって、下に
さらに述べる方法で検索により取り出すことができる。
取り出されたポインタ情報は、ポインタ検査表200に
入れるため、実行時において評価器35によって、下に
さらに述べる方法で検索により取り出すことができる。
【0118】そして、もしステップ540において、ポ
インタが形式「*(test?exp1:exp2)」
の条件式によって割り当てられていると判断された場合
には、ステップ542において、「savptr」コマ
ンドが生成され、2個の式exp1およびexp2に連
関する命令ストリームの各々に入れられる。
インタが形式「*(test?exp1:exp2)」
の条件式によって割り当てられていると判断された場合
には、ステップ542において、「savptr」コマ
ンドが生成され、2個の式exp1およびexp2に連
関する命令ストリームの各々に入れられる。
【0119】これに加えて、「rdptrstk」コマ
ンドのような、第2の命令が「tblupd」ノードに
入れられる。この第2の命令は、評価されると、評価器
35をしてポインタ保存スタック65の内容を検索によ
り取り出させる。ステップ542の実行に続いて、手順
はステップ330(図7)において「読み出し時エラー
検査プロセス」に戻る。
ンドのような、第2の命令が「tblupd」ノードに
入れられる。この第2の命令は、評価されると、評価器
35をしてポインタ保存スタック65の内容を検索によ
り取り出させる。ステップ542の実行に続いて、手順
はステップ330(図7)において「読み出し時エラー
検査プロセス」に戻る。
【0120】もしステップ540(図10)において、
ポインタが、このような複合式によって割り当てられて
いないと判断された場合には、手順はステップ545に
進む。
ポインタが、このような複合式によって割り当てられて
いないと判断された場合には、手順はステップ545に
進む。
【0121】ステップ545において、ポインタが、翻
訳された関数への1個以上のポインタ引数の送付後すぐ
に暗黙のうちに割り当てられるかどうかを定める検査が
行われる。プログラムが、翻訳された関数を呼び出すと
き、「呼び出し」命令文に規定されるような、呼び出さ
れた関数の引数、すなわち実引数が、宣言された関数内
のそれぞれの自動変数、すなわち形式引数に暗黙のうち
に割り当てられる。
訳された関数への1個以上のポインタ引数の送付後すぐ
に暗黙のうちに割り当てられるかどうかを定める検査が
行われる。プログラムが、翻訳された関数を呼び出すと
き、「呼び出し」命令文に規定されるような、呼び出さ
れた関数の引数、すなわち実引数が、宣言された関数内
のそれぞれの自動変数、すなわち形式引数に暗黙のうち
に割り当てられる。
【0122】関数が呼び出されると、評価器35が、呼
び出し関数についてメモリ割付を受けているハードウェ
アスタック67に、呼び出された関数の引数を押し込
む。その後、呼び出された関数のための新しいスタック
フレームが、評価器35により、スタックフレームポイ
ンタを更新することによって形成される。なお、呼び出
された関数によって用いられるスタックフレームは、呼
び出し関数のスタックフレームのアドレスとは異なるス
タックアドレスを持つことになる。
び出し関数についてメモリ割付を受けているハードウェ
アスタック67に、呼び出された関数の引数を押し込
む。その後、呼び出された関数のための新しいスタック
フレームが、評価器35により、スタックフレームポイ
ンタを更新することによって形成される。なお、呼び出
された関数によって用いられるスタックフレームは、呼
び出し関数のスタックフレームのアドレスとは異なるス
タックアドレスを持つことになる。
【0123】形式パラメータについてのポインタ検査表
200内のエントリは、その関数へ送られた実ポインタ
パラメータ、すなわちポインタ、についてのポインタ検
査表200内のエントリをコピーすることによって形成
するのが好ましい。すなわち、ポインタである送られた
実パラメータについてのポインタ検査表200からのポ
インタ情報がポインタ保存スタック65に入れられるの
が好ましい。
200内のエントリは、その関数へ送られた実ポインタ
パラメータ、すなわちポインタ、についてのポインタ検
査表200内のエントリをコピーすることによって形成
するのが好ましい。すなわち、ポインタである送られた
実パラメータについてのポインタ検査表200からのポ
インタ情報がポインタ保存スタック65に入れられるの
が好ましい。
【0124】このようにして、評価器35は、ポインタ
保存スタック65内に入れられたポインタ情報をコピー
することによって、ポインタである型パラメータについ
て実行時においてポインタ検査表200内に適切なエン
トリを形成することができる。
保存スタック65内に入れられたポインタ情報をコピー
することによって、ポインタである型パラメータについ
て実行時においてポインタ検査表200内に適切なエン
トリを形成することができる。
【0125】そして、もしステップ545において、翻
訳された関数へのポインタ引数の送付後すぐに暗黙のう
ちに割り当てられると判断される場合、手順はステップ
547に進む。ここで、各ポインタ引数についての関数
呼び出しに先立ち、「savptr」コマンドがパーズ
木の中に入れられる。
訳された関数へのポインタ引数の送付後すぐに暗黙のう
ちに割り当てられると判断される場合、手順はステップ
547に進む。ここで、各ポインタ引数についての関数
呼び出しに先立ち、「savptr」コマンドがパーズ
木の中に入れられる。
【0126】本発明の好ましい実施例において、「sa
vptr」コマンドは、送られたポインタ引数を受け取
ることになる呼び出された「翻訳された関数」を指示す
るポインタを含む。「翻訳された関数」を指示するポイ
ンタは、ポインタ保存スタック65内に入れられた情報
の有効性を確実なものにするための識別子の役をする。
これに加えて、「rdptrstk」コマンドが「tb
lupd」ノードに挿入される。
vptr」コマンドは、送られたポインタ引数を受け取
ることになる呼び出された「翻訳された関数」を指示す
るポインタを含む。「翻訳された関数」を指示するポイ
ンタは、ポインタ保存スタック65内に入れられた情報
の有効性を確実なものにするための識別子の役をする。
これに加えて、「rdptrstk」コマンドが「tb
lupd」ノードに挿入される。
【0127】「savptr」コマンドが実行時におい
て次に評価されるとき、ポインタである「送られた実パ
ラメータ」についてのポインタ情報がポインタ保存スタ
ック65に入れられる。その後、実行時における「rd
ptrstk」コマンドの評価が、評価器35をして、
ポインタ保存スタック65の内容を検索により取り出さ
せる。この内容は、ポインタ検査表200に入れられ
る。ステップ547の実行に続いて、手順はステップ3
30(図7)において「読み出し時エラー検査プロセ
ス」に戻る。
て次に評価されるとき、ポインタである「送られた実パ
ラメータ」についてのポインタ情報がポインタ保存スタ
ック65に入れられる。その後、実行時における「rd
ptrstk」コマンドの評価が、評価器35をして、
ポインタ保存スタック65の内容を検索により取り出さ
せる。この内容は、ポインタ検査表200に入れられ
る。ステップ547の実行に続いて、手順はステップ3
30(図7)において「読み出し時エラー検査プロセ
ス」に戻る。
【0128】もしステップ545において、翻訳された
関数へのポインタ引数の送付後すぐに暗黙のうちに割り
当てられることがないと判断される場合、手順はステッ
プ550に進む。
関数へのポインタ引数の送付後すぐに暗黙のうちに割り
当てられることがないと判断される場合、手順はステッ
プ550に進む。
【0129】ステップ550において、ポインタが、翻
訳された関数から返された値を割り当てられるかどうか
を定めるテストが行われる。読み出し時において関数か
ら戻されることになる値についての情報は、もしあった
としても少ししかないので、返されたポインタについて
のポインタ情報を実行時においてポインタ保存スタック
65に押し込む命令がパーズ木に入れられる。
訳された関数から返された値を割り当てられるかどうか
を定めるテストが行われる。読み出し時において関数か
ら戻されることになる値についての情報は、もしあった
としても少ししかないので、返されたポインタについて
のポインタ情報を実行時においてポインタ保存スタック
65に押し込む命令がパーズ木に入れられる。
【0130】これによって、評価器35が、返されたポ
インタに連関するポインタ情報を、ポインタ検査表20
0に入れるために実行時においてポインタ保存スタック
65から次に検索により取り出すことができる。
インタに連関するポインタ情報を、ポインタ検査表20
0に入れるために実行時においてポインタ保存スタック
65から次に検索により取り出すことができる。
【0131】そして、もしステップ550において、ポ
インタが、翻訳された関数から返された値を割り当てら
れていると判断された場合、ステップ552において、
呼び出された関数からの返呼に応答して、返されたポイ
ンタの各々について「savptr」コマンドが生成さ
れる。これに加えて、「rdptrstk」コマンド
が、「tblupd」ノードに入れられる。
インタが、翻訳された関数から返された値を割り当てら
れていると判断された場合、ステップ552において、
呼び出された関数からの返呼に応答して、返されたポイ
ンタの各々について「savptr」コマンドが生成さ
れる。これに加えて、「rdptrstk」コマンド
が、「tblupd」ノードに入れられる。
【0132】本発明の好ましい実施例において「sav
ptr」コマンドは、ポインタ情報を返すポインタであ
る「翻訳された関数」を指示するポインタを含む。この
「翻訳された関数」を指示するポインタは、ポインタ保
存スタック65内に入れられた情報の有効性を確実なも
のにするための識別子の役をする。その後、手順はステ
ップ330(図7)において「読み出し時エラー検査プ
ロセス」に戻る。
ptr」コマンドは、ポインタ情報を返すポインタであ
る「翻訳された関数」を指示するポインタを含む。この
「翻訳された関数」を指示するポインタは、ポインタ保
存スタック65内に入れられた情報の有効性を確実なも
のにするための識別子の役をする。その後、手順はステ
ップ330(図7)において「読み出し時エラー検査プ
ロセス」に戻る。
【0133】「savptr」コマンドが実行時におい
て次に評価されるとき、関数から戻されるポインタに連
関するポインタ情報がポインタ保存スタック65に入れ
られる。その後、実行時における「rdptrstk」
コマンドの評価が、評価器35をして、ポインタ保存ス
タック65の内容を検索により取り出させる。この内容
は、ポインタ検査表200に入れられる。
て次に評価されるとき、関数から戻されるポインタに連
関するポインタ情報がポインタ保存スタック65に入れ
られる。その後、実行時における「rdptrstk」
コマンドの評価が、評価器35をして、ポインタ保存ス
タック65の内容を検索により取り出させる。この内容
は、ポインタ検査表200に入れられる。
【0134】なお、関数がポインタを自動変数に返すこ
とは不適切である。したがって、この場合にはエラーが
発生する。
とは不適切である。したがって、この場合にはエラーが
発生する。
【0135】もしステップ550(図10)において、
ポインタが、翻訳された関数から戻された値を割り当て
られていないと判断された場合、手順はステップ560
に進む。
ポインタが、翻訳された関数から戻された値を割り当て
られていないと判断された場合、手順はステップ560
に進む。
【0136】もし手順がステップ560に到達した場
合、ポインタに割り当てられているポインタ式は、上に
設定されたテストのうちのどれか1つに基づく特徴付け
ができないことになる。すなわち、読み出し時において
は、割り当てられるポインタについて何も確定せず、し
たがってステップ560において、「不明」状態の表示
が「tblupd」ノードに入れられる。ステップ56
0の実行に続いて、手順は、ステップ330(図7)に
おいて「読み出し時エラー検査プロセス」に戻る。
合、ポインタに割り当てられているポインタ式は、上に
設定されたテストのうちのどれか1つに基づく特徴付け
ができないことになる。すなわち、読み出し時において
は、割り当てられるポインタについて何も確定せず、し
たがってステップ560において、「不明」状態の表示
が「tblupd」ノードに入れられる。ステップ56
0の実行に続いて、手順は、ステップ330(図7)に
おいて「読み出し時エラー検査プロセス」に戻る。
【0137】もし「読み出し時エラー検査プロセス」に
よって評価中の原始コードファイルのラインが、少なく
とも1回のポインタ関連解除を含むことがステップ33
0(図7)において検出された場合、手順は図11のス
テップ615において、図11に示す「読み出し時ポイ
ンタ検査サブルーチン」に入り、同サブルーチンが開始
される。関連解除されたポインタの有効性をテストする
ために実行時においてポインタ検査表200にアクセス
できるように、ポインタが関連解除される都度、「読み
出し時ポインタ検査サブルーチン」が、必要なポインタ
検査コマンドをパーズ木に挿入する。
よって評価中の原始コードファイルのラインが、少なく
とも1回のポインタ関連解除を含むことがステップ33
0(図7)において検出された場合、手順は図11のス
テップ615において、図11に示す「読み出し時ポイ
ンタ検査サブルーチン」に入り、同サブルーチンが開始
される。関連解除されたポインタの有効性をテストする
ために実行時においてポインタ検査表200にアクセス
できるように、ポインタが関連解除される都度、「読み
出し時ポインタ検査サブルーチン」が、必要なポインタ
検査コマンドをパーズ木に挿入する。
【0138】ステップ615において「読み出し時ポイ
ンタ検査サブルーチン」が開始されると、ステップ61
5において、関連解除されるポインタについて「ptr
chk」コマンドノードがパーズ木に挿入される。関連
解除されるポインタの値は、ポインタの値が計算された
後でメモリにアドレスするのにこの計算された値が用い
られる前にはインタプリタスタック60で最も上部にあ
る項目なので、「ptrchk」コマンドノードは、メ
モリアドレス命令の直前位置に入れられる。
ンタ検査サブルーチン」が開始されると、ステップ61
5において、関連解除されるポインタについて「ptr
chk」コマンドノードがパーズ木に挿入される。関連
解除されるポインタの値は、ポインタの値が計算された
後でメモリにアドレスするのにこの計算された値が用い
られる前にはインタプリタスタック60で最も上部にあ
る項目なので、「ptrchk」コマンドノードは、メ
モリアドレス命令の直前位置に入れられる。
【0139】「ptrchk」コマンドノードが実行時
において評価されると、図18および図19を参照して
下で説明する「実行時ポインタ検査検査サブルーチン」
が開始され、インタプリタスタック60から検索により
取り出された値が、それぞれのポインタについて、ポイ
ンタ検査表200の有効なメモリ境界エントリ250
a、250bに示されるようなそのポインタの有効領域
範囲内にあるかどうかが判断される。
において評価されると、図18および図19を参照して
下で説明する「実行時ポインタ検査検査サブルーチン」
が開始され、インタプリタスタック60から検索により
取り出された値が、それぞれのポインタについて、ポイ
ンタ検査表200の有効なメモリ境界エントリ250
a、250bに示されるようなそのポインタの有効領域
範囲内にあるかどうかが判断される。
【0140】ステップ620において、評価中のパーズ
木のラインに他のポインタ関連解除があるかどうかを定
めるテストが行われる。もしステップ620において、
評価中のパーズ木のラインに他のポインタ関連解除があ
ると判断された場合、手順はステップ615に戻り、そ
こでさらに処理が続けられる。ステップ620におい
て、評価中のパーズ木のラインにあるポインタ関連解除
のすべてが処理されたと判断された場合、手順はステッ
プ335(図7)において「読み出し時エラー検査プロ
セス」に戻る。
木のラインに他のポインタ関連解除があるかどうかを定
めるテストが行われる。もしステップ620において、
評価中のパーズ木のラインに他のポインタ関連解除があ
ると判断された場合、手順はステップ615に戻り、そ
こでさらに処理が続けられる。ステップ620におい
て、評価中のパーズ木のラインにあるポインタ関連解除
のすべてが処理されたと判断された場合、手順はステッ
プ335(図7)において「読み出し時エラー検査プロ
セス」に戻る。
【0141】ステップ335においては、「読み出し時
エラー検査プロセス」によって評価中の原始コードファ
イルのラインが関数への呼び出しを含むかどうかを判断
するテストが行われる。もしステップ335において、
評価中の原始コードファイルのラインが関数への呼び出
しを含むと判断された場合、その関数によってアクセス
されるメモリのすべてが、ステップ337において識別
特定される。すなわち大域変数のすべておよびその関数
に送られた変数のすべてである。
エラー検査プロセス」によって評価中の原始コードファ
イルのラインが関数への呼び出しを含むかどうかを判断
するテストが行われる。もしステップ335において、
評価中の原始コードファイルのラインが関数への呼び出
しを含むと判断された場合、その関数によってアクセス
されるメモリのすべてが、ステップ337において識別
特定される。すなわち大域変数のすべておよびその関数
に送られた変数のすべてである。
【0142】これに加えて、もしその関数がメモリにア
クセスを有する場合には、メモリ割付アクセスフラグ
が、コンパイルされた関数に対応する内部記号表75内
のエントリにセットされる。図21を参照して下に述べ
るように、このメモリ割付アクセスフラグをセットする
動作が、連関する関数が実行時において呼び出される都
度、「初期化ビットベクトル維持サブルーチン」を起動
させる。
クセスを有する場合には、メモリ割付アクセスフラグ
が、コンパイルされた関数に対応する内部記号表75内
のエントリにセットされる。図21を参照して下に述べ
るように、このメモリ割付アクセスフラグをセットする
動作が、連関する関数が実行時において呼び出される都
度、「初期化ビットベクトル維持サブルーチン」を起動
させる。
【0143】もしステップ335において、評価中の原
始コードファイルのラインが関数への呼び出しを含まな
いと判断された場合、手順はステップ340に進む。
始コードファイルのラインが関数への呼び出しを含まな
いと判断された場合、手順はステップ340に進む。
【0144】ステップ340においては、「呼び出し時
エラー検査プロセス」が、まだ読み出され解析される必
要のあるパーズ木の他のノードがあるかどうかを判断す
るテストを行う。もしステップ340において、まだ読
み出され解析される必要のあるパーズ木の他のノードが
あると判断された場合、手順はステップ300に戻り、
上に述べたように進む。しかし、もしステップ340に
おいて、まだ読み出され解析されるべきパーズ木の他の
ノードが残っていないと判断された場合、手順はステッ
プ350に進む。
エラー検査プロセス」が、まだ読み出され解析される必
要のあるパーズ木の他のノードがあるかどうかを判断す
るテストを行う。もしステップ340において、まだ読
み出され解析される必要のあるパーズ木の他のノードが
あると判断された場合、手順はステップ300に戻り、
上に述べたように進む。しかし、もしステップ340に
おいて、まだ読み出され解析されるべきパーズ木の他の
ノードが残っていないと判断された場合、手順はステッ
プ350に進む。
【0145】ステップ350においては、メモリアクセ
スエラー検出コード挿入器25によって、修正パーズ木
についてデータ流れ解析が行われる。修正パーズ木に
は、パーズ木に挿入されたエラー検査コマンドおよび追
加情報を含む。データ流れ解析は、パーズ木についての
重複すなわち重合するポインタ検査を削除することによ
って、実行時において行う必要のあるポインタ検査の数
を最小化し、ある読み出し時エラーを検出できるように
する。
スエラー検出コード挿入器25によって、修正パーズ木
についてデータ流れ解析が行われる。修正パーズ木に
は、パーズ木に挿入されたエラー検査コマンドおよび追
加情報を含む。データ流れ解析は、パーズ木についての
重複すなわち重合するポインタ検査を削除することによ
って、実行時において行う必要のあるポインタ検査の数
を最小化し、ある読み出し時エラーを検出できるように
する。
【0146】適切なデータ流れ解析アルゴリズムの記述
については、W・ランディおよびB・ライダー(Willia
m Landi & Barbara G. Ryder)の論文「ポインタのある
場合およびない場合のエーリアシング:問題分類学」
(Center for Computer Aids for Industrial Producti
vity, Technical Report CAIP−125、ラトガー
ズ大学、1990年9月25日)を参照されたい。
については、W・ランディおよびB・ライダー(Willia
m Landi & Barbara G. Ryder)の論文「ポインタのある
場合およびない場合のエーリアシング:問題分類学」
(Center for Computer Aids for Industrial Producti
vity, Technical Report CAIP−125、ラトガー
ズ大学、1990年9月25日)を参照されたい。
【0147】また同じく、W・ランディおよびB・ライ
ダー(William Landi & Barbara G.Ryder)の論文「手
続き間相互ポインタエーリアシングについての安全近似
アルゴリズム」(SIGPLAN Notices、1992年7月、
235〜248ページ)を参照されたい。
ダー(William Landi & Barbara G.Ryder)の論文「手
続き間相互ポインタエーリアシングについての安全近似
アルゴリズム」(SIGPLAN Notices、1992年7月、
235〜248ページ)を参照されたい。
【0148】図23に示す原始コードファイル例「サン
プル」のデータ流れ解析について下に簡単に述べる。デ
ータ流れ解析は、ポインタが新たな値を割り当てられま
たは関連解除される都度、修正パーズ木を解析し識別特
定する。なお、「tblupd」コマンドノードは前
に、ポインタ割当の各々についてパーズ木に入れられて
おり、「ptrchk」コマンドノードは前に、ポイン
タが関連解除される都度パーズ木に挿入されている。
プル」のデータ流れ解析について下に簡単に述べる。デ
ータ流れ解析は、ポインタが新たな値を割り当てられま
たは関連解除される都度、修正パーズ木を解析し識別特
定する。なお、「tblupd」コマンドノードは前
に、ポインタ割当の各々についてパーズ木に入れられて
おり、「ptrchk」コマンドノードは前に、ポイン
タが関連解除される都度パーズ木に挿入されている。
【0149】図23に示す原始コードファイル「サンプ
ル」は、構造体「widget」を指示するポインタ
「ptr_part」を宣言し、初期化する。データ流
れ解析は、評価中の原始コードファイルに現れる各ポイ
ンタについて流れセットを設定する。この流れセットは
例えば、原始コードファイル「サンプル」の実行時に形
成されたポインタ「ptr_part」について図24
に示すような、流れセットである。
ル」は、構造体「widget」を指示するポインタ
「ptr_part」を宣言し、初期化する。データ流
れ解析は、評価中の原始コードファイルに現れる各ポイ
ンタについて流れセットを設定する。この流れセットは
例えば、原始コードファイル「サンプル」の実行時に形
成されたポインタ「ptr_part」について図24
に示すような、流れセットである。
【0150】与えられたポインタに対して、その連関す
るポインタが新たな値を割り当てられる都度、新たな流
れセットが設定される。好ましい実施例においては、流
れセットは、その連関するポインタが正規の値を割り当
てられる都度「DEF」とマーク付け、すなわち定義さ
れ、その連関するポインタが不正値を割り当てられる都
度「DEF ILL」とマーク付けされる。同様に、そ
の連関するポインタが関連解除される都度、「USE
D」(使用済)とマーク付けされる。
るポインタが新たな値を割り当てられる都度、新たな流
れセットが設定される。好ましい実施例においては、流
れセットは、その連関するポインタが正規の値を割り当
てられる都度「DEF」とマーク付け、すなわち定義さ
れ、その連関するポインタが不正値を割り当てられる都
度「DEF ILL」とマーク付けされる。同様に、そ
の連関するポインタが関連解除される都度、「USE
D」(使用済)とマーク付けされる。
【0151】図23に示す原始コードファイル「サンプ
ル」のライン10からライン50までは、構造体「wi
dget」を宣言する。ライン60は構造体「widg
et」を指示するポインタ「ptr_part」を宣言
し、ライン70は構造体「widget」の始点を指示
するためにこのポインタを初期化、すなわち定義する。
ライン70のデータ流れ解析によって、図24に示すこ
のポインタ「ptr_part」についての第1の流れ
セットが「DEF」とマーク付けされる。このマーク付
けは、このポインタが「非ゼロ」値を割り当てられたこ
とを表す。
ル」のライン10からライン50までは、構造体「wi
dget」を宣言する。ライン60は構造体「widg
et」を指示するポインタ「ptr_part」を宣言
し、ライン70は構造体「widget」の始点を指示
するためにこのポインタを初期化、すなわち定義する。
ライン70のデータ流れ解析によって、図24に示すこ
のポインタ「ptr_part」についての第1の流れ
セットが「DEF」とマーク付けされる。このマーク付
けは、このポインタが「非ゼロ」値を割り当てられたこ
とを表す。
【0152】構造体「widget」の3個のメンバに
値を割り当てるために、ポインタ「ptr_part」
がライン80からライン100までの各ラインにおいて
関連解除される。そして、ライン80からライン100
までの各ラインのデータ流れ解析によって、図24にお
ける第1の流れセットが「USED」とマーク付けされ
る。このマーク付けは、このポインタが関連解除された
ことを表す。
値を割り当てるために、ポインタ「ptr_part」
がライン80からライン100までの各ラインにおいて
関連解除される。そして、ライン80からライン100
までの各ラインのデータ流れ解析によって、図24にお
ける第1の流れセットが「USED」とマーク付けされ
る。このマーク付けは、このポインタが関連解除された
ことを表す。
【0153】それからポインタ「ptr_part」が
ライン150において新たな値を割り当てられ、これに
よって、ポインタ「ptr_part」についての新た
な流れセットが設定される。そして、ライン150ので
流れ解析によって、図24に示す第2の流れセットが
「DEF ILL」とマーク付けされる。このマーク付
けは、このポインタが不正値を割り当てられたことを表
す。
ライン150において新たな値を割り当てられ、これに
よって、ポインタ「ptr_part」についての新た
な流れセットが設定される。そして、ライン150ので
流れ解析によって、図24に示す第2の流れセットが
「DEF ILL」とマーク付けされる。このマーク付
けは、このポインタが不正値を割り当てられたことを表
す。
【0154】そして、構造体「widget」のメンバ
「number」に値を割り当てるために、ポインタ
「ptr_part」がライン160において関連解除
される。また、ライン160のデータ流れ解析によっ
て、図24における流れセットが「USED」とマーク
付けされる。このマーク付けは、このポインタが関連解
除されたことを表す。下で説明するように、この第2の
流れセットの解析によって、読み出し時エラーが発生す
る。その理由は、ライン160が実行されるときに不正
ポインタが関連解除中だからである。
「number」に値を割り当てるために、ポインタ
「ptr_part」がライン160において関連解除
される。また、ライン160のデータ流れ解析によっ
て、図24における流れセットが「USED」とマーク
付けされる。このマーク付けは、このポインタが関連解
除されたことを表す。下で説明するように、この第2の
流れセットの解析によって、読み出し時エラーが発生す
る。その理由は、ライン160が実行されるときに不正
ポインタが関連解除中だからである。
【0155】パーズ木全体について流れセットが設定さ
れると、実行時において行う必要のあるポインタ検査の
数を最小化するために、各流れセットが解析される。定
義によって、与えられたポインタは各流れセットの期間
中同一の値を維持するので、各セットについて、各々の
個別ポインタ検査を受け入れ可能なようにオフセットを
拡張したポインタ検査を1回だけ行えばよい。
れると、実行時において行う必要のあるポインタ検査の
数を最小化するために、各流れセットが解析される。定
義によって、与えられたポインタは各流れセットの期間
中同一の値を維持するので、各セットについて、各々の
個別ポインタ検査を受け入れ可能なようにオフセットを
拡張したポインタ検査を1回だけ行えばよい。
【0156】例えば、ポインタ「ptr_part」に
ついての第1の流れセットには、このポインタの3回の
関連解除が含まれる。すなわち、ポインタはライン70
において割り当てられた値を記憶している一方、関連解
除は3回行われることになる。通常、データ流れ解析を
行わない場合には、3回の別個のポインタ検査を行う必
要がある。しかし、データ流れ解析によって、パーズ木
における3回の別個のポインタ検査が、3回のポインタ
関連解除の各々の有効性をテストする1回だけのポイン
タ検査に置換される。
ついての第1の流れセットには、このポインタの3回の
関連解除が含まれる。すなわち、ポインタはライン70
において割り当てられた値を記憶している一方、関連解
除は3回行われることになる。通常、データ流れ解析を
行わない場合には、3回の別個のポインタ検査を行う必
要がある。しかし、データ流れ解析によって、パーズ木
における3回の別個のポインタ検査が、3回のポインタ
関連解除の各々の有効性をテストする1回だけのポイン
タ検査に置換される。
【0157】本発明の好ましい実施例においては、上記
データ流れ解析の正確さを確実なものにするための「コ
ンパイルされたコード流れ解析ルーチン」が設けられ、
このルーチンにおいては、与えられたポインタについて
の流れセットに、一連のポインタ関連解除とともに、コ
ンパイルされた関数の呼び出しが含まれる。もしこのコ
ンパイルされた関数が、この流れセットに連関するポイ
ンタへのアクセスを有する場合、このコンパイルされた
関数は、翻訳器15に気付かれずにこのポインタの値を
修正できる。
データ流れ解析の正確さを確実なものにするための「コ
ンパイルされたコード流れ解析ルーチン」が設けられ、
このルーチンにおいては、与えられたポインタについて
の流れセットに、一連のポインタ関連解除とともに、コ
ンパイルされた関数の呼び出しが含まれる。もしこのコ
ンパイルされた関数が、この流れセットに連関するポイ
ンタへのアクセスを有する場合、このコンパイルされた
関数は、翻訳器15に気付かれずにこのポインタの値を
修正できる。
【0158】そして、もしこのコンパイルされた関数が
このポインタへのアクセスを有する場合、実行時におけ
るコンパイルされた関数の実行後に、コンパイルされた
コードの流れ解析ルーチンが、この流れセットに連関す
るポインタ値がコンパイルされた関数の実行中に修正さ
れているかどうかを判断するテストを行うのが好まし
い。
このポインタへのアクセスを有する場合、実行時におけ
るコンパイルされた関数の実行後に、コンパイルされた
コードの流れ解析ルーチンが、この流れセットに連関す
るポインタ値がコンパイルされた関数の実行中に修正さ
れているかどうかを判断するテストを行うのが好まし
い。
【0159】もしコンパイルされた関数がポインタ値を
修正していた場合、このコンパイルされた関数の呼び出
し後流れセットにおいて生じるこれらのポインタ関連解
除についてポインタ検査を追加して再度実行する必要が
ある。もしコンパイルされた関数がポインタ値を修正し
ていない場合、ポインタ検査を追加して行う必要はな
い。
修正していた場合、このコンパイルされた関数の呼び出
し後流れセットにおいて生じるこれらのポインタ関連解
除についてポインタ検査を追加して再度実行する必要が
ある。もしコンパイルされた関数がポインタ値を修正し
ていない場合、ポインタ検査を追加して行う必要はな
い。
【0160】実行時において行うべきポインタ検査の数
を最小化することに加えて、上記のデータ流れ解析によ
って、あるエラーを読み出し時において検出することが
可能となる。すなわち、ステップ350におけるデータ
流れ解析の完了後、ステップ360において、初期化さ
れていないまたは不正なポインタが関連解除されつつあ
ることをこのデータ流れ解析が表示しているかどうかを
判断するテストが行われる。
を最小化することに加えて、上記のデータ流れ解析によ
って、あるエラーを読み出し時において検出することが
可能となる。すなわち、ステップ350におけるデータ
流れ解析の完了後、ステップ360において、初期化さ
れていないまたは不正なポインタが関連解除されつつあ
ることをこのデータ流れ解析が表示しているかどうかを
判断するテストが行われる。
【0161】初期化されていないポインタを関連解除す
るというメモリエラーは、ポインタが割り当てられる前
に関連解除されることを流れセットが表示する場合、す
なわち流れセットが「DEF」とマーク付けされる前に
「USED」とマーク付けされる場合に生じる。同様
に、不正なポインタを関連解除するというメモリエラー
は、図24の第2の流れセットにおけるように、流れセ
ットが「DEF ILL」とマーク付けされ、次に中間
に来る割当なしに、「USED」とマーク付けされる場
合に生じる。
るというメモリエラーは、ポインタが割り当てられる前
に関連解除されることを流れセットが表示する場合、す
なわち流れセットが「DEF」とマーク付けされる前に
「USED」とマーク付けされる場合に生じる。同様
に、不正なポインタを関連解除するというメモリエラー
は、図24の第2の流れセットにおけるように、流れセ
ットが「DEF ILL」とマーク付けされ、次に中間
に来る割当なしに、「USED」とマーク付けされる場
合に生じる。
【0162】もしステップ360において、不正なまた
は初期化されていないポインタが関連解除されていると
判断された場合、ステップ370においてエラーメッセ
ージが生成され、その後、手順はステップ380におい
てプロセスから出て、プロセスが終了する。
は初期化されていないポインタが関連解除されていると
判断された場合、ステップ370においてエラーメッセ
ージが生成され、その後、手順はステップ380におい
てプロセスから出て、プロセスが終了する。
【0163】しかし、もしステップ360において、不
正なまたは初期化されていないポインタが関連解除され
てはいないと判断された場合、手順はステップ380に
おいて「読み出し時エラー検査プロセス」から出て、プ
ロセスが終了する。
正なまたは初期化されていないポインタが関連解除され
てはいないと判断された場合、手順はステップ380に
おいて「読み出し時エラー検査プロセス」から出て、プ
ロセスが終了する。
【0164】図7から図11までを参照して上に述べた
「読み出し時エラー検査プロセス」および連関するサブ
ルーチンが完了すると、パーズ木の各ラインの解析が終
り、適切なエラー検査コマンドおよび情報のパーズ木へ
の挿入が終る。そして、実行時エラー検査を起動実行す
るために、挿入されたエラー検査コマンドおよび追加情
報が評価されることになる。
「読み出し時エラー検査プロセス」および連関するサブ
ルーチンが完了すると、パーズ木の各ラインの解析が終
り、適切なエラー検査コマンドおよび情報のパーズ木へ
の挿入が終る。そして、実行時エラー検査を起動実行す
るために、挿入されたエラー検査コマンドおよび追加情
報が評価されることになる。
【0165】[コンパイルされた目的コードのエラー検
査]本発明の別の特徴によれば、実行時において評価器
35によって実行される、「コンパイルされた目的コー
ド」についての同様なエラー検査を行うことも望まし
い。
査]本発明の別の特徴によれば、実行時において評価器
35によって実行される、「コンパイルされた目的コー
ド」についての同様なエラー検査を行うことも望まし
い。
【0166】本発明の好ましい実施例において、「コン
パイルされた目的コードのエラー検査」は、読み出し時
において「翻訳された原始コード」について行われたエ
ラー検査プロセスをまねるように、連関する「コンパイ
ルされた関数」の実行時における実行の、必要に応じて
前および/または後に、下に述べるように「翻訳された
ラッパ関数」を実行することによって実現される。
パイルされた目的コードのエラー検査」は、読み出し時
において「翻訳された原始コード」について行われたエ
ラー検査プロセスをまねるように、連関する「コンパイ
ルされた関数」の実行時における実行の、必要に応じて
前および/または後に、下に述べるように「翻訳された
ラッパ関数」を実行することによって実現される。
【0167】好ましくは、すべての「コンパイルされた
ライブラリ関数」について、必要に応じてラッパ関数を
設ける。これに加えて、ラッパ関数は、ポインタ値の監
視および/または評価を要する、ユーザにより定義され
るどの「コンパイルされた関数」、についても本明細書
における教示に基づいて形成することができる。実行時
における、連関する「コンパイルされた関数」の呼び出
し時にラッパ関数が実行される実行方法について図20
を参照して下に説明する。
ライブラリ関数」について、必要に応じてラッパ関数を
設ける。これに加えて、ラッパ関数は、ポインタ値の監
視および/または評価を要する、ユーザにより定義され
るどの「コンパイルされた関数」、についても本明細書
における教示に基づいて形成することができる。実行時
における、連関する「コンパイルされた関数」の呼び出
し時にラッパ関数が実行される実行方法について図20
を参照して下に説明する。
【0168】評価器35によってアクセス可能なラッパ
ライブラリ70を図1に示すように設けるのが好まし
い。ラッパライブラリ70は、「コンパイルされたコー
ド」の実行中にポインタを関連解除する「コンパイルさ
れた関数」の各々について「実行前ラッパ関数」を維持
することが好ましい。実行前ラッパ関数は、「コンパイ
ルされたコード」の実行中に関連解除されるポインタの
ポインタ検査を、「翻訳された関数」においてポインタ
の関連解除のためにポインタ検査が行われるのと同じ方
法で、起動する必要がある。
ライブラリ70を図1に示すように設けるのが好まし
い。ラッパライブラリ70は、「コンパイルされたコー
ド」の実行中にポインタを関連解除する「コンパイルさ
れた関数」の各々について「実行前ラッパ関数」を維持
することが好ましい。実行前ラッパ関数は、「コンパイ
ルされたコード」の実行中に関連解除されるポインタの
ポインタ検査を、「翻訳された関数」においてポインタ
の関連解除のためにポインタ検査が行われるのと同じ方
法で、起動する必要がある。
【0169】「実行前ラッパ関数」は、連関する「コン
パイルされた関数」の実行の直前に実行するのが好まし
い。これによって、ポインタが有効値を指示していなけ
ればそのポインタは関連解除されないということが確実
になる。与えられた関数についての実行前ラッパ関数は
また、配列参照を含む送られた引数について、ここに述
べるように配列次元検査をも行うことが好ましい。
パイルされた関数」の実行の直前に実行するのが好まし
い。これによって、ポインタが有効値を指示していなけ
ればそのポインタは関連解除されないということが確実
になる。与えられた関数についての実行前ラッパ関数は
また、配列参照を含む送られた引数について、ここに述
べるように配列次元検査をも行うことが好ましい。
【0170】同様に、もし与えられた「コンパイルされ
た関数」へ送られた引数が予め定義された有効範囲を有
する場合、連関する「実行前ラッパ関数」は、この既知
の範囲に対する送られた引数の有効性をテストすること
ができる。
た関数」へ送られた引数が予め定義された有効範囲を有
する場合、連関する「実行前ラッパ関数」は、この既知
の範囲に対する送られた引数の有効性をテストすること
ができる。
【0171】なお、ある「コンパイルされた関数」につ
いては、連関する「実行前ラッパ関数」は、「コンパイ
ルされた関数」の第1の実行時に「コンパイルされた関
数」へ送られたポインタ引数またはその他の情報を記憶
保存する必要がある。一方、同一関数への次の呼び出し
は、前の実行時と同じ情報を用いる必要があることを表
示するコードを送るだけである。
いては、連関する「実行前ラッパ関数」は、「コンパイ
ルされた関数」の第1の実行時に「コンパイルされた関
数」へ送られたポインタ引数またはその他の情報を記憶
保存する必要がある。一方、同一関数への次の呼び出し
は、前の実行時と同じ情報を用いる必要があることを表
示するコードを送るだけである。
【0172】これに加えて、ラッパライブラリ70は、
「コンパイルされたコード」の実行中にポインタを形成
する「コンパイルされた関数」の各々について、および
呼び出し関数に戻るときに次にポインタに割り当てられ
る値を返す「コンパイルされた関数」の各々について、
「実行後ラッパ関数」を維持することが好ましい。「実
行後ラッパ関数」は、「コンパイルされた関数」が戻る
前に、しかし呼び出し関数が実行を再開する前に、実行
することが好ましい。
「コンパイルされたコード」の実行中にポインタを形成
する「コンパイルされた関数」の各々について、および
呼び出し関数に戻るときに次にポインタに割り当てられ
る値を返す「コンパイルされた関数」の各々について、
「実行後ラッパ関数」を維持することが好ましい。「実
行後ラッパ関数」は、「コンパイルされた関数」が戻る
前に、しかし呼び出し関数が実行を再開する前に、実行
することが好ましい。
【0173】もし「コンパイルされた関数」が、実行中
にポインタを形成する場合には、「実行後ラッパ関数」
は、その形成されたポインタについてのポインタ情報を
ポインタ検査表200に追加する必要があり、この追加
は、ポインタ検査表エントリが「翻訳されたコード」に
よって形成されたポインタについて更新されるのと同一
の方法で行う必要がある。
にポインタを形成する場合には、「実行後ラッパ関数」
は、その形成されたポインタについてのポインタ情報を
ポインタ検査表200に追加する必要があり、この追加
は、ポインタ検査表エントリが「翻訳されたコード」に
よって形成されたポインタについて更新されるのと同一
の方法で行う必要がある。
【0174】同様に、もし「コンパイルされた関数」
が、次に呼び出し関数においてポインタに割り当てられ
ることになる値を呼び出し関数に返す場合には、適切な
ポインタ情報をポインタ検査表200に追加する必要が
ある。この場合、返される値についてのポインタ情報を
ポインタ保存スタック65に、読み出し時ポインタ検査
表更新サブルーチンがステップ552(図10)におい
て「翻訳された関数」から返される値を取り扱ったのと
同じ方法で入れる必要がある。
が、次に呼び出し関数においてポインタに割り当てられ
ることになる値を呼び出し関数に返す場合には、適切な
ポインタ情報をポインタ検査表200に追加する必要が
ある。この場合、返される値についてのポインタ情報を
ポインタ保存スタック65に、読み出し時ポインタ検査
表更新サブルーチンがステップ552(図10)におい
て「翻訳された関数」から返される値を取り扱ったのと
同じ方法で入れる必要がある。
【0175】この後、ポインタ検査表200に入れる目
的で、この情報がポインタ保存スタック65から評価器
35によって検索により取り出される。
的で、この情報がポインタ保存スタック65から評価器
35によって検索により取り出される。
【0176】例えば、ポインタには、Cプログラミング
言語の関数ライブラリに普通に見出される「mallo
c」関数のような、コンパイルされたメモリ割付関数か
ら戻される値が頻繁に割り当てられる。「mallo
c」関数についての「実行後ラッパ関数」は、割付され
たメモリ領域の始点アドレスと、始点アドレスおよびサ
イズ情報から導かれるこの領域の有効範囲とをポインタ
保存スタック65に入れることが好ましい。
言語の関数ライブラリに普通に見出される「mallo
c」関数のような、コンパイルされたメモリ割付関数か
ら戻される値が頻繁に割り当てられる。「mallo
c」関数についての「実行後ラッパ関数」は、割付され
たメモリ領域の始点アドレスと、始点アドレスおよびサ
イズ情報から導かれるこの領域の有効範囲とをポインタ
保存スタック65に入れることが好ましい。
【0177】このようなふうにして、返された値が呼び
出し関数におけるポインタに割り当てられるとき、ポイ
ンタ検査表200(図2)における適切な横列が、関連
するポインタ情報データ更新される。始点アドレスがポ
インタエントリ240の内容欄に入れられ、有効範囲エ
ントリ250には、「実行後ラッパ関数」によって計算
された範囲情報が入れられる。好ましくは、「割付済」
の状態表示を状態エントリ260に入れるようにする。
出し関数におけるポインタに割り当てられるとき、ポイ
ンタ検査表200(図2)における適切な横列が、関連
するポインタ情報データ更新される。始点アドレスがポ
インタエントリ240の内容欄に入れられ、有効範囲エ
ントリ250には、「実行後ラッパ関数」によって計算
された範囲情報が入れられる。好ましくは、「割付済」
の状態表示を状態エントリ260に入れるようにする。
【0178】しかし、本発明の好ましい実施例によれ
ば、割付されたメモリスペースを指示するポインタにつ
いて追加ポインタ情報が維持される。図3に示す原始コ
ードファイル例「テストファイル」のライン200およ
びライン210が実行されると、35バイトのブロック
が割付される結果となり、割付されたブロックの始点ア
ドレスがポインタ「ptr_alloc」に割り当てら
れる。
ば、割付されたメモリスペースを指示するポインタにつ
いて追加ポインタ情報が維持される。図3に示す原始コ
ードファイル例「テストファイル」のライン200およ
びライン210が実行されると、35バイトのブロック
が割付される結果となり、割付されたブロックの始点ア
ドレスがポインタ「ptr_alloc」に割り当てら
れる。
【0179】「malloc」関数から戻ると、ポイン
タ「ptr_alloc」に対するポインタ検査表20
0内の横列が、新たなポインタ情報を反映するように更
新される。ポインタアドレスエントリ230とポインタ
内容エントリ240には、適切な情報が入れられる。状
態エントリ260には、割付されたメモリスペースをポ
インタが指示することを表す表示「割付済」(ALLO
CATED)が入れられる。
タ「ptr_alloc」に対するポインタ検査表20
0内の横列が、新たなポインタ情報を反映するように更
新される。ポインタアドレスエントリ230とポインタ
内容エントリ240には、適切な情報が入れられる。状
態エントリ260には、割付されたメモリスペースをポ
インタが指示することを表す表示「割付済」(ALLO
CATED)が入れられる。
【0180】この好ましい実施例においては、「mal
loc」関数についての「実行後ラッパ関数」もまた、
図6に示すようなメモリ割付構造体280を形成する。
図2に示すように、ポインタ「ptr_alloc」に
ついての有効下側メモリ境界250aはメモリ割付構造
体280を指示するポインタを有する。
loc」関数についての「実行後ラッパ関数」もまた、
図6に示すようなメモリ割付構造体280を形成する。
図2に示すように、ポインタ「ptr_alloc」に
ついての有効下側メモリ境界250aはメモリ割付構造
体280を指示するポインタを有する。
【0181】メモリ割付構造体280は、下側境界部分
282、上側境界部分284、チェインリスト部分28
6、初期化ビットベクトル288、および状態部分29
0からなる。メモリ割付の有効上側および下側境界は、
構造体部分282および284にそれぞれ保存記憶され
る。
282、上側境界部分284、チェインリスト部分28
6、初期化ビットベクトル288、および状態部分29
0からなる。メモリ割付の有効上側および下側境界は、
構造体部分282および284にそれぞれ保存記憶され
る。
【0182】チェインリスト部分286は、割付された
メモリの連関ブロックを現に指示するすべてのポインタ
のリストからなる。割付されたメモリを指示するポイン
タが他のポインタにコピーされる都度、第2のポインタ
に対するポインタ検査表200内の状態エントリ260
も「割付済」とマーク付けされ、有効下側境界エントリ
250a内の同じメモリ割付構造体280を指示するポ
インタを有する。これに加えて、新たなポインタがチェ
インリスト部分286内のリストに追加される。
メモリの連関ブロックを現に指示するすべてのポインタ
のリストからなる。割付されたメモリを指示するポイン
タが他のポインタにコピーされる都度、第2のポインタ
に対するポインタ検査表200内の状態エントリ260
も「割付済」とマーク付けされ、有効下側境界エントリ
250a内の同じメモリ割付構造体280を指示するポ
インタを有する。これに加えて、新たなポインタがチェ
インリスト部分286内のリストに追加される。
【0183】同様に、もし割付されたメモリを指示する
ポインタが、割付されたメモリの新たなブロックを指示
するように指示について再割当された場合、このポイン
タを新たなメモリ割付についてのチェインリスト部分2
86に追加する前に、前回のメモリ割付についてのチェ
インリスト286内のリストからこのポインタを除去す
ることが好ましい。下でさらに述べるように、本発明の
この特徴により、メモリ漏洩を自動的に検出することが
可能となる。
ポインタが、割付されたメモリの新たなブロックを指示
するように指示について再割当された場合、このポイン
タを新たなメモリ割付についてのチェインリスト部分2
86に追加する前に、前回のメモリ割付についてのチェ
インリスト286内のリストからこのポインタを除去す
ることが好ましい。下でさらに述べるように、本発明の
この特徴により、メモリ漏洩を自動的に検出することが
可能となる。
【0184】結果として、メモリ割付構造体280のチ
ェインリスト部分286に記録されている情報は、連関
する割付されたメモリを現に指示するポインタだけを表
示する。
ェインリスト部分286に記録されている情報は、連関
する割付されたメモリを現に指示するポインタだけを表
示する。
【0185】図6に示すように、メモリ割付構造体28
0に含まれる初期化ビットベクトル288は、割付され
たメモリの各バイト当り1個のビットからなり、連関す
るメモリの各バイトの初期化状態を維持表示する。本発
明の好ましい実施例において、割付されたメモリの領域
内の全バイトが初期化され終ると、初期化ビットベクト
ル288は廃棄され、この領域全体の初期化状態を表示
するフラグがセットされる。
0に含まれる初期化ビットベクトル288は、割付され
たメモリの各バイト当り1個のビットからなり、連関す
るメモリの各バイトの初期化状態を維持表示する。本発
明の好ましい実施例において、割付されたメモリの領域
内の全バイトが初期化され終ると、初期化ビットベクト
ル288は廃棄され、この領域全体の初期化状態を表示
するフラグがセットされる。
【0186】下でさらに述べるように、割付されたメモ
リからの読み出しがポインタを用いて行われる都度、割
付されたメモリのそれぞれのバイトが初期化されたこと
を確実にするために、初期化ビットベクトル288が評
価される。これに加えて、下でさらに述べるように、
「コンパイルされたコード」または「翻訳されたコー
ド」のいずれかによって割付されたメモリの初期化が検
出された後に初期化ビットベクトル288の適切なビッ
トを更新するためのメカニズムが設けられる。
リからの読み出しがポインタを用いて行われる都度、割
付されたメモリのそれぞれのバイトが初期化されたこと
を確実にするために、初期化ビットベクトル288が評
価される。これに加えて、下でさらに述べるように、
「コンパイルされたコード」または「翻訳されたコー
ド」のいずれかによって割付されたメモリの初期化が検
出された後に初期化ビットベクトル288の適切なビッ
トを更新するためのメカニズムが設けられる。
【0187】本発明の好ましい実施例においては、「m
alloc」関数のようなメモリ割付関数、に連関する
「実行後ラッパ関数」が、大抵のプログラミング実例で
は出会いそうにないような既知の予め定義された値をこ
の関数によって割付されているメモリの4バイト領域、
の各々について事前のマーク付けを行うのが好ましい。
この事前マーク付けされた値によって、メモリ領域の初
期化の検出が可能となる。
alloc」関数のようなメモリ割付関数、に連関する
「実行後ラッパ関数」が、大抵のプログラミング実例で
は出会いそうにないような既知の予め定義された値をこ
の関数によって割付されているメモリの4バイト領域、
の各々について事前のマーク付けを行うのが好ましい。
この事前マーク付けされた値によって、メモリ領域の初
期化の検出が可能となる。
【0188】プログラミング環境では16進値「FFF
A 5A5A」には次の2つの理由から通常出会わない
ことが判っている。第1の理由は、もしこの値が浮動小
数点値として用いられる場合この値がIEEE浮動小数
点基準において「非番号」として定義されるので、浮動
小数点トラップエラーが発生するためである。第2の理
由は、もしプログラマがこの値をポインタとして用いよ
うとする場合、大抵のマシンにセグメンテーションまた
はメモリ欠陥エラーが発生するためである。
A 5A5A」には次の2つの理由から通常出会わない
ことが判っている。第1の理由は、もしこの値が浮動小
数点値として用いられる場合この値がIEEE浮動小数
点基準において「非番号」として定義されるので、浮動
小数点トラップエラーが発生するためである。第2の理
由は、もしプログラマがこの値をポインタとして用いよ
うとする場合、大抵のマシンにセグメンテーションまた
はメモリ欠陥エラーが発生するためである。
【0189】すべての動的に割付されたメモリを16進
値「FFFA 5A5A」で事前マーク付けすることに
加えて、すべての初期化されていない自動変数に連関す
るメモリ位置が実行時において同様にマーク付けされる
こともまた好ましい。なお、これに加えて、すべての初
期化されていない静的変数は、実行時においてリンク装
置40により「0」にセットされる。
値「FFFA 5A5A」で事前マーク付けすることに
加えて、すべての初期化されていない自動変数に連関す
るメモリ位置が実行時において同様にマーク付けされる
こともまた好ましい。なお、これに加えて、すべての初
期化されていない静的変数は、実行時においてリンク装
置40により「0」にセットされる。
【0190】「malloc」関数のようなメモリ割付
関数に通常連関する動作速度は遅いので、多くのプログ
ラマはしばしば、1個の大きなメモリブロックの割付を
行い、それからその大きなブロックを、必要に応じてよ
り小さい部分に分解し、割付を受けたこれらのより小さ
い部分の各々を少なくとも1個のポインタでアクセス可
能なようにしている。しかし、上に概略説明したポイン
タ検査表更新プロセスによれば、各ポインタの有効領域
範囲は通常、大きなメモリブロック全体としてポインタ
検査表200に記録されることになる。
関数に通常連関する動作速度は遅いので、多くのプログ
ラマはしばしば、1個の大きなメモリブロックの割付を
行い、それからその大きなブロックを、必要に応じてよ
り小さい部分に分解し、割付を受けたこれらのより小さ
い部分の各々を少なくとも1個のポインタでアクセス可
能なようにしている。しかし、上に概略説明したポイン
タ検査表更新プロセスによれば、各ポインタの有効領域
範囲は通常、大きなメモリブロック全体としてポインタ
検査表200に記録されることになる。
【0191】すなわち、ポインタ検査表200は、より
大きなメモリ割付分のうちのより小さな部分だけを指示
するように意図されているポインタについての適切な領
域範囲を表示する必要がある。したがって、より小さい
領域範囲を記録するために、ポインタ検査表200内の
エントリにアクセスできることが好ましい。
大きなメモリ割付分のうちのより小さな部分だけを指示
するように意図されているポインタについての適切な領
域範囲を表示する必要がある。したがって、より小さい
領域範囲を記録するために、ポインタ検査表200内の
エントリにアクセスできることが好ましい。
【0192】本発明のさらに別の特徴によれば、割付さ
れたメモリの割付解除(freeライブラリ関数を呼び
出すことによって行われる)も図12に示す「メモリ割
付解除をモニタするためのサブルーチン」によってモニ
タされる。メモリ割付解除関数が呼び出されるとき、メ
モリ割付解除関数の引数は一般に、割付されたメモリス
ペースを指示するポインタのうちの1個である。
れたメモリの割付解除(freeライブラリ関数を呼び
出すことによって行われる)も図12に示す「メモリ割
付解除をモニタするためのサブルーチン」によってモニ
タされる。メモリ割付解除関数が呼び出されるとき、メ
モリ割付解除関数の引数は一般に、割付されたメモリス
ペースを指示するポインタのうちの1個である。
【0193】共通するプログラミングエラーの1つは、
ある1個のポインタを用いてメモリを割付解除し、それ
から同じメモリスペースを、その同じメモリスペースを
指示するように前に定義されていた別個のポインタでア
クセスしようと意図する場合である。
ある1個のポインタを用いてメモリを割付解除し、それ
から同じメモリスペースを、その同じメモリスペースを
指示するように前に定義されていた別個のポインタでア
クセスしようと意図する場合である。
【0194】連関するコンパイルされたメモリ割付解除
関数がステップ737において呼び出され実行される前
に、「メモリ割付解除をモニタするためのサブルーチ
ン」のステップ705からステップ735までにおいて
「実行後ラッパ関数」が起動されるのが好ましい。「実
行後ラッパ関数」は、解除された(freeされた)メ
モリにアクセスしようと意図するときに引き続いてエラ
ーが発生するのを防止する。
関数がステップ737において呼び出され実行される前
に、「メモリ割付解除をモニタするためのサブルーチ
ン」のステップ705からステップ735までにおいて
「実行後ラッパ関数」が起動されるのが好ましい。「実
行後ラッパ関数」は、解除された(freeされた)メ
モリにアクセスしようと意図するときに引き続いてエラ
ーが発生するのを防止する。
【0195】「メモリ割付解除をモニタするためのサブ
ルーチン」は、メモリ割付解除関数へ送られたポインタ
引数について、ステップ705においてポインタ検査表
200内の横列を最初に探索する。
ルーチン」は、メモリ割付解除関数へ送られたポインタ
引数について、ステップ705においてポインタ検査表
200内の横列を最初に探索する。
【0196】ステップ710において、ポインタが「解
放」(FREED)状態にあることを状態エントリ26
0が表示しているかどうかを定めるテストが行われる。
もしステップ710において、状態が「解放」であると
判断された場合、ステップ715においてエラーメッセ
ージが生成される。その理由は、そのポインタによって
指示された割付されたメモリが既に解放されているから
である。その後、手順はステップ740においてサブル
ーチンから出て、サブルーチンが終了する。
放」(FREED)状態にあることを状態エントリ26
0が表示しているかどうかを定めるテストが行われる。
もしステップ710において、状態が「解放」であると
判断された場合、ステップ715においてエラーメッセ
ージが生成される。その理由は、そのポインタによって
指示された割付されたメモリが既に解放されているから
である。その後、手順はステップ740においてサブル
ーチンから出て、サブルーチンが終了する。
【0197】ステップ720において、状態エントリ2
60が「メモリ割付済」の状態または「不明」の状態か
どうかを定めるテストが、「メモリ割付解除をモニタす
るためのサブルーチン」によって行われる(状態エント
リ260(図2)および状態部分290(図6)におい
て、「メモリ割付済」の状態および「不明」の状態をそ
れぞれ「割付済」および「不明」とマーク付けする)。
60が「メモリ割付済」の状態または「不明」の状態か
どうかを定めるテストが、「メモリ割付解除をモニタす
るためのサブルーチン」によって行われる(状態エント
リ260(図2)および状態部分290(図6)におい
て、「メモリ割付済」の状態および「不明」の状態をそ
れぞれ「割付済」および「不明」とマーク付けする)。
【0198】もしステップ720において、状態が「メ
モリ割付済」の状態または「不明」の状態のいずれでも
ないと判断された場合、ステップ725においてエラー
メッセージが生成される。その理由は、これらの状態だ
けが、割付されたメモリについての有効な状態コードだ
からである。その後、手順はステップ740においてサ
ブルーチンから出て、サブルーチンが終了する。
モリ割付済」の状態または「不明」の状態のいずれでも
ないと判断された場合、ステップ725においてエラー
メッセージが生成される。その理由は、これらの状態だ
けが、割付されたメモリについての有効な状態コードだ
からである。その後、手順はステップ740においてサ
ブルーチンから出て、サブルーチンが終了する。
【0199】もしステップ720において、状態が「メ
モリ割付済」の状態または「不明」の状態であると判断
された場合、「メモリ割付解除をモニタするためのサブ
ルーチン」がステップ727において、下側境界エント
リ250a内でそのポインタによって指示されるメモリ
割付構造体280にアクセスし、「解放」の状態を表示
するように状態部分290(図6)をセットする。
モリ割付済」の状態または「不明」の状態であると判断
された場合、「メモリ割付解除をモニタするためのサブ
ルーチン」がステップ727において、下側境界エント
リ250a内でそのポインタによって指示されるメモリ
割付構造体280にアクセスし、「解放」の状態を表示
するように状態部分290(図6)をセットする。
【0200】その後、ステップ730において、「メモ
リ割付解除をモニタするためのサブルーチン」が、下側
境界エントリ250a内でそのポインタによって指示さ
れるメモリ割付構造体280にアクセスし、割付された
メモリスペースを指示するすべてのポインタのリストを
検索により取り出す。
リ割付解除をモニタするためのサブルーチン」が、下側
境界エントリ250a内でそのポインタによって指示さ
れるメモリ割付構造体280にアクセスし、割付された
メモリスペースを指示するすべてのポインタのリストを
検索により取り出す。
【0201】ステップ735において、前のステップに
おいて検索により取り出されたリストに表示される各ポ
インタについて、ポインタ検査表200の適切な横列が
アクセスされ、状態エントリ260が「解放」とマーク
付けされる。
おいて検索により取り出されたリストに表示される各ポ
インタについて、ポインタ検査表200の適切な横列が
アクセスされ、状態エントリ260が「解放」とマーク
付けされる。
【0202】これに加えて、ステップ737におけるコ
ンパイルされたメモリ割付解除関数の実行に続いて、ス
テップ739において、「実行後ラッパ関数」がリスト
に入れられた各ポインタの実際の内容をゼロ値にセット
するのが好ましい。この場合、もしゼロ値を有するこれ
らのポインタのうちの1個を関連解除する試みがなされ
ると、エラーメッセージが生成される。この後、ステッ
プ740において手順はサブルーチンを出て、サブルー
チンが終了する。
ンパイルされたメモリ割付解除関数の実行に続いて、ス
テップ739において、「実行後ラッパ関数」がリスト
に入れられた各ポインタの実際の内容をゼロ値にセット
するのが好ましい。この場合、もしゼロ値を有するこれ
らのポインタのうちの1個を関連解除する試みがなされ
ると、エラーメッセージが生成される。この後、ステッ
プ740において手順はサブルーチンを出て、サブルー
チンが終了する。
【0203】なお、翻訳された関数においてローカル変
数について形成されたメモリスペースを静的ポインタが
指示すると、暗黙のメモリ割付解除が生じる。翻訳され
た関数が戻ると、割付されたメモリスペースは、翻訳器
15によって自動的に割付解除される。
数について形成されたメモリスペースを静的ポインタが
指示すると、暗黙のメモリ割付解除が生じる。翻訳され
た関数が戻ると、割付されたメモリスペースは、翻訳器
15によって自動的に割付解除される。
【0204】静的ポインタは、関数からの戻りに続い
て、無効メモリスペースを指示するので、静的ポインタ
の値をゼロ値にセットすることが好ましく、また、静的
ポインタについてのポインタ検査表200内の横列が、
「0」の内容を表示するように更新されるのが好まし
い。これは、静的ポインタにローカル変数のアドレスを
割り当てた「翻訳された関数」から戻ったときに図12
の「メモリ割付解除をモニタするためのサブルーチン」
を実行することによって実現される。
て、無効メモリスペースを指示するので、静的ポインタ
の値をゼロ値にセットすることが好ましく、また、静的
ポインタについてのポインタ検査表200内の横列が、
「0」の内容を表示するように更新されるのが好まし
い。これは、静的ポインタにローカル変数のアドレスを
割り当てた「翻訳された関数」から戻ったときに図12
の「メモリ割付解除をモニタするためのサブルーチン」
を実行することによって実現される。
【0205】[実行時エラー検査動作]評価器35が実
行時において内部疑似コードの各ノードを評価すると、
図13に示すような、そのノードが、エラー検査ルーチ
ンに関連するコマンドを有するかどうかを定める「実行
時エラー検査プロセス」が実現される。「実行時エラー
検査プロセス」は、図7を参照して上に述べた「読み出
し時エラー検査プロセス」によってパーズ木に挿入され
たあるエラー検査コマンドおよび追加情報に応答して、
内部疑似コードの各ノードを評価し、実行時エラー検査
タスクを実現する。
行時において内部疑似コードの各ノードを評価すると、
図13に示すような、そのノードが、エラー検査ルーチ
ンに関連するコマンドを有するかどうかを定める「実行
時エラー検査プロセス」が実現される。「実行時エラー
検査プロセス」は、図7を参照して上に述べた「読み出
し時エラー検査プロセス」によってパーズ木に挿入され
たあるエラー検査コマンドおよび追加情報に応答して、
内部疑似コードの各ノードを評価し、実行時エラー検査
タスクを実現する。
【0206】「実行時エラー検査プロセス」は、図13
に示すように、評価中のノードが実行時エラー検査ルー
チンに関連する5個のコマンドのうちの1個を有するか
どうかを判断する。もしエラー検査コマンドが検出され
た場合、「実行時エラー検査プロセス」が、図13に示
すように、適切な応答を起動する。
に示すように、評価中のノードが実行時エラー検査ルー
チンに関連する5個のコマンドのうちの1個を有するか
どうかを判断する。もしエラー検査コマンドが検出され
た場合、「実行時エラー検査プロセス」が、図13に示
すように、適切な応答を起動する。
【0207】ステップ800において手順が「実行時エ
ラー検査プロセス」に入り、ここで内部疑似コードの各
ノードが評価された後、もしステップ810において
「dimchk」コマンドが存在することが検出される
と、図14を参照して下に述べる「実行時配列次元検査
サブルーチン」が実行される。
ラー検査プロセス」に入り、ここで内部疑似コードの各
ノードが評価された後、もしステップ810において
「dimchk」コマンドが存在することが検出される
と、図14を参照して下に述べる「実行時配列次元検査
サブルーチン」が実行される。
【0208】「実行時配列次元検査サブルーチン」は、
実行時において配列が、不正な添字を参照として付けら
れているかどうかを定める。ステップ910(図14)
において、変数配列添字が、実行時条件に基づいて計算
される。その後、ステップ920において、計算された
添字参照が負数かまたは有効最大次元を超えているかど
うかを定めるテストが行われる。なお、有効最大次元
は、読み出し時において計算され、「dimchk」コ
マンドに入れられたものである。
実行時において配列が、不正な添字を参照として付けら
れているかどうかを定める。ステップ910(図14)
において、変数配列添字が、実行時条件に基づいて計算
される。その後、ステップ920において、計算された
添字参照が負数かまたは有効最大次元を超えているかど
うかを定めるテストが行われる。なお、有効最大次元
は、読み出し時において計算され、「dimchk」コ
マンドに入れられたものである。
【0209】もしステップ920において、計算された
添字参照が不正値であると判断された場合、ステップ9
24において、有効最大次元が「1」であるかどうかを
定めるテストが行われる。
添字参照が不正値であると判断された場合、ステップ9
24において、有効最大次元が「1」であるかどうかを
定めるテストが行われる。
【0210】もしステップ924において、有効最大次
元が「1」であると判断された場合、本明細書に開示さ
れているポインタ検査手段がステップ928において用
いられて、構造体が全体として有効範囲内にあるかどう
かが定められる。単一要素を有する配列で構造体宣言を
終り次いで実行時における配列の長さを選択するという
共通のプログラミング手法が、このステップ924にお
いて行われるテストによって可能になる。なお、構造体
が割付されるときには、配列の追加構成部分に対して追
加のメモリスペースが割付される。
元が「1」であると判断された場合、本明細書に開示さ
れているポインタ検査手段がステップ928において用
いられて、構造体が全体として有効範囲内にあるかどう
かが定められる。単一要素を有する配列で構造体宣言を
終り次いで実行時における配列の長さを選択するという
共通のプログラミング手法が、このステップ924にお
いて行われるテストによって可能になる。なお、構造体
が割付されるときには、配列の追加構成部分に対して追
加のメモリスペースが割付される。
【0211】もしステップ924において、有効最大次
元が「1」ではないと判断された場合、エラーは、この
共通プログラミング手法の結果ではない。そして、ステ
ップ930においてエラーメッセージが生成される。ス
テップ930の実行後、またはもしステップ920にお
いて、計算された添字参照が正規の値であると判断され
た場合、手順はステップ800(図13)において「実
行時エラー検査プロセス」に戻る。
元が「1」ではないと判断された場合、エラーは、この
共通プログラミング手法の結果ではない。そして、ステ
ップ930においてエラーメッセージが生成される。ス
テップ930の実行後、またはもしステップ920にお
いて、計算された添字参照が正規の値であると判断され
た場合、手順はステップ800(図13)において「実
行時エラー検査プロセス」に戻る。
【0212】ステップ820において、評価中の内部疑
似コードのノードが「savptr」コマンドを有する
かどうかを定めるテストが、「実行時エラー検査プロセ
ス」によって行われる。上に述べたように、「savp
tr」コマンドが「翻訳された原始コード」に挿入され
ている。したがって、実行時において評価されると、各
「savptr」コマンドによって、ポインタ検査表2
00内の適切な横列に含まれるポインタ情報がポインタ
保存スタック65にコピーさせられる。
似コードのノードが「savptr」コマンドを有する
かどうかを定めるテストが、「実行時エラー検査プロセ
ス」によって行われる。上に述べたように、「savp
tr」コマンドが「翻訳された原始コード」に挿入され
ている。したがって、実行時において評価されると、各
「savptr」コマンドによって、ポインタ検査表2
00内の適切な横列に含まれるポインタ情報がポインタ
保存スタック65にコピーさせられる。
【0213】もしステップ820において、ノードが
「savptr」コマンドを有すると判断された場合、
ステップ825において評価器35が、コピーされてい
るポインタのアドレスをインタプリタスタック60の最
上部から検索により取り出す。その後、評価器35が、
インタプリタスタック60から検索により取り出された
アドレスを用いてポインタ検査表200の適切な横列を
探索し、ポインタ情報をポインタ検査表200の横列か
らポインタ保存スタック65にコピーする。
「savptr」コマンドを有すると判断された場合、
ステップ825において評価器35が、コピーされてい
るポインタのアドレスをインタプリタスタック60の最
上部から検索により取り出す。その後、評価器35が、
インタプリタスタック60から検索により取り出された
アドレスを用いてポインタ検査表200の適切な横列を
探索し、ポインタ情報をポインタ検査表200の横列か
らポインタ保存スタック65にコピーする。
【0214】これに加えて、もし、上に述べたように、
「savptr」コマンドが関数を指示するポインタを
有する場合、この、関数を指示するポインタはポインタ
保存スタック65にも入れられる。
「savptr」コマンドが関数を指示するポインタを
有する場合、この、関数を指示するポインタはポインタ
保存スタック65にも入れられる。
【0215】上に述べたように、ポインタ情報は、図1
7に示し下に説明するような「実行時ポインタ検査表更
新サブルーチン」のステップ1060からステップ10
80までにおいてポインタ検査表200に入れるため
に、評価器35によってポインタ保存スタック65から
次に検索により取り出される。ステップ825の実行
後、手順はステップ800に戻り、上記のように進む。
7に示し下に説明するような「実行時ポインタ検査表更
新サブルーチン」のステップ1060からステップ10
80までにおいてポインタ検査表200に入れるため
に、評価器35によってポインタ保存スタック65から
次に検索により取り出される。ステップ825の実行
後、手順はステップ800に戻り、上記のように進む。
【0216】実行時エラー検査プロセスによって評価中
の内部疑似コードのノードが「tblupd」コマンド
を有することがステップ830(図13)において検出
された場合、手順はステップ1002において、図15
から図17までに示す「実行時ポインタ検査表更新サブ
ルーチン」に入る。
の内部疑似コードのノードが「tblupd」コマンド
を有することがステップ830(図13)において検出
された場合、手順はステップ1002において、図15
から図17までに示す「実行時ポインタ検査表更新サブ
ルーチン」に入る。
【0217】ステップ1002(図15)において、
「tblupd」コマンドのノードに含まれる特徴情報
が評価され、それからステップ1004からステップ1
090(図17)までにおいて、型のマッチングが得ら
れるまで、いくつもの条件に対して検査される。なお、
割り当てられるポインタのアドレスは、実行時において
インタプリタスタック60から得られる。割り当てられ
るポインタについてのポインタ情報で更新する必要のあ
るポインタ検査表200内の適切な横列を探索特定する
のにポインタのアドレスが用いられる。
「tblupd」コマンドのノードに含まれる特徴情報
が評価され、それからステップ1004からステップ1
090(図17)までにおいて、型のマッチングが得ら
れるまで、いくつもの条件に対して検査される。なお、
割り当てられるポインタのアドレスは、実行時において
インタプリタスタック60から得られる。割り当てられ
るポインタについてのポインタ情報で更新する必要のあ
るポインタ検査表200内の適切な横列を探索特定する
のにポインタのアドレスが用いられる。
【0218】ステップ1004において、識別特定され
た変数または関数のアドレスがポインタに割り当てられ
る内部記号表75内のエントリ、を指示するポインタが
ノードに含まれるかどうか、を定めるテストが行われ
る。
た変数または関数のアドレスがポインタに割り当てられ
る内部記号表75内のエントリ、を指示するポインタが
ノードに含まれるかどうか、を定めるテストが行われ
る。
【0219】もしステップ1004において、内部記号
表75内のエントリを指示するポインタがノードに含ま
れると判断された場合、そのポインタは、識別特定され
た変数または関数のアドレスおよび、もし利用可能な
ら、識別特定された変数または関数のサイズを検索によ
り取り出すために、ステップ1006において内部記号
表75の適切なエントリにアクセスするのに用いられ
る。
表75内のエントリを指示するポインタがノードに含ま
れると判断された場合、そのポインタは、識別特定され
た変数または関数のアドレスおよび、もし利用可能な
ら、識別特定された変数または関数のサイズを検索によ
り取り出すために、ステップ1006において内部記号
表75の適切なエントリにアクセスするのに用いられ
る。
【0220】ステップ1008において、内部記号表7
5内でサイズ情報が利用可能だったかどうかを定めるテ
ストが行われる。もしステップ1008において、内部
記号表75内でサイズ情報が利用可能ではなかったと判
断された場合、ステップ1010において、状態フラグ
が「不明」(UNKNOWN)にセットされる。
5内でサイズ情報が利用可能だったかどうかを定めるテ
ストが行われる。もしステップ1008において、内部
記号表75内でサイズ情報が利用可能ではなかったと判
断された場合、ステップ1010において、状態フラグ
が「不明」(UNKNOWN)にセットされる。
【0221】もしステップ1008において、内部記号
表75内でサイズ情報が利用可能だったと判断された場
合、ステップ1014において、そのポインタが関数ま
たは変数を指示しているかどうかを定めるテストが行わ
れる。
表75内でサイズ情報が利用可能だったと判断された場
合、ステップ1014において、そのポインタが関数ま
たは変数を指示しているかどうかを定めるテストが行わ
れる。
【0222】もしステップ1014においてポインタが
関数を指示していると判断された場合、ステップ101
6において、状態フラグが「関数指示」(PFUNC)
にセットされる。この場合、関数は始点からしか初期化
されないので、関数を指示するポインタについての有効
領域範囲はその関数の始点だけとなる。したがって、ス
テップ1017において有効領域範囲が、ステップ10
06において内部記号表から検索により取り出された始
点アドレスにセットされる。
関数を指示していると判断された場合、ステップ101
6において、状態フラグが「関数指示」(PFUNC)
にセットされる。この場合、関数は始点からしか初期化
されないので、関数を指示するポインタについての有効
領域範囲はその関数の始点だけとなる。したがって、ス
テップ1017において有効領域範囲が、ステップ10
06において内部記号表から検索により取り出された始
点アドレスにセットされる。
【0223】もしステップ1014においてポインタが
変数を指示していると判断された場合、ステップ101
8において、状態フラグが「境界あり」にセットされ
る。ステップ1019において、ポインタについての有
効領域範囲が、内部記号表75から検索により取り出さ
れたアドレスおよびサイズ情報を用いて計算される。
変数を指示していると判断された場合、ステップ101
8において、状態フラグが「境界あり」にセットされ
る。ステップ1019において、ポインタについての有
効領域範囲が、内部記号表75から検索により取り出さ
れたアドレスおよびサイズ情報を用いて計算される。
【0224】ステップ1020において、ステップ10
06からステップ1019までの実行時に割り当てられ
るポインタについて定義された情報が、割り当てられる
ポインタについて設定されたポインタ検査表200の適
切な横列に追加される。その後、手順はステップ800
(図13)において「実行時エラー検査プロセス」に戻
る。
06からステップ1019までの実行時に割り当てられ
るポインタについて定義された情報が、割り当てられる
ポインタについて設定されたポインタ検査表200の適
切な横列に追加される。その後、手順はステップ800
(図13)において「実行時エラー検査プロセス」に戻
る。
【0225】もしステップ1004(図15)におい
て、内部記号表75内のエントリを指示するポインタが
ノードに含まれないと判断された場合、手順はステップ
1022に進む。
て、内部記号表75内のエントリを指示するポインタが
ノードに含まれないと判断された場合、手順はステップ
1022に進む。
【0226】ステップ1022においては、ノードが
「readintstk」コマンドだけを含むかどうか
を定めるテストが行われる。このコマンドは、もしポイ
ンタが第2のポインタの内容を割り当てられる場合に
は、読み出し時においてパーズ木に入れられる。
「readintstk」コマンドだけを含むかどうか
を定めるテストが行われる。このコマンドは、もしポイ
ンタが第2のポインタの内容を割り当てられる場合に
は、読み出し時においてパーズ木に入れられる。
【0227】もしステップ1022において、ノードが
「readintstk」コマンドだけを含むと判断さ
れた場合は、コピーされる第2のポインタのアドレスを
検索により取り出すために、評価器35がインタプリタ
スタック60にアクセスするのが好ましい。その後、ス
テップ1026において、評価器35が、ステップ10
24においてインタプリタスタック60から検索により
取り出されたアドレスを用いて第2のポインタに対する
ポインタ検査表200内の横列を探索する。
「readintstk」コマンドだけを含むと判断さ
れた場合は、コピーされる第2のポインタのアドレスを
検索により取り出すために、評価器35がインタプリタ
スタック60にアクセスするのが好ましい。その後、ス
テップ1026において、評価器35が、ステップ10
24においてインタプリタスタック60から検索により
取り出されたアドレスを用いて第2のポインタに対する
ポインタ検査表200内の横列を探索する。
【0228】それから、第2のポインタについてポイン
タ検査表200から検索により取り出された情報が、割
り当てられるポインタに対する横列にコピーされる。そ
の後、手順はステップ800(図13)において「実行
時エラー検査プロセス」に戻る。
タ検査表200から検索により取り出された情報が、割
り当てられるポインタに対する横列にコピーされる。そ
の後、手順はステップ800(図13)において「実行
時エラー検査プロセス」に戻る。
【0229】もしステップ1022(図15)におい
て、ノードが「readintstk」コマンドを含ま
ないと判断された場合、手順はステップ1030(図1
6)へ進む。
て、ノードが「readintstk」コマンドを含ま
ないと判断された場合、手順はステップ1030(図1
6)へ進む。
【0230】ステップ1030においては、ノードが、
ポインタに割り当てられる文字列のアドレスおよびサイ
ズを含むかどうかを定めるテストが行われる。もしステ
ップ1030においてノードが、ポインタに割り当てら
れる文字列のアドレスおよびサイズを含むと判断された
場合には、ステップ1032において評価器35が、ア
ドレスおよびサイズ情報に基づいてポインタについての
有効な領域範囲を計算する。
ポインタに割り当てられる文字列のアドレスおよびサイ
ズを含むかどうかを定めるテストが行われる。もしステ
ップ1030においてノードが、ポインタに割り当てら
れる文字列のアドレスおよびサイズを含むと判断された
場合には、ステップ1032において評価器35が、ア
ドレスおよびサイズ情報に基づいてポインタについての
有効な領域範囲を計算する。
【0231】ステップ1034において状態フラグを
「境界あり」にセットした後、割り当てられるポインタ
に対してステップ1032およびステップ1034の実
行中に定義された情報が、ステップ1036において、
割り当てられるポインタについてのポインタ検査表20
0の適切な横列に入れられる。その後、手順はステップ
800(図13)において「実行時エラー検査プロセ
ス」に戻る。
「境界あり」にセットした後、割り当てられるポインタ
に対してステップ1032およびステップ1034の実
行中に定義された情報が、ステップ1036において、
割り当てられるポインタについてのポインタ検査表20
0の適切な横列に入れられる。その後、手順はステップ
800(図13)において「実行時エラー検査プロセ
ス」に戻る。
【0232】もしステップ1030においてノードが、
ポインタに割り当てられる文字列のアドレスおよびサイ
ズを含まないと判断された場合、手順はステップ103
8に進む。
ポインタに割り当てられる文字列のアドレスおよびサイ
ズを含まないと判断された場合、手順はステップ103
8に進む。
【0233】ステップ1038において、ポインタが不
正な値を割り当てられことからノードが「不正」(IL
LEGAL)の状態表示を含むかどうかを定めるための
テストが行われる。
正な値を割り当てられことからノードが「不正」(IL
LEGAL)の状態表示を含むかどうかを定めるための
テストが行われる。
【0234】もしステップ1038において、ノードが
「不正」の状態表示を含むと判断された場合、ステップ
1040において状態フラグが「不正」にセットされ
る。そして、ポインタについて定義された情報がステッ
プ1042において、ポインタ検査表200の適切な横
列に追加される。その後、手順はステップ800(図1
3)において「実行時エラー検査プロセス」に戻る。
「不正」の状態表示を含むと判断された場合、ステップ
1040において状態フラグが「不正」にセットされ
る。そして、ポインタについて定義された情報がステッ
プ1042において、ポインタ検査表200の適切な横
列に追加される。その後、手順はステップ800(図1
3)において「実行時エラー検査プロセス」に戻る。
【0235】もしステップ1038において、ノードが
「不正」の状態表示を含まないと判断された場合、手順
はステップ1044に進む。
「不正」の状態表示を含まないと判断された場合、手順
はステップ1044に進む。
【0236】ステップ1044においては、ノードが
「readintstk」コマンドを構造体メンバのサ
イズとともに含むかどうかを定めるテストが行われる。
もしステップ1044において、ノードが「readi
ntstk」コマンドを構造体メンバのサイズとともに
含むと判断された場合、ステップ1046において評価
器35が、割り当てられる構造体メンバのアドレスを検
索により取り出す。
「readintstk」コマンドを構造体メンバのサ
イズとともに含むかどうかを定めるテストが行われる。
もしステップ1044において、ノードが「readi
ntstk」コマンドを構造体メンバのサイズとともに
含むと判断された場合、ステップ1046において評価
器35が、割り当てられる構造体メンバのアドレスを検
索により取り出す。
【0237】なお、「readintstk」コマンド
は、翻訳された原始コードに、読み出し時中に位置を占
めており、その位置占めは、構造体メンバのアドレスが
インタプリタスタック60の最上部にある時点にこのコ
マンドが評価されることが可能となるような仕方でなさ
れる。
は、翻訳された原始コードに、読み出し時中に位置を占
めており、その位置占めは、構造体メンバのアドレスが
インタプリタスタック60の最上部にある時点にこのコ
マンドが評価されることが可能となるような仕方でなさ
れる。
【0238】ステップ1048において評価器35が、
サイズ情報および検索により取り出されたアドレス情報
に基づいて、ポインタについての有効領域範囲を計算
し、それからステップ1050において、状態フラグを
「境界あり」にセットする。ステップ1052におい
て、割り当てられるポインタについて定義された情報が
ポインタ検査表200の適切な横列に追加される。その
後、手順はステップ800(図13)において「実行時
エラー検査プロセス」に戻る。
サイズ情報および検索により取り出されたアドレス情報
に基づいて、ポインタについての有効領域範囲を計算
し、それからステップ1050において、状態フラグを
「境界あり」にセットする。ステップ1052におい
て、割り当てられるポインタについて定義された情報が
ポインタ検査表200の適切な横列に追加される。その
後、手順はステップ800(図13)において「実行時
エラー検査プロセス」に戻る。
【0239】もしステップ1044において、ノードが
「readintstk」コマンドを構造体メンバのサ
イズとともに含まないと判断された場合、手順はステッ
プ1060(図17)に進む。
「readintstk」コマンドを構造体メンバのサ
イズとともに含まないと判断された場合、手順はステッ
プ1060(図17)に進む。
【0240】ステップ1060においては、ノードが
「rdptrstk」コマンドを含むかどうかを定める
テストが行われる。もしステップ1060において、ノ
ードが「rdptrstk」コマンドを含むと判断され
た場合、ステップ1064において評価器35が、ポイ
ンタ保存スタック65の内容を検索により取り出す。
「rdptrstk」コマンドを含むかどうかを定める
テストが行われる。もしステップ1060において、ノ
ードが「rdptrstk」コマンドを含むと判断され
た場合、ステップ1064において評価器35が、ポイ
ンタ保存スタック65の内容を検索により取り出す。
【0241】上に述べたように、「rdptrstk」
コマンドが検出されたときには、連関する「savpt
r」コマンドがステップ825(図13)において既に
評価されており、これによってポインタ検査表200を
更新するために必要な適切なポインタ情報がポインタ保
存スタック65に入れられた。
コマンドが検出されたときには、連関する「savpt
r」コマンドがステップ825(図13)において既に
評価されており、これによってポインタ検査表200を
更新するために必要な適切なポインタ情報がポインタ保
存スタック65に入れられた。
【0242】ステップ1066においては、ポインタ保
存スタックが、関数を指示するポインタを含むかどうか
を定めるテストが行われる。このテストは、エラー検査
タスクを翻訳された原始コードとコンパイルされたライ
ブラリ関数とから構成されるソフトウェアプログラム上
でも稼動可能にするために実現される。
存スタックが、関数を指示するポインタを含むかどうか
を定めるテストが行われる。このテストは、エラー検査
タスクを翻訳された原始コードとコンパイルされたライ
ブラリ関数とから構成されるソフトウェアプログラム上
でも稼動可能にするために実現される。
【0243】なお、もしポインタ保存スタック65が、
呼び出された関数へポインタ情報を送るために(ステッ
プ545およびステップ547)、または呼び出された
関数からポインタ情報を返すために(ステップ550お
よびステップ552)用いられる場合には、関数を指示
するポインタは、読み出し時において「savptr」
コマンドに含まれる。
呼び出された関数へポインタ情報を送るために(ステッ
プ545およびステップ547)、または呼び出された
関数からポインタ情報を返すために(ステップ550お
よびステップ552)用いられる場合には、関数を指示
するポインタは、読み出し時において「savptr」
コマンドに含まれる。
【0244】関数を指示するポインタは、呼び出された
関数へポインタ情報を送る場合はにポインタ保存スタッ
ク65からポインタ情報を受け取るべき関数を識別特定
し、または、呼び出し側関数へポインタ情報を返す場合
にはポインタ保存スタック65にポインタ情報を入れた
関数を識別特定する。
関数へポインタ情報を送る場合はにポインタ保存スタッ
ク65からポインタ情報を受け取るべき関数を識別特定
し、または、呼び出し側関数へポインタ情報を返す場合
にはポインタ保存スタック65にポインタ情報を入れた
関数を識別特定する。
【0245】もしステップ1066において、ポインタ
保存スタックが、関数を指示するポインタを含まないと
判断された場合、ポインタ保存スタック65におけるポ
インタ情報の有効性をテストする必要はなく、手順は下
に述べるステップ1080に進む。
保存スタックが、関数を指示するポインタを含まないと
判断された場合、ポインタ保存スタック65におけるポ
インタ情報の有効性をテストする必要はなく、手順は下
に述べるステップ1080に進む。
【0246】もしステップ1066において、ポインタ
保存スタックが、関数を指示するポインタを含むと判断
された場合には、関数を指示するポインタの有効性をテ
ストする必要がある。すなわちステップ1068におい
て、ポインタ保存スタック65が、呼び出された関数へ
ポインタ情報を送るために用いられているかまたは呼び
出された関数からポインタ情報を返すために用いられて
いるかを定めるためのテストが行われる。
保存スタックが、関数を指示するポインタを含むと判断
された場合には、関数を指示するポインタの有効性をテ
ストする必要がある。すなわちステップ1068におい
て、ポインタ保存スタック65が、呼び出された関数へ
ポインタ情報を送るために用いられているかまたは呼び
出された関数からポインタ情報を返すために用いられて
いるかを定めるためのテストが行われる。
【0247】もしステップ1068において、ポインタ
保存スタック65が、呼び出された関数へポインタ情報
を送るために用いられていると判断された場合、送られ
たポインタ情報が、呼び出された関数によって検索によ
り取り出せるように呼び出し側関数によってポインタ保
存スタック65に入れられたことを確認するために、ス
テップ1070において、検索により取り出された関数
指示ポインタが、現に実行中の関数のアドレスに等しい
かどうかがを定めるテストが行われる。
保存スタック65が、呼び出された関数へポインタ情報
を送るために用いられていると判断された場合、送られ
たポインタ情報が、呼び出された関数によって検索によ
り取り出せるように呼び出し側関数によってポインタ保
存スタック65に入れられたことを確認するために、ス
テップ1070において、検索により取り出された関数
指示ポインタが、現に実行中の関数のアドレスに等しい
かどうかがを定めるテストが行われる。
【0248】もしステップ1070において、検索によ
り取り出された関数指示ポインタが、現に実行中の関数
のアドレスに等しくないと判断された場合、ポインタ保
存スタック65からのポインタ情報は、ポインタ検査表
200に入れるべきではない。そして手順はステップ8
00(図13)において、「実行時エラー検査プロセ
ス」に戻る。
り取り出された関数指示ポインタが、現に実行中の関数
のアドレスに等しくないと判断された場合、ポインタ保
存スタック65からのポインタ情報は、ポインタ検査表
200に入れるべきではない。そして手順はステップ8
00(図13)において、「実行時エラー検査プロセ
ス」に戻る。
【0249】もしステップ1070において、検索によ
り取り出された関数指示ポインタが、現に実行中の関数
のアドレスに等しいと判断された場合、ポインタ保存ス
タック65からのポインタ情報は、ステップ1080に
おいてポインタ検査表200に入れるべきである。その
後、手順はステップ800(図13)において「実行時
エラー検査プロセス」に戻る。
り取り出された関数指示ポインタが、現に実行中の関数
のアドレスに等しいと判断された場合、ポインタ保存ス
タック65からのポインタ情報は、ステップ1080に
おいてポインタ検査表200に入れるべきである。その
後、手順はステップ800(図13)において「実行時
エラー検査プロセス」に戻る。
【0250】もしステップ1068において、ポインタ
保存スタック65が、呼び出し側関数へポインタ情報を
返すために用いられていると判断された場合、ポインタ
情報が、呼び出し側関数によって検索して取り出せるよ
うに呼び出された関数によってポインタ保存スタック6
5に入れられたことを確認するために、ステップ107
4において、検索により取り出された関数指示ポインタ
が、今実行を完了したばかりの関数のアドレス、すなわ
ち呼び出された関数のアドレスに等しいかどうかがを定
めるテストが行われる。
保存スタック65が、呼び出し側関数へポインタ情報を
返すために用いられていると判断された場合、ポインタ
情報が、呼び出し側関数によって検索して取り出せるよ
うに呼び出された関数によってポインタ保存スタック6
5に入れられたことを確認するために、ステップ107
4において、検索により取り出された関数指示ポインタ
が、今実行を完了したばかりの関数のアドレス、すなわ
ち呼び出された関数のアドレスに等しいかどうかがを定
めるテストが行われる。
【0251】もしステップ1074において、検索によ
り取り出された関数指示ポインタが、今実行を完了した
ばかりの関数のアドレスに等しくないと判断された場
合、ポインタ保存スタック65からのポインタ情報は、
ポインタ検査表200に入れるべきではない。そして手
順はステップ800(図13)において、「実行時エラ
ー検査プロセス」に戻る。
り取り出された関数指示ポインタが、今実行を完了した
ばかりの関数のアドレスに等しくないと判断された場
合、ポインタ保存スタック65からのポインタ情報は、
ポインタ検査表200に入れるべきではない。そして手
順はステップ800(図13)において、「実行時エラ
ー検査プロセス」に戻る。
【0252】もしステップ1074において、検索によ
り取り出された関数指示ポインタが、今実行を完了した
ばかりの関数のアドレスに等しいと判断された場合、ポ
インタ保存スタック65からのポインタ情報は、ステッ
プ1080においてポインタ検査表200に入れるべき
である。その後、手順はステップ800(図13)にお
いて「実行時エラー検査プロセス」に戻る。
り取り出された関数指示ポインタが、今実行を完了した
ばかりの関数のアドレスに等しいと判断された場合、ポ
インタ保存スタック65からのポインタ情報は、ステッ
プ1080においてポインタ検査表200に入れるべき
である。その後、手順はステップ800(図13)にお
いて「実行時エラー検査プロセス」に戻る。
【0253】ステップ1080においてポインタ検査表
200が、ステップ1064においてポインタ保存スタ
ック65から検索により取り出されたポインタ情報を用
いて更新される。その後、手順はステップ800(図1
3)において「実行時エラー検査プロセス」に戻る。
200が、ステップ1064においてポインタ保存スタ
ック65から検索により取り出されたポインタ情報を用
いて更新される。その後、手順はステップ800(図1
3)において「実行時エラー検査プロセス」に戻る。
【0254】もしステップ1060において、ノードが
「rdptrstk」コマンドを含まないと判断された
場合、手順はステップ1090に進む。
「rdptrstk」コマンドを含まないと判断された
場合、手順はステップ1090に進む。
【0255】ステップ1090においては、ノードが
「不明」の状態表示を含むかどうかを定めるテストが行
われる。もしステップ1090において、ノードが「不
明」の状態表示を含むと判断された場合、ステップ10
92において評価器35が、状態フラグを「不明」にセ
ットし、それから、割り当てられるポインタについて定
義された情報がステップ1094において、ポインタ検
査表200の適切な横列に追加される。
「不明」の状態表示を含むかどうかを定めるテストが行
われる。もしステップ1090において、ノードが「不
明」の状態表示を含むと判断された場合、ステップ10
92において評価器35が、状態フラグを「不明」にセ
ットし、それから、割り当てられるポインタについて定
義された情報がステップ1094において、ポインタ検
査表200の適切な横列に追加される。
【0256】その後、手順はステップ800(図13)
において「実行時エラー検査プロセス」に戻る。
において「実行時エラー検査プロセス」に戻る。
【0257】もしステップ1090(図17)におい
て、ノードが「不明」の状態表示を含まないと判断され
た場合、手順はステップ1096に進む。
て、ノードが「不明」の状態表示を含まないと判断され
た場合、手順はステップ1096に進む。
【0258】もし手順がステップ1096に到達した場
合、「tblupd」ノードは、上に設定されたテスト
のうちのどれに基づく特徴付けもできないことになる。
したがって、ステップ1096においてエラーメッセー
ジが生成され、その後、手順はステップ1098におい
て「実行時ポインタ検査表更新サブルーチン」から出
て、サブルーチンが終了する。
合、「tblupd」ノードは、上に設定されたテスト
のうちのどれに基づく特徴付けもできないことになる。
したがって、ステップ1096においてエラーメッセー
ジが生成され、その後、手順はステップ1098におい
て「実行時ポインタ検査表更新サブルーチン」から出
て、サブルーチンが終了する。
【0259】実行時エラー検査プロセスによって評価中
の内部疑似コードのノードが「ptrchk」コマンド
を有することがステップ840(図13)において検出
された場合、手順はステップ1104において、図18
および図19に示す「実行時ポインタ検査サブルーチ
ン」に入る。上に述べたように、「実行時ポインタ検査
サブルーチン」は、関連解除される各ポインタの有効性
のテストを行う。
の内部疑似コードのノードが「ptrchk」コマンド
を有することがステップ840(図13)において検出
された場合、手順はステップ1104において、図18
および図19に示す「実行時ポインタ検査サブルーチ
ン」に入る。上に述べたように、「実行時ポインタ検査
サブルーチン」は、関連解除される各ポインタの有効性
のテストを行う。
【0260】ステップ1104において、検査されるポ
インタのアドレスを検索により取り出すために評価器3
5が、インタプリタスタック60にアクセスする。上に
述べたように、「ptrchk」コマンドは、実行時に
おいて評価されているとき、検査されているポインタの
アドレスがインタプリタスタック60の最上部に来るよ
うな仕方で、パーズ木の中に位置させる。
インタのアドレスを検索により取り出すために評価器3
5が、インタプリタスタック60にアクセスする。上に
述べたように、「ptrchk」コマンドは、実行時に
おいて評価されているとき、検査されているポインタの
アドレスがインタプリタスタック60の最上部に来るよ
うな仕方で、パーズ木の中に位置させる。
【0261】ステップ1108において評価器35が、
ステップ1104においてインタプリタスタック60か
ら検索により取り出されたポインタアドレスを利用し
て、検査されているポインタに対するポインタ検査表2
00内の横列を探索する。
ステップ1104においてインタプリタスタック60か
ら検索により取り出されたポインタアドレスを利用し
て、検査されているポインタに対するポインタ検査表2
00内の横列を探索する。
【0262】ステップ1112において、検査されてい
るポインタに対するポインタ検査表200内の状態エン
トリ260が「PFUNF」にセットされているかどう
かを定めるためのテストが行われる。もしステップ11
12において、状態エントリ260が「関数指示」にセ
ットされていると判断された場合、ステップ1116に
おいて関数のアドレスが内部記号表75から検索により
取り出される。
るポインタに対するポインタ検査表200内の状態エン
トリ260が「PFUNF」にセットされているかどう
かを定めるためのテストが行われる。もしステップ11
12において、状態エントリ260が「関数指示」にセ
ットされていると判断された場合、ステップ1116に
おいて関数のアドレスが内部記号表75から検索により
取り出される。
【0263】ステップ1120においてポインタ検査表
200内のポインタ内容エントリ240が、内部記号表
75から検索により取り出されたアドレスによって書き
直される。このルーチンは、翻訳器15にロードされた
最新版の関数が実行されることを確実にするために実現
される。その後、手順はステップ1124に進む。
200内のポインタ内容エントリ240が、内部記号表
75から検索により取り出されたアドレスによって書き
直される。このルーチンは、翻訳器15にロードされた
最新版の関数が実行されることを確実にするために実現
される。その後、手順はステップ1124に進む。
【0264】ステップ1124において、ポインタ検査
表200内のポインタ内容エントリ240に記録されて
いる値が、ポインタの実際の内容に等しいかどうかを定
めるためのテストが行われるのが好ましい。この好まし
い実施例においては、評価器35が知らずに、「コンパ
イルされたコード」によって行われたポインタ修正を検
出するために、上記ラッパ関数実現例に追補されるメカ
ニズムが設けられる。評価器35が前の修正を知らなか
ったので、ポインタ検査表200は適切な更新が行われ
なかった。
表200内のポインタ内容エントリ240に記録されて
いる値が、ポインタの実際の内容に等しいかどうかを定
めるためのテストが行われるのが好ましい。この好まし
い実施例においては、評価器35が知らずに、「コンパ
イルされたコード」によって行われたポインタ修正を検
出するために、上記ラッパ関数実現例に追補されるメカ
ニズムが設けられる。評価器35が前の修正を知らなか
ったので、ポインタ検査表200は適切な更新が行われ
なかった。
【0265】もしステップ1124において、これらの
値が等しくないと判断された場合、このポインタについ
て前に検出されなかった修正が発生していることにな
る。この修正は「コンパイルされたコード」によって有
効正当に行われたものと仮定する。
値が等しくないと判断された場合、このポインタについ
て前に検出されなかった修正が発生していることにな
る。この修正は「コンパイルされたコード」によって有
効正当に行われたものと仮定する。
【0266】そして、ステップ1128において、検査
されるポインタについて状態フラグが「不明」にセット
され、それ以上の追加検査は行われない。このようにし
て、「コンパイルされたコード」による有効なポインタ
修正についての誤った警告が防止される。その後、手順
はステップ800(図13)において「実行時エラー検
査プロセス」に戻る。
されるポインタについて状態フラグが「不明」にセット
され、それ以上の追加検査は行われない。このようにし
て、「コンパイルされたコード」による有効なポインタ
修正についての誤った警告が防止される。その後、手順
はステップ800(図13)において「実行時エラー検
査プロセス」に戻る。
【0267】もしステップ1124において、記録され
ている内容がポインタの実際の内容に等しいと判断され
た場合、手順はステップ1132に進む。
ている内容がポインタの実際の内容に等しいと判断され
た場合、手順はステップ1132に進む。
【0268】ステップ1132において、検査されるポ
インタについてポインタ検査表200内の状態エントリ
260が「不正」とセットされているかどうかを定める
ためのテストが行われる。もしステップ1132におい
て、状態が「不正」とセットされていると判断された場
合、一定ゼロ値または負数のポインタが関連解除される
というエラーが今発生していることになる。その結果、
手順は、図22を参照して下に述べる診断サブルーチン
に進む。
インタについてポインタ検査表200内の状態エントリ
260が「不正」とセットされているかどうかを定める
ためのテストが行われる。もしステップ1132におい
て、状態が「不正」とセットされていると判断された場
合、一定ゼロ値または負数のポインタが関連解除される
というエラーが今発生していることになる。その結果、
手順は、図22を参照して下に述べる診断サブルーチン
に進む。
【0269】もしステップ1132において、状態が
「不正」とセットされていないと判断された場合、手順
はステップ1140(図19)に進む。
「不正」とセットされていないと判断された場合、手順
はステップ1140(図19)に進む。
【0270】ステップ1140(図19)においては、
検査されるポインタについてポインタ検査表200内の
状態エントリ260が「解放」とセットされているかど
うかを定めるためのテストが行われる。
検査されるポインタについてポインタ検査表200内の
状態エントリ260が「解放」とセットされているかど
うかを定めるためのテストが行われる。
【0271】もしステップ1140において、状態が
「解放」にセットされていると判断された場合には、割
付を解除されていたメモリがアクセスされているという
不適切な状態、すなわち解放メモリアクセスエラーが発
生していることになる。その結果、手順は、図22を参
照して下に述べる診断サブルーチンに進む。
「解放」にセットされていると判断された場合には、割
付を解除されていたメモリがアクセスされているという
不適切な状態、すなわち解放メモリアクセスエラーが発
生していることになる。その結果、手順は、図22を参
照して下に述べる診断サブルーチンに進む。
【0272】もしステップ1140において、状態が
「解放」にセットされていないと判断された場合には、
手順はステップ1148に進む。
「解放」にセットされていないと判断された場合には、
手順はステップ1148に進む。
【0273】ステップ1148において、検査されるポ
インタについてポインタ検査表200内の状態エントリ
260が「境界あり」とセットされているかどうかを定
めるためのテストが行われる。
インタについてポインタ検査表200内の状態エントリ
260が「境界あり」とセットされているかどうかを定
めるためのテストが行われる。
【0274】もしステップ1148において、状態が
「境界あり」にセットされていると判断された場合に
は、ステップ1152において、検査されているポイン
タの実際の内容が、検査されているポインタについての
ポインタ検査表200の有効メモリ境界エントリ250
a、250bに定められるような有効領域範囲内にある
かどうかを定めるためのテストが行われる。
「境界あり」にセットされていると判断された場合に
は、ステップ1152において、検査されているポイン
タの実際の内容が、検査されているポインタについての
ポインタ検査表200の有効メモリ境界エントリ250
a、250bに定められるような有効領域範囲内にある
かどうかを定めるためのテストが行われる。
【0275】もしステップ1152において、検査され
ているポインタの、検索により取り出されたポインタ値
が、有効領域範囲内にあると判断された場合、手順はス
テップ800(図13)において「実行時エラー検査プ
ロセス」に戻る。
ているポインタの、検索により取り出されたポインタ値
が、有効領域範囲内にあると判断された場合、手順はス
テップ800(図13)において「実行時エラー検査プ
ロセス」に戻る。
【0276】しかし、もしステップ1152において、
検索により取り出されたポインタ値が有効領域範囲内に
ないと判断された場合には、メモリアクセスエラーが発
生している。その結果、手順は、図22を参照して下に
述べる診断サブルーチンに進む。
検索により取り出されたポインタ値が有効領域範囲内に
ないと判断された場合には、メモリアクセスエラーが発
生している。その結果、手順は、図22を参照して下に
述べる診断サブルーチンに進む。
【0277】もしステップ1148において、状態が
「境界あり」にセットされていないと判断された場合に
は、手順はステップ1160に進む。
「境界あり」にセットされていないと判断された場合に
は、手順はステップ1160に進む。
【0278】ステップ1160においては、検査される
ポインタについてポインタ検査表200内の状態エント
リ260が「割付済」にセットされているかどうかを定
めるためのテストが行われる。
ポインタについてポインタ検査表200内の状態エント
リ260が「割付済」にセットされているかどうかを定
めるためのテストが行われる。
【0279】もしステップ1160において、状態が
「割付済」にセットされていると判断された場合には、
ステップ1162において、ポインタの内容が、図6に
示す連関するメモリ割付構造体280の下側および上側
境界エントリ282、284によって定義されるような
割付されたメモリの有効な領域範囲の中にあるかどうか
を定めるためのテストが行われる。
「割付済」にセットされていると判断された場合には、
ステップ1162において、ポインタの内容が、図6に
示す連関するメモリ割付構造体280の下側および上側
境界エントリ282、284によって定義されるような
割付されたメモリの有効な領域範囲の中にあるかどうか
を定めるためのテストが行われる。
【0280】もしステップ1162において、ポインタ
の内容が、割付されたメモリについての有効な領域範囲
の中にないと判断された場合には、メモリアクセスエラ
ーが発生している。その結果、手順は、図22を参照し
て下に述べる診断サブルーチンに進む。
の内容が、割付されたメモリについての有効な領域範囲
の中にないと判断された場合には、メモリアクセスエラ
ーが発生している。その結果、手順は、図22を参照し
て下に述べる診断サブルーチンに進む。
【0281】もしステップ1162において、ポインタ
の内容が、割付されたメモリについての有効な領域範囲
の中にあると判断された場合には、ステップ1164に
おいて、ポインタが、割付されたメモリに対して読み出
しまたは書き込みを行うために関連解除されるかどうか
を定めるためのテストが行われる。
の内容が、割付されたメモリについての有効な領域範囲
の中にあると判断された場合には、ステップ1164に
おいて、ポインタが、割付されたメモリに対して読み出
しまたは書き込みを行うために関連解除されるかどうか
を定めるためのテストが行われる。
【0282】もしステップ1164において、ポインタ
が、割付されたメモリに対して書き込みを行うために関
連解除されると判断された場合、上に述べた初期化ビッ
トベクトル288の適切なビットが、ステップ1168
において、割付されたメモリのうちの対応するバイトの
新たな初期化状態を表示するように更新される。その
後、手順はステップ800(図13)において「実行時
エラー検査プロセス」に戻る。
が、割付されたメモリに対して書き込みを行うために関
連解除されると判断された場合、上に述べた初期化ビッ
トベクトル288の適切なビットが、ステップ1168
において、割付されたメモリのうちの対応するバイトの
新たな初期化状態を表示するように更新される。その
後、手順はステップ800(図13)において「実行時
エラー検査プロセス」に戻る。
【0283】もしステップ1164において、ポインタ
が、割付されたメモリに対して読み出しを行うために関
連解除されると判断された場合、ステップ1172にお
いて、割付されたメモリのうちの対応するバイトが初期
化されているかどうかを定めるために、初期化ビットベ
クトル288の適切なビットがアクセスされる。
が、割付されたメモリに対して読み出しを行うために関
連解除されると判断された場合、ステップ1172にお
いて、割付されたメモリのうちの対応するバイトが初期
化されているかどうかを定めるために、初期化ビットベ
クトル288の適切なビットがアクセスされる。
【0284】ステップ1174において、読み出しが行
われる割付されたバイトが初期化されているかどうかを
定めるためのテストが行われる。もしステップ1174
において、これらのバイトが初期化されていないと判断
された場合には、メモリアクセスエラーが発生してい
る。その結果、手順は、図22を参照して下に述べる診
断サブルーチンに進む。
われる割付されたバイトが初期化されているかどうかを
定めるためのテストが行われる。もしステップ1174
において、これらのバイトが初期化されていないと判断
された場合には、メモリアクセスエラーが発生してい
る。その結果、手順は、図22を参照して下に述べる診
断サブルーチンに進む。
【0285】もしステップ1174において、これらの
バイトが初期化されていると判断された場合には、手順
はステップ800(図13)において「実行時エラー検
査プロセス」に戻る。
バイトが初期化されていると判断された場合には、手順
はステップ800(図13)において「実行時エラー検
査プロセス」に戻る。
【0286】もしステップ1160において、状態が
「割付済」にセットされていないと判断された場合に
は、手順はステップ1176に進む。もし手順がステッ
プ1176に到達した場合、状態エントリ260(図
2)に記録されている情報は、上に設定されたテストの
うちのどれに基づく特徴付けもできないことになる。し
たがって、ステップ1176においてエラーメッセージ
が生成され、その後、手順は「実行時ポインタ検査サブ
ルーチン」から出て、サブルーチンが終了する。
「割付済」にセットされていないと判断された場合に
は、手順はステップ1176に進む。もし手順がステッ
プ1176に到達した場合、状態エントリ260(図
2)に記録されている情報は、上に設定されたテストの
うちのどれに基づく特徴付けもできないことになる。し
たがって、ステップ1176においてエラーメッセージ
が生成され、その後、手順は「実行時ポインタ検査サブ
ルーチン」から出て、サブルーチンが終了する。
【0287】実行時エラー検査プロセスによって評価中
の内部疑似コードのノードが、「コンパイルされた関
数」についての「call」(呼び出し)コマンドを有
することがステップ850(図13)において検出され
た場合、手順はステップ1202において、図20に示
す「「コンパイルされた関数」エラー検査プロセス」に
入る。
の内部疑似コードのノードが、「コンパイルされた関
数」についての「call」(呼び出し)コマンドを有
することがステップ850(図13)において検出され
た場合、手順はステップ1202において、図20に示
す「「コンパイルされた関数」エラー検査プロセス」に
入る。
【0288】もし呼び出された「コンパイルされた関
数」が下にさらに述べるように割付されたメモリ領域へ
のアクセスを有する場合に、「「コンパイルされた関
数」エラー検査プロセス」によって、与えられた「コン
パイルされた関数」に連関する「ラッパ関数」を起動す
るためおよび図21に示す初期化ビットベクトル維持サ
ブルーチンを起動するためのメカニズムが得られる。
数」が下にさらに述べるように割付されたメモリ領域へ
のアクセスを有する場合に、「「コンパイルされた関
数」エラー検査プロセス」によって、与えられた「コン
パイルされた関数」に連関する「ラッパ関数」を起動す
るためおよび図21に示す初期化ビットベクトル維持サ
ブルーチンを起動するためのメカニズムが得られる。
【0289】ステップ1202において、呼び出された
「コンパイルされた関数」が、連関する「実行前ラッパ
関数」を有するかどうかを定めるためのテストが、
「「コンパイルされた関数」エラー検査プロセス」によ
って行われる。
「コンパイルされた関数」が、連関する「実行前ラッパ
関数」を有するかどうかを定めるためのテストが、
「「コンパイルされた関数」エラー検査プロセス」によ
って行われる。
【0290】もしステップ1202において、呼び出さ
れた「コンパイルされた関数」が、連関する「実行前ラ
ッパ関数」を有すると判断された場合、上に述べたよう
な、必要なポインタ検査およびその他の関数を行うため
に、ステップ1204において、「実行前ラッパ関数」
が実行される。「実行前ラッパ関数」は、連関する「コ
ンパイルされた目的コード関数」と同じ引数を送られ
る。その後、手順はステップ1205に進む。
れた「コンパイルされた関数」が、連関する「実行前ラ
ッパ関数」を有すると判断された場合、上に述べたよう
な、必要なポインタ検査およびその他の関数を行うため
に、ステップ1204において、「実行前ラッパ関数」
が実行される。「実行前ラッパ関数」は、連関する「コ
ンパイルされた目的コード関数」と同じ引数を送られ
る。その後、手順はステップ1205に進む。
【0291】もしステップ1202において、呼び出さ
れた「コンパイルされた関数」が、連関する「実行前ラ
ッパ関数」を有しないと判断された場合、手順はステッ
プ1205に進む。
れた「コンパイルされた関数」が、連関する「実行前ラ
ッパ関数」を有しないと判断された場合、手順はステッ
プ1205に進む。
【0292】ステップ1205においては、割付アクセ
スフラグが、呼び出された「コンパイルされた関数」に
対応する内部記号表75内のエントリにセットされてい
るかどうかを定めるためのテストが行われる。割付アク
セスフラグは、もしこの関数が割付されたメモリのどれ
かにアクセスを有する場合にステップ337において読
み出し時にセットされた。
スフラグが、呼び出された「コンパイルされた関数」に
対応する内部記号表75内のエントリにセットされてい
るかどうかを定めるためのテストが行われる。割付アク
セスフラグは、もしこの関数が割付されたメモリのどれ
かにアクセスを有する場合にステップ337において読
み出し時にセットされた。
【0293】もしステップ1205において、割付アク
セスフラグがセットされていると判断された場合、ステ
ップ1207において、図21に示す「初期化ビットベ
クトル維持サブルーチン」が実行される。手順がステッ
プ1210においてこのサブルーチンに入ることで開始
されるこの「初期化ビットベクトル維持サブルーチン」
によって、翻訳器15によっては通常に検出されない割
付されたメモリの初期化の「コンパイルされた関数」に
よる検出のためのメカニズムが得られる。
セスフラグがセットされていると判断された場合、ステ
ップ1207において、図21に示す「初期化ビットベ
クトル維持サブルーチン」が実行される。手順がステッ
プ1210においてこのサブルーチンに入ることで開始
されるこの「初期化ビットベクトル維持サブルーチン」
によって、翻訳器15によっては通常に検出されない割
付されたメモリの初期化の「コンパイルされた関数」に
よる検出のためのメカニズムが得られる。
【0294】なお、割付されたメモリの「翻訳された関
数」による初期化は、図19に示す「実行時ポインタ検
査サブルーチン」のステップ1164およびステップ1
168の実行時に検出される。このようにして、初期化
ビットベクトル288は、初期化が「コンパイルされた
関数」または「翻訳された関数」のいずれによって行わ
れたかに関係なく、割付されたメモリ領域の各対応する
バイトの初期化状態を適切に記録する。
数」による初期化は、図19に示す「実行時ポインタ検
査サブルーチン」のステップ1164およびステップ1
168の実行時に検出される。このようにして、初期化
ビットベクトル288は、初期化が「コンパイルされた
関数」または「翻訳された関数」のいずれによって行わ
れたかに関係なく、割付されたメモリ領域の各対応する
バイトの初期化状態を適切に記録する。
【0295】上に述べたように、本発明の好ましい実施
例においては、メモリ初期化の検出を容易にするため
に、初期化されていない自動変数および割付されたメモ
リ領域がすべて、例えば「FFFA 5A5A」のよう
な既知の4バイトの16進語」によって事前マーク付け
される。
例においては、メモリ初期化の検出を容易にするため
に、初期化されていない自動変数および割付されたメモ
リ領域がすべて、例えば「FFFA 5A5A」のよう
な既知の4バイトの16進語」によって事前マーク付け
される。
【0296】ステップ1210(21図)において「コ
ンパイルされた関数」が呼び出された時点に、初期化さ
れていない対応するバイトのすべてを識別特定するため
に、評価器35が、「コンパイルされた関数」によって
アクセスされる割付されたバイトに対応する初期化ビッ
トベクトル288(図6)の各ビットの解析を行う。
ンパイルされた関数」が呼び出された時点に、初期化さ
れていない対応するバイトのすべてを識別特定するため
に、評価器35が、「コンパイルされた関数」によって
アクセスされる割付されたバイトに対応する初期化ビッ
トベクトル288(図6)の各ビットの解析を行う。
【0297】それから、「コンパイルされたコード」に
よってアクセスされる初期化されていない対応するバイ
トのすべてを識別特定するために、ステップ1220に
おいて評価器35が、巡回冗長テスト(CRCテスト)
を行う。ステップ1225において、「コンパイルされ
た関数」が適切な引数で呼び出され、実行される。
よってアクセスされる初期化されていない対応するバイ
トのすべてを識別特定するために、ステップ1220に
おいて評価器35が、巡回冗長テスト(CRCテスト)
を行う。ステップ1225において、「コンパイルされ
た関数」が適切な引数で呼び出され、実行される。
【0298】「コンパイルされたコード」の実行に続い
て、手順はステップ1230に進み、ここで、「コンパ
イルされたコード」の実行前には「コンパイルされたコ
ード」がアクセスでき初期化されていなかったバイトの
すべてに対して第2のCRCテストが行われる。
て、手順はステップ1230に進み、ここで、「コンパ
イルされたコード」の実行前には「コンパイルされたコ
ード」がアクセスでき初期化されていなかったバイトの
すべてに対して第2のCRCテストが行われる。
【0299】次にステップ1235において、CRCテ
ストによってバイトの値が変化したものがあるかどう
か、ステップ1220において行われたCRCテストの
結果が、ステップ1230において行われたCRCテス
トの結果に等しいかどうか、を定めるためのテストが行
われる。もしステップ1235において、これら2つの
CRCテスト値が等しくないと判断された場合には、手
順はステップ1240に進む。
ストによってバイトの値が変化したものがあるかどう
か、ステップ1220において行われたCRCテストの
結果が、ステップ1230において行われたCRCテス
トの結果に等しいかどうか、を定めるためのテストが行
われる。もしステップ1235において、これら2つの
CRCテスト値が等しくないと判断された場合には、手
順はステップ1240に進む。
【0300】ステップ1240においては、割付された
メモリのブロック全体を「初期化済」とマーク付けすべ
きかどうか、または初期化されたブロック内のバイトだ
けを「初期化済」とマーク付けすべきかについて定める
ために、ユーザによって定義されたフラグ(ユーザ定義
フラグ)が解析される。ユーザ定義フラグは、各ソフト
ウェアデバッグ処理プロセスの開始時にユーザによって
セットされるのが好ましい。
メモリのブロック全体を「初期化済」とマーク付けすべ
きかどうか、または初期化されたブロック内のバイトだ
けを「初期化済」とマーク付けすべきかについて定める
ために、ユーザによって定義されたフラグ(ユーザ定義
フラグ)が解析される。ユーザ定義フラグは、各ソフト
ウェアデバッグ処理プロセスの開始時にユーザによって
セットされるのが好ましい。
【0301】このユーザ定義フラグによって、ユーザ
は、「コンパイルされた関数」がメモリを既知の事前マ
ークされた16進値で初期化する結果、すなわちメモリ
を16進値「FFFA 5A5A」で初期化する結果か
ら来る誤ったエラー発生警告を防止することが可能とな
る。
は、「コンパイルされた関数」がメモリを既知の事前マ
ークされた16進値で初期化する結果、すなわちメモリ
を16進値「FFFA 5A5A」で初期化する結果か
ら来る誤ったエラー発生警告を防止することが可能とな
る。
【0302】次にステップ1245において、割付され
たメモリのブロック全体を、初期化状態(ただ1個のバ
イトしか「コンパイルされたコード」によって初期化さ
れなかったような初期化状態も含む)としてマーク付け
すべきことを表すようにユーザ定義フラグがセットされ
ているかどうか、または代わりに、初期化されていると
判断されたバイトだけを初期化状態としてマーク付けす
べきであると指定されているかどうか、を定めるための
テストが行われる。
たメモリのブロック全体を、初期化状態(ただ1個のバ
イトしか「コンパイルされたコード」によって初期化さ
れなかったような初期化状態も含む)としてマーク付け
すべきことを表すようにユーザ定義フラグがセットされ
ているかどうか、または代わりに、初期化されていると
判断されたバイトだけを初期化状態としてマーク付けす
べきであると指定されているかどうか、を定めるための
テストが行われる。
【0303】もしステップ1245において、ユーザ
が、割付されたメモリブロック全体を初期化状態として
マーク付けすべきことを指定している、と判断された場
合には、ステップ1250において、初期化ビットベク
トル288内の各ビットが、初期化状態を表すように更
新される。
が、割付されたメモリブロック全体を初期化状態として
マーク付けすべきことを指定している、と判断された場
合には、ステップ1250において、初期化ビットベク
トル288内の各ビットが、初期化状態を表すように更
新される。
【0304】もしステップ1245において、ユーザ
が、実際に初期化されているバイトだけを初期化状態と
してマーク付けすべきことを指定している、と判断され
た場合には、手順はステップ1255に進む。
が、実際に初期化されているバイトだけを初期化状態と
してマーク付けすべきことを指定している、と判断され
た場合には、手順はステップ1255に進む。
【0305】このステップ1255においては、割付さ
れたメモリ領域において「FFFA5A5A」以外の内
容を有する4バイトブロックの各々、すなわちもはや既
知の事前マーク値を持たないバイト、が識別特定され
る。その後、ステップ1258において、初期化ビット
ベクトル288内の対応するビットが、初期化状態を表
すように更新される。
れたメモリ領域において「FFFA5A5A」以外の内
容を有する4バイトブロックの各々、すなわちもはや既
知の事前マーク値を持たないバイト、が識別特定され
る。その後、ステップ1258において、初期化ビット
ベクトル288内の対応するビットが、初期化状態を表
すように更新される。
【0306】代わりの実施例においては、「コンパイル
された関数」がアクセスする初期化されていないメモリ
のすべてのバイトが、ステップ1225における「コン
パイルされたコード」の実行に先立ってセーブ(保存)
される。
された関数」がアクセスする初期化されていないメモリ
のすべてのバイトが、ステップ1225における「コン
パイルされたコード」の実行に先立ってセーブ(保存)
される。
【0307】この場合、もしステップ1235におい
て、「コンパイルされたコード」が割付されたメモリを
初期化していると判断されたならば、ステップ1255
において、初期化されておらず且つアクセス可能なバイ
トの内容を「コンパイルされた目的コード」の実行に先
立って記憶セーブされた値と比較することによって、初
期化されたバイトが識別特定される。この実施例におい
ては、割付されたメモリ領域を既知の値、すなわち16
進値「FFFA 5A5A」で事前マーク付けする必要
はない。
て、「コンパイルされたコード」が割付されたメモリを
初期化していると判断されたならば、ステップ1255
において、初期化されておらず且つアクセス可能なバイ
トの内容を「コンパイルされた目的コード」の実行に先
立って記憶セーブされた値と比較することによって、初
期化されたバイトが識別特定される。この実施例におい
ては、割付されたメモリ領域を既知の値、すなわち16
進値「FFFA 5A5A」で事前マーク付けする必要
はない。
【0308】ステップ1250またはステップ1258
の実行後、またはもしステップ1235において、「コ
ンパイルされたコード」が、割付されたメモリのどのバ
イトも初期化していないと判断された場合、手順はステ
ップ1265(図20)において「「コンパイルされた
関数」エラー検査プロセス」に戻る。
の実行後、またはもしステップ1235において、「コ
ンパイルされたコード」が、割付されたメモリのどのバ
イトも初期化していないと判断された場合、手順はステ
ップ1265(図20)において「「コンパイルされた
関数」エラー検査プロセス」に戻る。
【0309】もしステップ1205(図20)におい
て、割付アクセスフラグがセットされていないと判断さ
れた場合、呼び出された「コンパイルされた関数」は、
どの割付されたメモリにもアクセスできない。また「初
期化ビットベクトル維持サブルーチン」を実行する必要
がない。
て、割付アクセスフラグがセットされていないと判断さ
れた場合、呼び出された「コンパイルされた関数」は、
どの割付されたメモリにもアクセスできない。また「初
期化ビットベクトル維持サブルーチン」を実行する必要
がない。
【0310】したがって、もしフラグがセットされてい
ない場合には、「コンパイルされた目的コード」が適切
な引数で呼び出され、実行される。「コンパイルされた
目的コード」が実行された後、手順はステップ1265
(図20)において「「コンパイルされた関数」エラー
検査プロセス」に戻る。
ない場合には、「コンパイルされた目的コード」が適切
な引数で呼び出され、実行される。「コンパイルされた
目的コード」が実行された後、手順はステップ1265
(図20)において「「コンパイルされた関数」エラー
検査プロセス」に戻る。
【0311】ステップ1265においては、呼び出され
た「コンパイルされた関数」が連関する「実行後ラッパ
関数」を有するかどうかを定めるためのテストが、
「「コンパイルされた関数」エラー検査プロセス」によ
って行われる。
た「コンパイルされた関数」が連関する「実行後ラッパ
関数」を有するかどうかを定めるためのテストが、
「「コンパイルされた関数」エラー検査プロセス」によ
って行われる。
【0312】もしステップ1265において、呼び出さ
れた「コンパイルされた関数」が連関する「実行後ラッ
パ関数」を有すると判断された場合、ステップ1270
において、「実行後ラッパ関数」が、その連関する「コ
ンパイルされた目的コード関数」によって返された値で
実行される。
れた「コンパイルされた関数」が連関する「実行後ラッ
パ関数」を有すると判断された場合、ステップ1270
において、「実行後ラッパ関数」が、その連関する「コ
ンパイルされた目的コード関数」によって返された値で
実行される。
【0313】「実行後ラッパ関数」は、返されたまたは
形成されたポインタについて必要なポインタ検査表更新
タスク、および上に述べたようなその他必要なタスクを
行う。その後、手順はステップ800(図13)におい
て「実行時エラー検査プロセス」に戻る。
形成されたポインタについて必要なポインタ検査表更新
タスク、および上に述べたようなその他必要なタスクを
行う。その後、手順はステップ800(図13)におい
て「実行時エラー検査プロセス」に戻る。
【0314】もし図18および図19に示す「実行時ポ
インタ検査サブルーチン」の実行中にエラーが検出され
た場合、すなわちステップ1132、1140、115
2、1162、または1174のテスト条件が不成功だ
った場合、手順は、図22に示す診断サブルーチンに進
む。
インタ検査サブルーチン」の実行中にエラーが検出され
た場合、すなわちステップ1132、1140、115
2、1162、または1174のテスト条件が不成功だ
った場合、手順は、図22に示す診断サブルーチンに進
む。
【0315】手順がステップ1310において「診断サ
ブルーチン」に入ると、エラーメッセージが生成され
る。このエラーメッセージは、診断情報、すなわちメモ
リアクセスエラーの種類、およびポインタ検査表200
のファイル/ライン番号エントリ270から取り出され
た、ポインタに最後に修正が行われたライン番号、から
なる。
ブルーチン」に入ると、エラーメッセージが生成され
る。このエラーメッセージは、診断情報、すなわちメモ
リアクセスエラーの種類、およびポインタ検査表200
のファイル/ライン番号エントリ270から取り出され
た、ポインタに最後に修正が行われたライン番号、から
なる。
【0316】その後、プログラマは、検出されたエラー
を訂正するためにステップ1320において、上に述べ
たように読み出し期間の手段にアクセスできる。プログ
ラマによるエラー訂正が終ると、手順はステップ800
(図13)において「実行時エラー検査プロセス」に戻
る。
を訂正するためにステップ1320において、上に述べ
たように読み出し期間の手段にアクセスできる。プログ
ラマによるエラー訂正が終ると、手順はステップ800
(図13)において「実行時エラー検査プロセス」に戻
る。
【0317】[メモリ漏洩の特定および検出されていな
いポインタ修正のソースの特定]本発明の別の特徴によ
れば、メモリ漏洩、すなわち割付されたがもはやアクセ
ス不可能なメモリスペースが、自動的に、またはユーザ
がメモリ漏洩検出アルゴリズムを起動することによっ
て、検出される。
いポインタ修正のソースの特定]本発明の別の特徴によ
れば、メモリ漏洩、すなわち割付されたがもはやアクセ
ス不可能なメモリスペースが、自動的に、またはユーザ
がメモリ漏洩検出アルゴリズムを起動することによっ
て、検出される。
【0318】メモリ漏洩は一般に、割付されたメモリの
第1のブロックを指示するポインタが、第1のブロック
についての割付解除なしに、割付されたメモリの第2の
ブロックを指示するように再度割り当てられるときに生
じる。周知のように、メモリ漏洩は全体の動作性能の漸
増的な劣化をもたらす。
第1のブロックを指示するポインタが、第1のブロック
についての割付解除なしに、割付されたメモリの第2の
ブロックを指示するように再度割り当てられるときに生
じる。周知のように、メモリ漏洩は全体の動作性能の漸
増的な劣化をもたらす。
【0319】上に述べたように、「メモリ割付関数」に
よるメモリブロックの割付がされると、連関するメモリ
割付構造体280(図6)がその連関する「実行後ラッ
パ関数」によって形成されることが好ましい。メモリ割
付構造体280は、上に述べたような、割付されたメモ
リに関するある情報(例えば割付されたメモリのの中の
連関するブロックを現に指示するすべてのポインタのチ
ェインリスト部分286内のリスト)を記録する。
よるメモリブロックの割付がされると、連関するメモリ
割付構造体280(図6)がその連関する「実行後ラッ
パ関数」によって形成されることが好ましい。メモリ割
付構造体280は、上に述べたような、割付されたメモ
リに関するある情報(例えば割付されたメモリのの中の
連関するブロックを現に指示するすべてのポインタのチ
ェインリスト部分286内のリスト)を記録する。
【0320】上に述べたように、新たなポインタが、割
付されたメモリを指示するように割り当てられる都度、
その新たなポインタはチェインリストに追加される。同
様に、割付されたメモリの第1のブロックを前に指示し
たポインタが、割付されたメモリの第2のブロックを指
示するように再割当される都度、第2のブロックに連関
するチェインリストに追加される前に、第1のブロック
に連関するチェインリストから除去されることが好まし
い。
付されたメモリを指示するように割り当てられる都度、
その新たなポインタはチェインリストに追加される。同
様に、割付されたメモリの第1のブロックを前に指示し
たポインタが、割付されたメモリの第2のブロックを指
示するように再割当される都度、第2のブロックに連関
するチェインリストに追加される前に、第1のブロック
に連関するチェインリストから除去されることが好まし
い。
【0321】したがって、メモリ割付構造体280のチ
ェインリスト部分286に記録されている情報は、割り
付けられたメモリのうちの連関するブロックを現に指示
するポインタだけを表示する。そして、もしチェインリ
スト部分286の内容が空である場合には、割り付けら
れたメモリを指示するポインタで、割り付けられたメモ
リにアクセスするために用いられるようなポインタは存
在しない。すなわち、メモリ漏洩が発生しているわけ
で、エラーメッセージを生成する必要がある。
ェインリスト部分286に記録されている情報は、割り
付けられたメモリのうちの連関するブロックを現に指示
するポインタだけを表示する。そして、もしチェインリ
スト部分286の内容が空である場合には、割り付けら
れたメモリを指示するポインタで、割り付けられたメモ
リにアクセスするために用いられるようなポインタは存
在しない。すなわち、メモリ漏洩が発生しているわけ
で、エラーメッセージを生成する必要がある。
【0322】上に述べたように、ポインタが、「コンパ
イルされたコード」によって、評価器35に知られず
に、修正される場合を検出するための、ステップ112
4およびステップ1128における追補のメカニズム
が、図18および図19に示す「実行時ポインタ検査サ
ブルーチン」によって得られる。
イルされたコード」によって、評価器35に知られず
に、修正される場合を検出するための、ステップ112
4およびステップ1128における追補のメカニズム
が、図18および図19に示す「実行時ポインタ検査サ
ブルーチン」によって得られる。
【0323】評価器35が、「コンパイルされたコー
ド」によって行われた前の修正を知らなかったので、ポ
インタ検査表200はこの修正の時点で適切な更新が行
われなかった。通補のメカニズムは、検査されるポイン
タについての状態フラグを「不明」状態にセットし、そ
れ以上のポインタ追加検査は行わない。
ド」によって行われた前の修正を知らなかったので、ポ
インタ検査表200はこの修正の時点で適切な更新が行
われなかった。通補のメカニズムは、検査されるポイン
タについての状態フラグを「不明」状態にセットし、そ
れ以上のポインタ追加検査は行わない。
【0324】このルーチンは「コンパイルされたコー
ド」による有効なポインタ修正についての誤った警告を
防止はするが、修正値がポインタ検査表200に入れら
れるように、「コンパイルされたコード」による各修正
を検出する方が好ましい。
ド」による有効なポインタ修正についての誤った警告を
防止はするが、修正値がポインタ検査表200に入れら
れるように、「コンパイルされたコード」による各修正
を検出する方が好ましい。
【0325】したがって、「不明」の状態表示を有する
すべてのポインタを識別特定するために、ポインタ検査
表200の各横列の状態エントリ260をユーザがサー
チできるようなメカニズムが好ましい。
すべてのポインタを識別特定するために、ポインタ検査
表200の各横列の状態エントリ260をユーザがサー
チできるようなメカニズムが好ましい。
【0326】「不明」の表示を有する各ポインタについ
て、それぞれのポインタを識別特定する診断メッセージ
が、ファイル/ライン番号エントリ270からの情報と
ともに生成される。ライン番号情報は、ポインタが最後
に更新された時点を表示する。このことから、プログラ
マは診断情報を用いて、翻訳器が知らなくても、ポイン
タ値を修正した「コンパイルされたコード」を特定する
ことが可能となる。
て、それぞれのポインタを識別特定する診断メッセージ
が、ファイル/ライン番号エントリ270からの情報と
ともに生成される。ライン番号情報は、ポインタが最後
に更新された時点を表示する。このことから、プログラ
マは診断情報を用いて、翻訳器が知らなくても、ポイン
タ値を修正した「コンパイルされたコード」を特定する
ことが可能となる。
【0327】その後、上に述べたような方法で、「コン
パイルされたコード」に対する「実行後ラッパ関数」が
書かれ、これによって、「不明」状態がさらに発生する
のを防止するために、「コンパイルされた関数」の実行
に続いて新たなポインタ情報がポインタ検査表200に
追加される。
パイルされたコード」に対する「実行後ラッパ関数」が
書かれ、これによって、「不明」状態がさらに発生する
のを防止するために、「コンパイルされた関数」の実行
に続いて新たなポインタ情報がポインタ検査表200に
追加される。
【0328】プログラム開発中にプログラマは、CIN
リセットコマンドのようなリセットコマンドを起動する
ことによって翻訳器15を頻繁にリセットすることを望
んでいる。周知のように、このコマンドは翻訳器15
に、読み出しプロセスの終了時に元あった状態と同じ状
態に戻るように命令する。実際上、このことは、すべて
のデータがその当初の値に再初期化され、「BSS」デ
ータが「0」に割り当てられる結果となる。
リセットコマンドのようなリセットコマンドを起動する
ことによって翻訳器15を頻繁にリセットすることを望
んでいる。周知のように、このコマンドは翻訳器15
に、読み出しプロセスの終了時に元あった状態と同じ状
態に戻るように命令する。実際上、このことは、すべて
のデータがその当初の値に再初期化され、「BSS」デ
ータが「0」に割り当てられる結果となる。
【0329】ポインタ検査表200は、CINリセット
コマンド実行終了時に、読み出しプロセスの終了時にポ
インタ検査表200があった状態と同じ状態に戻ること
が好ましい。したがって、ポインタ検査表200を再初
期化し、それから、上に述べたように、すなわち他の静
的データを指示するように初期化された静的ポインタお
よび主関数に送られた「argv」ポインタ引数につい
て、内部疑似コードの実行に先立ってポインタ検査表2
00にプレロードされた初期化条件を再ロードする必要
がある。
コマンド実行終了時に、読み出しプロセスの終了時にポ
インタ検査表200があった状態と同じ状態に戻ること
が好ましい。したがって、ポインタ検査表200を再初
期化し、それから、上に述べたように、すなわち他の静
的データを指示するように初期化された静的ポインタお
よび主関数に送られた「argv」ポインタ引数につい
て、内部疑似コードの実行に先立ってポインタ検査表2
00にプレロードされた初期化条件を再ロードする必要
がある。
【0330】以上の説明は、本発明の一実施例に関する
もので、この技術分野の当業者であれば、本発明の種々
の変形例を考え得るが、それらはいずれも本発明の技術
的範囲に包含される。
もので、この技術分野の当業者であれば、本発明の種々
の変形例を考え得るが、それらはいずれも本発明の技術
的範囲に包含される。
【0331】
【発明の効果】以上述べたごとく、本発明によれば、
「翻訳された原始コード」と「コンパイルされた目的コ
ード」との両方を実行しながらエラー検出タスクを行う
ことのできるソフトウェアテストおよびデバッグ処理ツ
ールが得られる。また、本発明によれば、与えられたポ
インタによって指示されたメモリがそれぞれのポインタ
についての適切な境界範囲内にあることを確実にするソ
フトウェアテストおよびデバッグ処理が可能となる。
「翻訳された原始コード」と「コンパイルされた目的コ
ード」との両方を実行しながらエラー検出タスクを行う
ことのできるソフトウェアテストおよびデバッグ処理ツ
ールが得られる。また、本発明によれば、与えられたポ
インタによって指示されたメモリがそれぞれのポインタ
についての適切な境界範囲内にあることを確実にするソ
フトウェアテストおよびデバッグ処理が可能となる。
【0332】さらに、読み出し時またはパーズ時に導出
される情報を利用することにより、実行時に行われる互
いに重複するポインタ検査の数を減少させて、より効率
的なソフトウェアテストおよびデバッグ処理を行うこと
ができる。
される情報を利用することにより、実行時に行われる互
いに重複するポインタ検査の数を減少させて、より効率
的なソフトウェアテストおよびデバッグ処理を行うこと
ができる。
【図1】本発明に基づくメモリアクセスエラー検出シス
テムを示す概略ブロック図である。
テムを示す概略ブロック図である。
【図2】図3の原始コードファイルの例に宣言されてい
る各ポインタについての現ポインタ情報を維持するポイ
ンタ検査表である。
る各ポインタについての現ポインタ情報を維持するポイ
ンタ検査表である。
【図3】図2のポインタ検査表に列記されるポインタを
宣言し初期化する原始コードファイルの例を示す説明図
である。
宣言し初期化する原始コードファイルの例を示す説明図
である。
【図4】図3の原始コードファイルのライン10からラ
イン60までの実行後の、いくつかのポインタと、それ
らのポインタによって指示されるそれぞれのメモリスペ
ースとの間の関係を示す説明図である。
イン60までの実行後の、いくつかのポインタと、それ
らのポインタによって指示されるそれぞれのメモリスペ
ースとの間の関係を示す説明図である。
【図5】図3の原始コードファイルのライン70からラ
イン100までの実行後の、いくつかのポインタと、そ
れらのポインタによって指示されるそれぞれのメモリス
ペースとの間の関係を示す説明図である。
イン100までの実行後の、いくつかのポインタと、そ
れらのポインタによって指示されるそれぞれのメモリス
ペースとの間の関係を示す説明図である。
【図6】図3の原始コードファイルのライン200から
ライン210までの実行後の、ポインタ「ptr_al
loc」と、このポインタによって指示される割付され
たメモリブロックとの間の関係、およびこの割付された
メモリブロックについての追加情報を維持する連関メモ
リ割付構造体を示す説明図である。
ライン210までの実行後の、ポインタ「ptr_al
loc」と、このポインタによって指示される割付され
たメモリブロックとの間の関係、およびこの割付された
メモリブロックについての追加情報を維持する連関メモ
リ割付構造体を示す説明図である。
【図7】パーズ木(構文木)を解析する際にメモリエラ
ー検出コード挿入器によって用いられるような読み出し
時エラー検査プロセスの例を示す流れ図である。
ー検出コード挿入器によって用いられるような読み出し
時エラー検査プロセスの例を示す流れ図である。
【図8】図7のエラー検査プロセスによって用いられる
ような読み出し時配列次元検査サブルーチンの例を示す
流れ図である。
ような読み出し時配列次元検査サブルーチンの例を示す
流れ図である。
【図9】図7のエラー検査プロセスによって用いられる
ような読み出し時ポインタ表更新サブルーチンの例を、
図10と一体で示す流れ図である。
ような読み出し時ポインタ表更新サブルーチンの例を、
図10と一体で示す流れ図である。
【図10】図7のエラー検査プロセスによって用いられ
るような読み出し時ポインタ表更新サブルーチンの例
を、図9と一体で示す流れ図である。
るような読み出し時ポインタ表更新サブルーチンの例
を、図9と一体で示す流れ図である。
【図11】図7のエラー検査プロセスによって用いられ
るような読み出し時ポインタ検査サブルーチンの例を、
図9と一体で示す流れ図である。
るような読み出し時ポインタ検査サブルーチンの例を、
図9と一体で示す流れ図である。
【図12】コンパイルされたメモリ割付解除関数を実行
しながら評価器が用いるようなメモリ割付解除モニタ処
理サブルーチンの例を示す流れ図である。
しながら評価器が用いるようなメモリ割付解除モニタ処
理サブルーチンの例を示す流れ図である。
【図13】実行時において内部疑似コードのノードを解
析しながら評価器によって用いられるような実行時エラ
ー検査プロセスの例を示す流れ図である。
析しながら評価器によって用いられるような実行時エラ
ー検査プロセスの例を示す流れ図である。
【図14】図13のエラー検査プロセスによって用いら
れるような実行時配列次元検査サブルーチンの例を示す
流れ図である。
れるような実行時配列次元検査サブルーチンの例を示す
流れ図である。
【図15】図13のエラー検査プロセスによって用いら
れるような実行時ポインタ表更新サブルーチンの例を、
図16および図17と一体で示す流れ図である。
れるような実行時ポインタ表更新サブルーチンの例を、
図16および図17と一体で示す流れ図である。
【図16】図13のエラー検査プロセスによって用いら
れるような実行時ポインタ表更新サブルーチンの例を、
図15および図17と一体で示す流れ図である。
れるような実行時ポインタ表更新サブルーチンの例を、
図15および図17と一体で示す流れ図である。
【図17】図13のエラー検査プロセスによって用いら
れるような実行時ポインタ表更新サブルーチンの例を、
図15および図16と一体で示す流れ図である。
れるような実行時ポインタ表更新サブルーチンの例を、
図15および図16と一体で示す流れ図である。
【図18】図13のエラー検査プロセスによって用いら
れるような実行時ポインタ検査サブルーチンの例を、図
19と一体で示す流れ図である。
れるような実行時ポインタ検査サブルーチンの例を、図
19と一体で示す流れ図である。
【図19】図13のエラー検査プロセスによって用いら
れるような実行時ポインタ検査サブルーチンの例を、図
18と一体で示す流れ図である。
れるような実行時ポインタ検査サブルーチンの例を、図
18と一体で示す流れ図である。
【図20】図13のエラー検査プロセスによって用いら
れるような「「コンパイルされた関数」エラー検査プロ
セス」の例を示す流れ図である。
れるような「「コンパイルされた関数」エラー検査プロ
セス」の例を示す流れ図である。
【図21】図20の「「コンパイルされた関数」エラー
検査プロセス」によって用いられるような初期化ビット
ベクトル維持サブルーチンの例を示す流れ図である。
検査プロセス」によって用いられるような初期化ビット
ベクトル維持サブルーチンの例を示す流れ図である。
【図22】図18および図19の実行時ポインタ検査サ
ブルーチンによって用いられるような診断サブルーチン
の例を示す流れ図である。
ブルーチンによって用いられるような診断サブルーチン
の例を示す流れ図である。
【図23】ポインタ「ptr_part」を宣言し初期
化する原始コードファイルの例を示す説明図である。
化する原始コードファイルの例を示す説明図である。
【図24】図23に示す原始コードファイルのデータ流
れ解析中に設定される流れセット例を示す説明図であ
る。
れ解析中に設定される流れセット例を示す説明図であ
る。
15 翻訳器(インタプリタ) 20 パーザ(構文解析器) 25 メモリアクセスエラー検出コード挿入器 30 木/スタックコード変換器 35 評価器 40 リンク装置 45 プリンタ 60 インタプリタスタック 65 ポインタ保存スタック 67 ハードウェアスタック 70 ラッパライブラリ 74 キャッシュメモリ 75 内部記号表 200 ポインタ検査表 220、222、224 横列 230 ポインタアドレスエントリ 240 ポインタ内容エントリ 250a、250b 有効メモリ境界エントリ 260 状態エントリ 270 ファイル/ライン番号エントリ 280 メモリ割付構造体 282 下側境界部分 284 上側境界部分 286 チェインリスト部分 288 初期化ビットベクトル 290 状態部分
───────────────────────────────────────────────────── フロントページの続き (72)発明者 サディアス ジュリアス コワルスキー アメリカ合衆国、07901 ニュージャージ ー、サミット、ストーンリッジ ロード 73 (72)発明者 ジェームズ アール.ローランド アメリカ合衆国、07078 ニュージャージ ー、ショート ヒルズ、サッカレー ドラ イブ 18
Claims (28)
- 【請求項1】 テストされるソースコードファイルおよ
びそのソースコードファイルによって呼び出される1個
以上のライブラリ関数からなり、メモリ位置を指示する
1個以上のポインタを含み、ソフトウェア生成システム
によって実行されるソフトウェアプログラムが、無効な
ポインタをデレファレンスするというエラーを検出する
方法において、 前記ポインタのそれぞれについて、最後に既知となった
ポインタの内容と、ポインタの有効メモリ範囲とを含む
ポインタ情報を格納するステップと、 前記ソフトウェアプログラムによって前記ポインタのう
ちの1個以上のポインタに新しい値が代入されることを
前記ソフトウェア生成システムが検出するたびごとに前
記ポインタ情報を更新するステップと、 前記ソフトウェアプログラムによってポインタのデレフ
ァレンスが行われることを前記ソフトウェア生成システ
ムが検出するたびごとに実行時ポインタ検査サブルーチ
ンを実装するステップとからなる方法であって、この実
行時ポインタ検査サブルーチンが、 デレファレンスされたポインタに関するポインタ情報を
検索する検索ステップと、 そのデレファレンスされたポインタが格納されているメ
モリ位置からそのポインタの実際の内容を取得するステ
ップと、 その実際の内容が、前記ポインタ情報に記録されている
当該デレファレンスされたポインタの最後に既知となっ
た内容と等しい場合に限り、その実際の内容によって指
示されているメモリ空間が、ポインタ情報から取得され
る有効メモリ範囲内にあるかどうかを判定するテストを
行うテストステップとからなることを特徴とする、ソフ
トウェアプログラムのエラー検出方法。 - 【請求項2】 ポインタを作成することが既知であるラ
イブラリ関数の実行後に、そのライブラリ関数によって
作成されるポインタに対するポインタ情報を格納するス
テップを実行する実行後ラッパ関数を実行するステップ
をさらに有することを特徴とする請求項1の方法。 - 【請求項3】 前記ソースコード内のポインタに代入す
るためのポインタ値を返値として返すことが既知である
ライブラリ関数の実行後に、前記ソースコード内の当該
ポインタへのその返値の代入を検出したときのポインタ
情報を更新するステップの前に、前記ソフトウェア生成
システムが後で使うためにその返されたポインタに関す
る更新されたポインタ情報をポインタ保存スタックに格
納するステップを実行する実行後ラッパ関数を実行する
ステップをさらに有することを特徴とする請求項1の方
法。 - 【請求項4】 ポインタをデレファレンスすることが既
知であるライブラリ関数を実行する前に、前記実行時ポ
インタ検査サブルーチンを開始する実行前ラッパ関数を
実行するステップをさらに有することを特徴とする請求
項1の方法。 - 【請求項5】 制限された範囲を有する1個以上の引数
を受け取るライブラリ関数を実行する前に、その受け取
った引数がその制限された範囲内にあるかどうかをテス
トする実行前ラッパ関数を実行するステップをさらに有
することを特徴とする請求項1の方法。 - 【請求項6】 前記ポインタ情報がポインタのステータ
ス表示をさらに含み、 前記テストステップで、前記デレファレンスされたポイ
ンタの実際の内容が前記デレファレンスされたポインタ
の最後に既知となった内容と等しくない場合に前記ソフ
トウェア生成システムによって検出されなかったライブ
ラリ関数の実行中の代入によって前記デレファレンスさ
れたポインタの値が変更されたことを示すように、前記
デレファレンスされたポインタに関するポインタ情報内
のステータス表示を設定するステップをさらに有するこ
とを特徴とする請求項1の方法。 - 【請求項7】 前記ソフトウェアプログラムの実行後に
前記ソフトウェア生成システムによって検出されなかっ
たライブラリ関数の実行中の代入によって前記デレファ
レンスされたポインタの値が変更されたことを示してい
るステータスを有するポインタを識別するステップと、 ライブラリ関数によるポインタの変更を検出する実行後
ラッパ関数が必要であることをプログラマに示すステッ
プとをさらに有することを特徴とする請求項6の方法。 - 【請求項8】 前記ポインタ情報がポインタのアドレス
をさらに含み、 前記検索ステップが、前記デレファレンスされたポイン
タに関するポインタ情報を識別するためにそのポインタ
情報に含まれるポインタアドレスを検索するステップを
さらに有することを特徴とする請求項1の方法。 - 【請求項9】 前記方法が、前記ソースコードに対応す
る構文木に対して読み出し時エラー検査プロセスを実行
するステップをさらに有し、その読み出し時エラー検査
プロセスが、 前記ソースコード内に現れるポインタ代入ごとに、ポイ
ンタテーブル更新コマンドと、ポインタに代入されるポ
インタ式を特徴づける特徴情報とを、前記構文木に挿入
する読み出し時ポインタテーブル更新サブルーチンを実
行するステップと、 前記ソースコードに現れるポインタのデレファレンスご
とに、前記構文木にポインタ検査コマンドを挿入する読
み出し時ポインタ検査サブルーチンを実行するステップ
とからなることを特徴とする請求項1の方法。 - 【請求項10】 前記構文木に対してデータフロー解析
を実行するステップをさらに有することを特徴とする請
求項9の方法。 - 【請求項11】 前記データフロー解析の結果を利用し
て、前記構文木から、重複するポインタ検査コマンドを
除去することを特徴とする請求項10の方法。 - 【請求項12】 前記データフロー解析の結果を利用し
て、不正なポインタのデレファレンスを実行時に検出す
ることを特徴とする請求項10の方法。 - 【請求項13】 前記データフロー解析の結果を利用し
て、未初期化ポインタのデレファレンスを実行時に検出
することを特徴とする請求項10の方法。 - 【請求項14】 前記構文木を内部擬似コードに変換す
るステップをさらに有することを特徴とする請求項9の
方法。 - 【請求項15】 前記方法が、前記内部擬似コードに対
して実行時エラー検査プロセスを実行するステップをさ
らに有し、この実行時エラー検査プロセスが、 読み出し時にポインタ代入ごとに前記構文木に挿入され
たポインタテーブル更新コマンドおよび特徴情報を評価
したときに、前記ポインタ情報を格納するステップおよ
び更新するステップを実行する、実行時ポインタテーブ
ル更新サブルーチンを実行するステップと、 読み出し時にポインタのデレファレンスごとに前記構文
木に挿入されたポインタ検査コマンドを評価したとき
に、前記実行時ポインタ検査サブルーチンを実行するス
テップとからなることを特徴とする請求項14の方法。 - 【請求項16】 テストされるソースコードファイルお
よびそのソースコードファイルによって呼び出される1
個以上のライブラリ関数からなり、メモリ位置を指示す
る1個以上のポインタを含み、ソフトウェア生成システ
ムによって実行されるソフトウェアプログラムが、割当
てメモリ領域を解放した後にその領域を指示するポイン
タをデレファレンスすることによりその領域にアクセス
するというエラーを検出する方法において、 前記割当てメモリ領域を指示するポインタのチェインリ
ストを含む、前記割当てメモリ領域に関する割当て情報
を格納するステップと、 前記ソフトウェアプログラム内のポインタが前記割当て
メモリ領域を指示している場合に、前記割当て情報への
相互参照を含む、ポインタに関するポインタ情報を格納
するステップと、 前記ソフトウェアプログラムによって前記ポインタのう
ちの1個以上のポインタに新しい値が代入されることを
前記ソフトウェア生成システムが検出するたびごとに前
記ポインタ情報を更新するステップと、 前記チェインリストを変更するようなポインタ代入が検
出されるごとに、前記チェインリストを更新するステッ
プと、 前記割当てメモリ領域の解放を前記ソフトウェア生成シ
ステムが検出した場合に、対応する割当て情報からチェ
インリストを取得するステップと、 当該チェインリスト内にリストされた各ポインタに関す
るポインタ情報内に、そのポインタは解放したメモリ空
間を指示しているという表示を記録するステップと、 ポインタがデレファレンスされるごとに対応するポイン
タ情報を評価して、そのポインタが解放されたメモリ空
間を指示しているという表示があるのにもかかわらずデ
レファレンスされているのかどうかを判定するステップ
とからなることを特徴とする、ソフトウェアのエラー検
出方法。 - 【請求項17】 テストされるソースコードファイルお
よびそのソースコードファイルによって呼び出される1
個以上のライブラリ関数からなり、メモリ位置を指示す
る1個以上のポインタを含み、ソフトウェア生成システ
ムによって実行されるソフトウェアプログラムが、メモ
リ領域の未初期化部分を指示するポインタをデレファレ
ンスすることによりその未初期化部分を読み出すという
エラーを検出する方法において、 メモリの各バイトに対する初期化ステータスを含む、前
記メモリ領域に関する割当て情報を格納するステップ
と、 前記ソフトウェアプログラム内のポインタが前記メモリ
領域を指示している場合に、前記割当て情報への相互参
照を含む、ポインタに関するポインタ情報を格納するス
テップと、 前記ソフトウェアプログラムによって前記ポインタのう
ちの1個以上のポインタに新しい値が代入されることを
前記ソフトウェア生成システムが検出するたびごとに前
記ポインタ情報を更新するステップと、 前記ソースコードファイルがポインタをデレファレンス
することによってメモリのバイトにアクセスしてそのバ
イトを初期化することを前記ソフトウェア生成システム
が検出するたびごとに前記初期化ステータスを更新する
ステップと、 ライブラリ関数によって前記メモリ領域の1個以上のバ
イトが初期化されることを検出して、そのような初期化
が検出された場合に前記初期化ステータスを更新する初
期化ビットベクタ保守サブルーチンを実行するステップ
と、 ポインタがデレファレンスされて前記メモリ領域の1個
以上のバイトが読み出されるたびごとに前記割当て情報
内の初期化ステータスを評価して、読み出されるすべて
のバイトが初期化されているかどうかを判定するステッ
プとからなることを特徴とする、ソフトウェアのエラー
検出方法。 - 【請求項18】 テストされるソースコードファイルお
よびそのソースコードファイルによって呼び出される1
個以上のライブラリ関数からなり、割当てメモリ領域を
指示する可能性のある1個以上のポインタを含み、ソフ
トウェア生成システムによって実行されるソフトウェア
プログラムが、割当てメモリをリークするというエラー
を検出する方法において、 前記割当てメモリ領域を指示するポインタのチェインリ
ストを含む、前記割当てメモリ領域に関する割当て情報
を格納するステップと、 前記ソフトウェアプログラム内のポインタが前記割当て
メモリ領域を指示している場合に、前記割当て情報への
相互参照を含む、ポインタに関するポインタ情報を格納
するステップと、 前記ソフトウェアプログラムによって前記ポインタのう
ちの1個以上のポインタに新しい値が代入されることを
前記ソフトウェア生成システムが検出するたびごとに前
記ポインタ情報を更新するステップと、 前記チェインリストを変更するようなポインタ代入が検
出されるごとに、前記チェインリストを更新するステッ
プと、 チェインリストが空である場合にメモリリークであると
識別するステップとからなることを特徴とする、ソフト
ウェアのエラー検出方法。 - 【請求項19】 ソフトウェア生成システムによって実
行されるソフトウェアプログラムによって呼び出される
関数に渡されるポインタであって前記呼び出される関数
内の形式引数に代入される実引数に関連し前記ソフトウ
ェアプログラムおよび前記呼び出される関数内のポイン
タごとに前記ソフトウェア生成システムによってポイン
タ検査テーブルに保持されるポインタ情報を前記ソフト
ウェアプログラムから前記呼び出される関数に渡す方法
において、 前記実引数に関連する渡されるポインタ情報の一時的格
納用にメモリ位置を割り当てるステップと、 前記ポインタ検査テーブルから、前記実引数に関連する
ポインタ情報を取得するステップと、 取得したポインタ情報を、前記ソフトウェアプログラム
によって前記呼び出される関数が呼び出されたときに前
記一時的格納用メモリ位置に格納するステップと、 前記呼び出される関数の開始とともに、前記一時的格納
用メモリ位置から前記ポインタ情報を取得するステップ
と、 前記呼び出される関数内の形式ポインタ引数に関連する
ポインタ検査テーブル内のエントリに、取得したポイン
タ情報を挿入するステップとからなることを特徴とす
る、ソフトウェアプログラムから呼び出される関数にポ
インタ情報を渡す方法。 - 【請求項20】 ソフトウェア生成システムによって実
行されるソフトウェアプログラムによって呼び出された
関数からそのソフトウェアプログラムに返されるポイン
タ値に関連し前記ソフトウェアプログラムおよび前記呼
び出された関数内のポインタごとに前記ソフトウェア生
成システムによってポインタ検査テーブルに保持される
ポインタ情報を返す方法において、 前記呼び出された関数によって返されるポインタ情報に
関連するポインタ情報の一時的格納用にメモリ位置を割
り当てるステップと、 前記ポインタ検査テーブルから、前記呼び出された関数
から返されるポインタ値に関連するポインタ情報を取得
するステップと、 取得したポインタ情報を、前記呼び出された関数から前
記ソフトウェアプログラムに復帰したときに前記一時的
格納用メモリ位置に格納するステップと、 前記呼び出された関数への復帰後に、前記一時的格納用
メモリ位置から前記ポインタ情報を取得するステップ
と、 前記ソフトウェアプログラムの後続の実行中に、前記返
されたポインタ値が代入されたポインタに関連するポイ
ンタ検査テーブル内のエントリに、取得したポインタ情
報を挿入するステップとからなることを特徴とする、呼
び出された関数からソフトウェアプログラムにポインタ
情報を返す方法。 - 【請求項21】 メモリ位置を指示する1個以上のポイ
ンタを含むソフトウェアプログラム内の各ポインタに関
するポインタ情報を保持するソフトウェア生成システム
によって実行されるソフトウェアプログラム内の、それ
ぞれポインタ式を有する複数の命令ストリームを含みそ
れらの命令ストリームのうちの1つのみが実行時にソフ
トウェア生成システムによって実行されその結果が実行
時にデレファレンスされる複合式に対して、ポインタ検
査を実行する方法において、 ポインタ情報の一時的格納用メモリ位置を割り当てるス
テップと、 前記ソフトウェア生成システムが、実行される命令スト
リーム内のポインタに関するポインタ情報を取得し、取
得したポインタ情報を前記一時的格納用メモリ位置に挿
入するというコマンドを各命令ストリームに挿入するス
テップと、 実行時に前記複合式のポインタがデレファレンスされた
ときに前記一時的格納用メモリ位置からポインタ情報を
取得するステップとからなることを特徴とするポインタ
検査方法。 - 【請求項22】 メモリ位置を指示する1個以上のポイ
ンタを含み、各ポインタの有効メモリ範囲の情報を含む
各ポインタに関するポインタ情報を保持するソフトウェ
ア生成システムによって実行されるライブラリ関数が、
無効なポインタをデレファレンスするというエラーを検
出する方法において、 前記ライブラリ関数によってデレファレンスされる各ポ
インタに関するポインタ情報を取得し、デレファレンス
されるポインタの実際の内容によって指示されるメモリ
空間がポインタ情報から取得した有効メモリ範囲内にあ
るかどうかを判定するラッパ関数を前記ライブラリ関数
と関係づけるステップと、 前記ライブラリ関数を実行する前に前記ラッパ関数を実
行するステップとからなることを特徴とする、ソフトウ
ェアプログラムのエラー検出方法。 - 【請求項23】 メモリ位置を指示する1個以上のポイ
ンタを含みソフトウェア生成システムによって実行され
るライブラリ関数の実行中に作成されるポインタに関す
るポインタ情報を更新する方法において、 前記ライブラリ関数によって作成されるポインタに関す
るポインタ情報を格納するラッパ関数を前記ライブラリ
関数と関係づけるステップと、 前記ライブラリ関数の実行後に前記ラッパ関数を実行す
るステップとからなることを特徴とする、ポインタ情報
の更新方法。 - 【請求項24】 ソフトウェア生成システムによって実
行され、メモリ位置を指示する1個以上のポインタを含
むライブラリ関数およびソースコードについて、ライブ
ラリ関数からソースコードに返されソースコード内のポ
インタに代入されるポインタ値に関連しポインタごとに
ポインタ検査テーブルに保持されるポインタ情報を更新
する方法において、 返されるポインタ値に関するポインタ情報をメモリ位置
に格納するラッパ関数を前記ライブラリ関数と関係づけ
るステップと、 関係づけられたライブラリ関数の実行後に前記ラッパ関
数を実行するステップと、 返されたポインタ値が前記ソースコード内のポインタに
代入されたときに、前記メモリ位置からポインタ情報を
取得して前記ポインタ検査テーブルに挿入するステップ
とからなることを特徴とするポインタ情報の更新方法。 - 【請求項25】 テストされるソースコードファイルお
よびそのソースコードファイルによって呼び出される1
個以上のライブラリ関数からなり、メモリ位置を指示す
る1個以上のポインタを含み、実行するソフトウェアプ
ログラム内の各ポインタに関するポインタ情報を保持す
るソフトウェア生成システムによって実行されるソフト
ウェアプログラムに対して実行されるポインタ検査の数
を最小にするためにソフトウェアプログラムをデータフ
ロー解析する方法において、 前記ソフトウェアプログラム内の各ポインタに対するフ
ローセットを設定するステップと、 前記ソフトウェアプログラムの各行に対して解析ルーチ
ンを実行するステップと、 ポインタのデレファレンスを有するフローセットごと
に、拡張オフセットを有する1回のポインタ検査を実行
するステップとからなり、前記解析ルーチンが、 解析しているソフトウェアプログラムの行内のポインタ
に新しい値が代入されることを前記ソフトウェア生成シ
ステムが検出するたびごとに新しいフローセットを設定
するステップと、 デレファレンスされるポインタに対する現在のフローセ
ットに、そのデレファレンスされるポインタが解析して
いるソフトウェアプログラムの前記行内でデレファレン
スされたことの表示によりマークするステップと、 前記ソフトウェアプログラムの各行に対して前記解析ル
ーチンを繰り返すステップとからなることを特徴とす
る、ソフトウェアプログラムをデータフロー解析する方
法。 - 【請求項26】 メモリのバイトごとに初期化ステータ
スを保持するソフトウェア生成システムによって実行さ
れるソフトウェアルーチンによるメモリのバイトの初期
化を検出する方法において、 前記ソフトウェアルーチンがアクセスする可能性のある
すべての領域のバイトを識別するステップと、 前記領域の各バイトを既知の値でマークするステップ
と、 すべてのアクセス可能メモリに対する初期化ステータス
を解析し、前記ソフトウェアルーチンが実行されるとき
に未初期化であるすべてのバイトを識別するステップ
と、 前記ソフトウェアルーチンが実行される前にすべての未
初期化メモリの第1のチェックサムを実行するステップ
と、 前記ソフトウェアルーチンが実行された後にすべての未
初期化メモリの第2のチェックサムを実行するステップ
と、 第1のチェックサムが第2のチェックサムに等しくない
場合に前記ソフトウェアルーチンによるメモリの初期化
があったと検出するステップとからなることを特徴とす
る、ソフトウェアルーチンによるメモリの初期化を検出
する方法。 - 【請求項27】 メモリのバイトごとに初期化ステータ
スを保持するソフトウェア生成システムによって実行さ
れるソフトウェアルーチンによるメモリのバイトの初期
化を検出する方法において、 前記ソフトウェアルーチンがアクセスする可能性のある
すべての領域のバイトを識別するステップと、 すべてのアクセス可能メモリに対する初期化ステータス
を解析し、前記ソフトウェアルーチンが実行されるとき
に未初期化であるすべてのバイトを識別するステップ
と、 アクセス可能なすべての未初期化メモリを保存するステ
ップと、 前記ソフトウェアルーチンが実行される前にすべての未
初期化メモリの第1のチェックサムを実行するステップ
と、 前記ソフトウェアルーチンが実行された後にすべての未
初期化メモリの第2のチェックサムを実行するステップ
と、 第1のチェックサムが第2のチェックサムに等しくない
場合に前記ソフトウェアルーチンによるメモリの初期化
があったと検出するステップとからなることを特徴とす
る、ソフトウェアルーチンによるメモリの初期化を検出
する方法。 - 【請求項28】 割当てメモリ領域を指示する1個以上
のポインタを含み、ソフトウェア生成システムによって
実行されるソフトウェアプログラムが割当てメモリ領域
を解放する方法において、 前記割当てメモリ領域を指示する各ポインタのステータ
ス表示およびチェインリストを含む、前記割当てメモリ
領域に関する割当て情報を格納するステップと、 前記ソフトウェアプログラム内のポインタが前記割当て
メモリ領域を指示している場合に、ステータス表示およ
び前記割当て情報への相互参照を含む、ポインタに関す
るポインタ情報を格納するステップと、 前記ソフトウェアプログラムによって前記ポインタのう
ちの1個以上のポインタに新しい値が代入されることを
前記ソフトウェア生成システムが検出するたびごとに前
記ポインタ情報を更新するステップと、 前記チェインリストを変更するようなポインタ代入が検
出されるごとに、前記チェインリストを更新するステッ
プと、 前記割当てメモリ領域の解放を前記ソフトウェア生成シ
ステムが検出した場合に、対応する割当て情報からチェ
インリストを取得するステップと、 当該チェインリスト内にリストされた各ポインタに関す
るポインタ情報のステータス表示内に、そのポインタは
解放したメモリ空間を指示しているという表示を記録す
るステップとからなることを特徴とする、割当てメモリ
領域を解放する方法。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US08/192,239 US5590329A (en) | 1994-02-04 | 1994-02-04 | Method and apparatus for detecting memory access errors |
US192239 | 1994-02-04 |
Publications (1)
Publication Number | Publication Date |
---|---|
JPH07225703A true JPH07225703A (ja) | 1995-08-22 |
Family
ID=22708831
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP7039426A Pending JPH07225703A (ja) | 1994-02-04 | 1995-02-06 | ソフトウェアプログラムのエラー検出方法 |
Country Status (4)
Country | Link |
---|---|
US (1) | US5590329A (ja) |
EP (1) | EP0666535A3 (ja) |
JP (1) | JPH07225703A (ja) |
CA (1) | CA2140084A1 (ja) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2008276763A (ja) * | 2007-04-30 | 2008-11-13 | Suresoft Technologies Inc | メモリエラーの検出法 |
JP2014052753A (ja) * | 2012-09-06 | 2014-03-20 | Nec Corp | メモリ管理装置、及び、メモリ管理方法 |
JP2017523544A (ja) * | 2014-08-08 | 2017-08-17 | ゼットティーイー コーポレーションZte Corporation | 正当なメモリアクセスの検知方法及び装置 |
JP2017536612A (ja) * | 2014-10-17 | 2017-12-07 | クアルコム,インコーポレイテッド | ハードウェアフロー制御のためのコードポインタ認証 |
Families Citing this family (112)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5694539A (en) * | 1994-08-10 | 1997-12-02 | Intrinsa Corporation | Computer process resource modelling method and apparatus |
US5748964A (en) * | 1994-12-20 | 1998-05-05 | Sun Microsystems, Inc. | Bytecode program interpreter apparatus and method with pre-verification of data type restrictions |
US6704923B1 (en) | 1994-12-20 | 2004-03-09 | Sun Microsystems, Inc. | System and method for pre-verification of stack usage in bytecode program loops |
US5581696A (en) * | 1995-05-09 | 1996-12-03 | Parasoft Corporation | Method using a computer for automatically instrumenting a computer program for dynamic debugging |
US5689707A (en) * | 1995-12-04 | 1997-11-18 | Ncr Corporation | Method and apparatus for detecting memory leaks using expiration events and dependent pointers to indicate when a memory allocation should be de-allocated |
US6151618A (en) * | 1995-12-04 | 2000-11-21 | Microsoft Corporation | Safe general purpose virtual machine computing system |
US6135650A (en) * | 1995-12-22 | 2000-10-24 | Sun Microsystems, Inc. | Method and system for wrapper routine optimization |
US5901317A (en) * | 1996-03-25 | 1999-05-04 | Sun Microsystems, Inc. | Method and system for register allocation using multiple interference graphs |
US5901316A (en) * | 1996-07-01 | 1999-05-04 | Sun Microsystems, Inc. | Float register spill cache method, system, and computer program product |
US5761729A (en) * | 1996-07-17 | 1998-06-02 | Digital Equipment Corporation | Validation checking of shared memory accesses |
US5787480A (en) * | 1996-07-17 | 1998-07-28 | Digital Equipment Corporation | Lock-up free data sharing |
US5708774A (en) * | 1996-07-23 | 1998-01-13 | International Business Machines Corporation | Automated testing of software application interfaces, object methods and commands |
WO1998006019A2 (en) * | 1996-08-07 | 1998-02-12 | Intrinsa Corporation | Simulated program execution error detection method and apparatus |
US5790778A (en) * | 1996-08-07 | 1998-08-04 | Intrinsa Corporation | Simulated program execution error detection method and apparatus |
US5841969A (en) * | 1996-08-13 | 1998-11-24 | Honeywell Inc. | Single bus architecture supporting subsystems of various criticality levels |
FR2753028B1 (fr) * | 1996-08-30 | 1998-11-13 | Sextant Avionique | Dispositif de raccordement d'une pluralite d'equipements electroniques a un bus de type arinc 629 |
US5835958A (en) * | 1996-10-29 | 1998-11-10 | Sun Microsystems, Inc. | Method and apparatus for dynamically sizing non-contiguous runtime stacks |
US5987259A (en) * | 1997-06-30 | 1999-11-16 | Sun Microsystems, Inc. | Functional unit switching for the allocation of registers |
US6009272A (en) * | 1997-06-30 | 1999-12-28 | Sun Microsystems, Inc. | Register allocation via selective spilling |
US6139200A (en) * | 1997-06-30 | 2000-10-31 | Sun Microsystems, Inc. | Register resource allocation feedback |
US6434620B1 (en) * | 1998-08-27 | 2002-08-13 | Alacritech, Inc. | TCP/IP offload network interface device |
US6128774A (en) * | 1997-10-28 | 2000-10-03 | Necula; George C. | Safe to execute verification of software |
JP3141836B2 (ja) * | 1998-01-26 | 2001-03-07 | 日本電気株式会社 | 言語処理方法、言語処理装置及び言語処理プログラムを記録した記憶媒体 |
US6154822A (en) * | 1998-04-21 | 2000-11-28 | International Business Machines Corporation | Method and system for improving data storage and access for programs written in mid-level programming languages |
US6295613B1 (en) * | 1998-04-28 | 2001-09-25 | International Business Machines Corporation | Debug watch mechanism and method for debugging a computer program |
US6167533A (en) * | 1998-06-25 | 2000-12-26 | Hewlett-Packard Company | Active dashboard extensible framework |
US6282703B1 (en) * | 1998-10-29 | 2001-08-28 | International Business Machines Corporation | Statically linking an application process with a wrapper library |
GB9825102D0 (en) | 1998-11-16 | 1999-01-13 | Insignia Solutions Plc | Computer system |
GB2348305A (en) * | 1999-03-24 | 2000-09-27 | Int Computers Ltd | Instruction execution mechanism |
US7111307B1 (en) | 1999-11-23 | 2006-09-19 | Microsoft Corporation | Method and system for monitoring and verifying software drivers using system resources including memory allocation and access |
US7120572B1 (en) | 2000-01-06 | 2006-10-10 | Sun Microsystems, Inc. | Memory efficient program pre-execution verifier and method |
US6968543B2 (en) * | 2000-03-10 | 2005-11-22 | Fujitsu Limited | Information processing apparatus |
US6718542B1 (en) * | 2000-04-14 | 2004-04-06 | Sun Microsystems, Inc. | Disambiguating memory references based upon user-specified programming constraints |
US6728907B1 (en) * | 2000-04-14 | 2004-04-27 | Microsoft Corporation | System and method for self-diagnosing system crashes |
US6823507B1 (en) * | 2000-06-06 | 2004-11-23 | International Business Machines Corporation | Detection of memory-related errors in computer programs |
US6993751B2 (en) * | 2001-05-14 | 2006-01-31 | Microsoft Corporation | Placing exception throwing instructions in compiled code |
US6880154B2 (en) * | 2001-06-29 | 2005-04-12 | Intel Corporation | Alias-free test for dynamic array structures |
US7539978B1 (en) * | 2001-11-01 | 2009-05-26 | Cigital, Inc. | Method for understanding and testing third party software components |
US20030140337A1 (en) * | 2001-12-21 | 2003-07-24 | Celoxica Ltd. | System, method, and article of manufacture for data transfer reporting for an application |
US7133877B2 (en) * | 2002-10-03 | 2006-11-07 | International Business Machines Corporation | Method and apparatus for managing a set of data structures associated with a large file |
US7316011B1 (en) * | 2002-10-10 | 2008-01-01 | Microsoft Corporation | Memory reduction for object-oriented compilers |
US7844734B2 (en) * | 2002-11-18 | 2010-11-30 | Innopath Software, Inc. | Dynamic addressing (DA) using a centralized DA manager |
US7343513B1 (en) * | 2003-09-24 | 2008-03-11 | Juniper Networks, Inc. | Systems and methods for recovering memory |
US7260746B2 (en) * | 2003-10-21 | 2007-08-21 | Massachusetts Institute Of Technology | Specification based detection and repair of errors in data structures |
US7761852B2 (en) * | 2003-11-26 | 2010-07-20 | International Business Machines Corporation | Fast detection of the origins of memory leaks when using pooled resources |
US7930491B1 (en) | 2004-04-19 | 2011-04-19 | Cisco Technology, Inc. | Memory corruption detection system and method using contingency analysis regulation |
US7293142B1 (en) | 2004-04-19 | 2007-11-06 | Cisco Technology, Inc. | Memory leak detection system and method using contingency analysis |
US7487321B2 (en) * | 2004-04-19 | 2009-02-03 | Cisco Technology, Inc. | Method and system for memory leak detection |
US7284107B2 (en) * | 2004-04-30 | 2007-10-16 | Microsoft Corporation | Special-use heaps |
US20050251796A1 (en) * | 2004-05-07 | 2005-11-10 | International Business Machines Corporation | Automatic identification and reuse of software libraries |
US20060150160A1 (en) * | 2004-06-14 | 2006-07-06 | Sofcheck, Inc. | Software analyzer |
US7971255B1 (en) * | 2004-07-15 | 2011-06-28 | The Trustees Of Columbia University In The City Of New York | Detecting and preventing malcode execution |
US8255435B2 (en) * | 2004-10-07 | 2012-08-28 | International Business Machines Corporation | Detecting memory management anti-patterns |
US20060095890A1 (en) * | 2004-11-01 | 2006-05-04 | Reeves Robert L | Embedded detection objects |
US7523450B2 (en) * | 2004-11-15 | 2009-04-21 | International Business Machines Corporation | Apparatus, system, and method for identifying fixed memory address errors in source code at build time |
US7613954B2 (en) * | 2004-12-21 | 2009-11-03 | National Instruments Corporation | Test executive with stack corruption detection |
US7519867B2 (en) * | 2004-12-21 | 2009-04-14 | National Instruments Corporation | Test executive which provides heap validity checking and memory leak detection for user code modules |
US7849444B2 (en) * | 2004-12-21 | 2010-12-07 | National Instruments Corporation | Test executive with buffer overwrite detection for parameters of user-supplied code modules |
US7480826B2 (en) * | 2004-12-21 | 2009-01-20 | National Instruments Corporation | Test executive with external process isolation for user code modules |
US20060173877A1 (en) * | 2005-01-10 | 2006-08-03 | Piotr Findeisen | Automated alerts for resource retention problems |
US7904760B2 (en) * | 2005-07-06 | 2011-03-08 | Cisco Technology, Inc. | Method and system for using presence information in error notification |
US7765528B2 (en) * | 2005-09-21 | 2010-07-27 | Hewlett-Packard Development Company, L.P. | Identifying sources of memory retention |
US7730453B2 (en) * | 2005-12-13 | 2010-06-01 | Microsoft Corporation | Runtime detection for invalid use of zero-length memory allocations |
US20070169062A1 (en) * | 2005-12-20 | 2007-07-19 | Intel Corporation | Suspending memory analyzing of a program performed by a runtime memory analysis system |
US8549544B1 (en) * | 2006-04-07 | 2013-10-01 | Intel Corporation | System, method and computer program product for preventing the execution of unwanted code |
US20070250820A1 (en) * | 2006-04-20 | 2007-10-25 | Microsoft Corporation | Instruction level execution analysis for debugging software |
US8020149B2 (en) * | 2006-08-04 | 2011-09-13 | Apple Inc. | System and method for mitigating repeated crashes of an application resulting from supplemental code |
US7477535B2 (en) * | 2006-10-05 | 2009-01-13 | Nokia Corporation | 3D chip arrangement including memory manager |
US20080086603A1 (en) * | 2006-10-05 | 2008-04-10 | Vesa Lahtinen | Memory management method and system |
US8141061B2 (en) * | 2006-11-13 | 2012-03-20 | International Business Machines Corporation | Using memory keys to detect alias violations |
US8037477B2 (en) * | 2007-01-23 | 2011-10-11 | Hewlett-Packard Development Company, L.P. | Efficient detection of sources of increasing memory consumption |
US8245209B2 (en) * | 2007-05-29 | 2012-08-14 | International Business Machines Corporation | Detecting dangling pointers and memory leaks within software |
US8132156B2 (en) * | 2007-06-14 | 2012-03-06 | Red Hat, Inc. | Methods and systems for testing tool with comparative testing |
US8239836B1 (en) * | 2008-03-07 | 2012-08-07 | The Regents Of The University Of California | Multi-variant parallel program execution to detect malicious code injection |
US7974741B2 (en) * | 2008-04-10 | 2011-07-05 | Dresser, Inc. | Managing information related to industrial equipment |
US20100192026A1 (en) * | 2009-01-27 | 2010-07-29 | Microsoft Corporation | Implementations of program runtime checks |
US8448153B1 (en) | 2009-10-29 | 2013-05-21 | Ning Wang | Encoding data and metadata for run-time checking of computer code and data serialization |
US9529574B2 (en) | 2010-09-23 | 2016-12-27 | Apple Inc. | Auto multi-threading in macroscalar compilers |
US8621448B2 (en) * | 2010-09-23 | 2013-12-31 | Apple Inc. | Systems and methods for compiler-based vectorization of non-leaf code |
US8984266B2 (en) | 2010-12-29 | 2015-03-17 | Brocade Communications Systems, Inc. | Techniques for stopping rolling reboots |
US8762797B2 (en) | 2011-04-29 | 2014-06-24 | Google Inc. | Method and apparatus for detecting memory access faults |
US8732681B2 (en) * | 2011-05-16 | 2014-05-20 | Texas Instruments Incorporated | Stack analysis for post mortem analysis |
US8832655B2 (en) | 2011-09-29 | 2014-09-09 | Accenture Global Services Limited | Systems and methods for finding project-related information by clustering applications into related concept categories |
US8978009B2 (en) | 2011-10-06 | 2015-03-10 | Red Hat Israel, Ltd. | Discovering whether new code is covered by tests |
US9026998B2 (en) | 2011-10-06 | 2015-05-05 | Red Hat Israel, Inc. | Selecting relevant tests to quickly assess code stability |
US9113164B1 (en) | 2012-05-15 | 2015-08-18 | Google Inc. | Constant bit rate control using implicit quantization values |
US9015831B2 (en) * | 2012-08-08 | 2015-04-21 | Synopsys, Inc | Method and apparatus for static taint analysis of computer program code |
US9510019B2 (en) | 2012-08-09 | 2016-11-29 | Google Inc. | Two-step quantization and coding method and apparatus |
US8959495B2 (en) | 2012-09-14 | 2015-02-17 | Oracle International Corporation | Unifying static and dynamic compiler optimizations in source-code bases |
US9407915B2 (en) | 2012-10-08 | 2016-08-02 | Google Inc. | Lossless video coding with sub-frame level optimal quantization values |
US8881123B2 (en) * | 2012-11-30 | 2014-11-04 | Oracle International Corporation | Enabling symbol resolution of private symbols in legacy programs and optimizing access to the private symbols |
US9158848B2 (en) | 2013-02-11 | 2015-10-13 | International Business Machines Corporation | Web testing tools system and method |
US9830224B2 (en) * | 2013-03-15 | 2017-11-28 | Nvidia Corporation | Selective fault stalling for a GPU memory pipeline in a unified virtual memory system |
US9904541B2 (en) * | 2013-05-09 | 2018-02-27 | Microsoft Technology Licensing, Llc | Semantic baselining |
US9250878B1 (en) * | 2014-11-24 | 2016-02-02 | Red Hat, Inc. | Function attribute for dynamic stack allocation |
CN107847140B (zh) * | 2015-07-06 | 2022-01-18 | 雅培糖尿病护理公司 | 用于症状发作检测和评估的系统、装置和方法 |
GB2544315B (en) * | 2015-11-12 | 2018-02-14 | Advanced Risc Mach Ltd | An apparatus and method for controlling use of bounded pointers |
US11061575B2 (en) * | 2017-09-19 | 2021-07-13 | International Business Machines Corporation | Read-only table of contents register |
US10705973B2 (en) | 2017-09-19 | 2020-07-07 | International Business Machines Corporation | Initializing a data structure for use in predicting table of contents pointer values |
US10884929B2 (en) | 2017-09-19 | 2021-01-05 | International Business Machines Corporation | Set table of contents (TOC) register instruction |
US10725918B2 (en) | 2017-09-19 | 2020-07-28 | International Business Machines Corporation | Table of contents cache entry having a pointer for a range of addresses |
US10896030B2 (en) | 2017-09-19 | 2021-01-19 | International Business Machines Corporation | Code generation relating to providing table of contents pointer values |
US10620955B2 (en) | 2017-09-19 | 2020-04-14 | International Business Machines Corporation | Predicting a table of contents pointer value responsive to branching to a subroutine |
US10713050B2 (en) | 2017-09-19 | 2020-07-14 | International Business Machines Corporation | Replacing Table of Contents (TOC)-setting instructions in code with TOC predicting instructions |
US10572302B2 (en) * | 2017-11-07 | 2020-02-25 | Oracle Internatíonal Corporatíon | Computerized methods and systems for executing and analyzing processes |
US11860996B1 (en) * | 2018-04-06 | 2024-01-02 | Apple Inc. | Security concepts for web frameworks |
KR102057724B1 (ko) * | 2018-05-25 | 2019-12-19 | 고려대학교 산학협력단 | 메모리 해제 오류를 자동으로 수정하는 장치 및 방법 |
CN110162967B (zh) * | 2019-05-15 | 2023-02-24 | 武汉大学 | 一种基于mpx的内存时间错误防护方法 |
CN110457150B (zh) * | 2019-07-10 | 2023-03-21 | 锐捷网络股份有限公司 | 一种内存故障检测方法及装置 |
US11449412B2 (en) * | 2019-12-31 | 2022-09-20 | Bmc Software, Inc. | Automated unit testing in a mainframe CICS environment |
CN111611158A (zh) * | 2020-05-08 | 2020-09-01 | 中国原子能科学研究院 | 一种应用性能分析系统及方法 |
KR102662335B1 (ko) * | 2021-10-27 | 2024-05-03 | 경북대학교 산학협력단 | 비교 신경망 학습을 이용한 소프트웨어의 오동작 검출시스템 및 소프트웨어의 오동작 검출방법 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5313387A (en) * | 1989-06-30 | 1994-05-17 | Digital Equipment Corporation | Re-execution of edit-compile-run cycles for changed lines of source code, with storage of associated data in buffers |
US5107418A (en) * | 1990-06-11 | 1992-04-21 | Supercomputer Systems Limited Partnership | Method for representing scalar data dependences for an optimizing compiler |
US5355469A (en) * | 1990-07-30 | 1994-10-11 | Delphi Data, A Division Of Sparks Industries, Inc. | Method for detecting program errors |
US5361351A (en) * | 1990-09-21 | 1994-11-01 | Hewlett-Packard Company | System and method for supporting run-time data type identification of objects within a computer program |
US5193180A (en) * | 1991-06-21 | 1993-03-09 | Pure Software Inc. | System for modifying relocatable object code files to monitor accesses to dynamically allocated memory |
US5432936A (en) * | 1992-04-09 | 1995-07-11 | Microsoft Corporation | Method for implementing pointers to members in a compiler for an object-oriented programming language |
-
1994
- 1994-02-04 US US08/192,239 patent/US5590329A/en not_active Expired - Lifetime
-
1995
- 1995-01-12 CA CA002140084A patent/CA2140084A1/en not_active Abandoned
- 1995-01-26 EP EP95300460A patent/EP0666535A3/en not_active Withdrawn
- 1995-02-06 JP JP7039426A patent/JPH07225703A/ja active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2008276763A (ja) * | 2007-04-30 | 2008-11-13 | Suresoft Technologies Inc | メモリエラーの検出法 |
JP2014052753A (ja) * | 2012-09-06 | 2014-03-20 | Nec Corp | メモリ管理装置、及び、メモリ管理方法 |
JP2017523544A (ja) * | 2014-08-08 | 2017-08-17 | ゼットティーイー コーポレーションZte Corporation | 正当なメモリアクセスの検知方法及び装置 |
JP2017536612A (ja) * | 2014-10-17 | 2017-12-07 | クアルコム,インコーポレイテッド | ハードウェアフロー制御のためのコードポインタ認証 |
Also Published As
Publication number | Publication date |
---|---|
CA2140084A1 (en) | 1995-08-05 |
US5590329A (en) | 1996-12-31 |
EP0666535A2 (en) | 1995-08-09 |
EP0666535A3 (en) | 1996-02-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JPH07225703A (ja) | ソフトウェアプログラムのエラー検出方法 | |
US5907709A (en) | Development system with methods for detecting invalid use and management of resources and memory at runtime | |
EP0665496B1 (en) | Method and apparatus for run-time error checking using dynamic patching | |
US5909580A (en) | Development system and methods with direct compiler support for detecting invalid use and management of resources and memory at runtime | |
US6049810A (en) | Method and apparatus for implementing a write barrier of a garbage collected heap | |
US5355469A (en) | Method for detecting program errors | |
US5903900A (en) | Method and apparatus for optimizing exact garbage collection of array nodes in a carded heap | |
US6769116B1 (en) | Diagnostic technique for debugging memory corruption | |
EP0874318B1 (en) | A method and apparatus for locating object pointers used within exact garbage collection | |
US6115782A (en) | Method and apparatus for locating nodes in a carded heap using a card marking structure and a node advance value | |
US7774761B2 (en) | Use of memory watch points and a debugger to improve analysis of runtime memory access errors | |
US6038572A (en) | Method and apparatus for localizing nodes in a garbage collected carded heap | |
US5644709A (en) | Method for detecting computer memory access errors | |
US5193180A (en) | System for modifying relocatable object code files to monitor accesses to dynamically allocated memory | |
US6634020B1 (en) | Uninitialized memory watch | |
US5920876A (en) | Performing exact garbage collection using bitmaps that identify pointer values within objects | |
US6675379B1 (en) | Automatic removal of array memory leaks | |
US9274923B2 (en) | System and method for stack crawl testing and caching | |
US5860011A (en) | Method and system for automatically checking computer source code quality based on rules | |
US5581696A (en) | Method using a computer for automatically instrumenting a computer program for dynamic debugging | |
US6154876A (en) | Analysis of the effect of program execution of calling components with data variable checkpointing and resource allocation analysis | |
US5915255A (en) | Method and apparatus for referencing nodes using links | |
US5911144A (en) | Method and apparatus for optimizing the assignment of hash values to nodes residing in a garbage collected heap | |
US20030126590A1 (en) | System and method for dynamic data-type checking | |
US9183114B2 (en) | Error detection on the stack |