配列外アクセスしても例外が発生しない…!?
ざっくり書いてしまえばこんな感じ。
>Data = DataList + Index - 1;
>if( Data->Flag )
>{
>…
>}
「Index」は、1からとお約束だったのだが
0で来る場合があった。
つまり「DataList[-1]」にアクセスしたら
エラーが発生しなかったってこと。
「DataList」は、「malloc」で確保しいてる。
てっきりアクセス例外が発生すると思っていたのだが…。
こんなのを試してみた。
※VC++6のデバッグモードなので他では結果が変わるかも。
>void main(void)
>{
> int a = ((char*)0)[0];
>}
流石にゼロアクセスでは、きちんと例外が発生した。
「例外処理 (初回) は test.exe にあります: 0xC0000005: Access Violation。」
じゃあ、確保したメモリでは、どのぐらいの
アクセス許容があるか試してみた…。
>#include<malloc.h>
>void main(void)
>{
> int i;
> char b;
> char *a=(char*)malloc(10);
> for(i=0;;i--)
> b = a[i];
> free(a);
>}
「i=-1977」の時に例外が発生した。
>例外処理 (初回) は test.exe にあります: 0xC0000005: Access Violation。
意外に発生しなものだ。
発生アドレスが「a+i=0x0033ffff」。
勿論、配列外の読み込みで正しい値を得られるはずも無い。
また、書き込めばプログラマー泣かせの致命的なエラーになる。
…
他の配列ならどうだろう?
オート変数なら?
>void main(void)
>{
> char a[10];
> int i;
> char b;
> for(i=0;;i--)
> b = a[i];
>}
「i=-1036149」の時に例外が発生した。
>例外処理 (初回) は test.exe にあります: 0xC00000FD: Stack Overflow。
発生アドレスが「a+i=0x00032fff」。
オート変数は、スタックに取るので「Stack Overflow」になったんだろう。
多分「0x00033000~0x00130000」がスタック領域のようだ。
じゃあ、グローバルなら?
>char a[10];
>void main(void)
>{
> int i;
> char b;
> for(i=0;;i--)
> b = a[i];
>}
「i=-76561」の時に例外が発生した。
>例外処理 (初回) は test.exe にあります: 0xC0000005: Access Violation。
発生アドレスが「a+i=0x0x003fffff」。
マップ情報を見ると
> Preferred load address is 00400000
とある…。
つまりプログラムを格納するワークの開始位置と言う訳だ。
だから何だと言われたらあれだが…。
知っていると役に立つかもしれない…
たたないかもしれない…。
| 固定リンク
コメント