- ベストアンサー
不正メモリアクセス例外って?
基本情報の問題に関することですが、こちらで質問させていただきます。 メインメモリの使用についてです。 「取得した範囲外の領域や解放済みの領域を更新・参照した場合、更新時ではなく参照時に、メモリ領域違反(不正メモリアクセス例外)の障害が発生し、重大かつ原因の特定が困難な状況に陥る」 その理由は、 「更新するためには、事前に更新するメモリ領域が参照できなければ更新できないからである」 とされていましたが、これはどういう意味でしょうか。 プログラミングは入門程度しか勉強したことがないので、メモリ使用についてはあまり理解できていません。ご教示お願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>「更新するためには、事前に更新するメモリ領域が参照できなければ更新できないからである」※1 この問題って、単純にあるメモリにデータを書き込む処理ではなく、 あるメモリの値を加算あるいは減算することを前提に出題されていますよね?※2 具体的にコードにしますと、 a = a + 1; 変数aは不正なメモリアドレスと仮定します 上記のコードをアセンブラに変換しますと LDR a #不正アドレスからCPUのレジスタへ値読み込み(参照) INC #レジスタに読み込んだ値を+1 STR a #加算後のレジスタ内の値を不正アドレスへ書き込み(更新) のようになります※3 上記のアセンブラコードですが、不正アクセスはLD命令で発生しますね よって、※1の答えに繋がるのですが、 次のようなケースの場合、※1に当てはまらず、書き込み時に不正アクセスとなります a = 3; 変数aは不正なメモリアドレスと仮定します このコードをアセンブラにすると STR 3,a #不正アドレスに定数3を書き込み となり、LDR命令が発生しないため、書き込み時に不正アクセスとなりますね※4 よって、単純に「取得した範囲外の領域や解放済みの領域を更新・参照した場合」かならず、参照時にエラーとなるとは言えないので※2で前提条件がないか確認させていただきました よって、※2の前提条件があると仮定すれば、※3のようなメモリアクセスとなるため >「更新するためには、事前に更新するメモリ領域が参照できなければ更新できないからである」※5 は成り立ちます ※2の前提条件がないのであれば、※4のようなメモリアクセスとなる可能性があるため、※5は成り立ちません
お礼
ご回答ありがとうございます。お返事が大変遅くなり申し訳ありません。 取得した範囲外や、解放済みの領域について、 (1)メモリにデータを書き込む場合(a = 3;)…書き込み時に不正アクセスとなる。 (2)メモリの値を加算あるいは減算する場合(a = a + 1;)…読み込み時(加算前、aの値を読み込んだとき)に不正アクセスとなる。 ということでよろしいでしょうか。 調べてみたところ、(2)はどうか分かりませんが、(1)の場合は書き込み時ではなくその後の参照時に、障害が起こるようです。 特に、C言語のポインタでループして値を書き込む場合、範囲外のメモリに次々に値を書き込んでしまい、「メモリ破壊」が起こる危険があるそうです。書き込んだ時点ではエラーは起こらず、その後メモリの値を読み込もうとしたとき、「何か変な値が入ってる!」と初めて気づくのだとか。(私の職場でも問題になっています。) ですので、この問題の解説は、 「(本来は)更新するためには、事前に更新するメモリ領域が参照できなければ更新できない(はずなのに、更新できてしまうため、更新時はエラーに気づかない)からである」 という意味だと解釈しました。 かなり無理矢理ですが……。 追伸:おかげさまで試験に合格しました。ありがとうございました。
補足
質問の内容が不十分でしたので、補足させていただきます。 この問題は、平成21年度春期 基本情報技術者 午後問題 問2です。解説は、ITEC『本試験問題 徹底解説』より引用しています。 この問題は穴埋め問題であり、正答を当てはめて文章を完成させると次のようになります。 「一般に、取得した範囲外や解放済みの記憶域を謝って更新するなどの障害は、更新内容を後で参照したときに障害となることが多く、原因箇所の特定が困難である」。