« 『○○さんが使用しています。コピーを作成しますか?』と言われる…。 | トップページ | 『glViewport』の怪… »

2011年8月12日 (金)

配列外アクセスしても例外が発生しない…!?

ざっくり書いてしまえばこんな感じ。

>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
とある…。

つまりプログラムを格納するワークの開始位置と言う訳だ。

だから何だと言われたらあれだが…。

知っていると役に立つかもしれない…

たたないかもしれない…。

|

« 『○○さんが使用しています。コピーを作成しますか?』と言われる…。 | トップページ | 『glViewport』の怪… »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/52458684

この記事へのトラックバック一覧です: 配列外アクセスしても例外が発生しない…!?:

« 『○○さんが使用しています。コピーを作成しますか?』と言われる…。 | トップページ | 『glViewport』の怪… »