JavaA2Z

KAB-studio > プログラミング > JavaA2Z > バッファオーバーフローとは

バッファオーバーフロー

日本語 文字配列溢れ
英語 buffer overflow
ふりがな ばっふぁおーばーふろー
フリガナ バッファオーバーフロー

解説

文字列を格納する配列を越えたサイズの文字列を格納すること。
文字列を格納する配列を「バッファ」といい、そのサイズを越えた文字列を格納して「オーバーフロー」してしまうため「バッファオーバーフロー」と呼ばれる。
また、この原因となる「バッファオーバーラン」が同義語として使われることもある。
 
Javaでは、配列のサイズを越えたインデックスナンバーを使用するとArrayIndexOutOfBoundsException例外投げられるため、配列に対してバッファオーバーフローを起こすことはできない。
また、Stringクラスは書き換えが不可能なため、Stringクラスに対してバッファオーバーフローを起こすことはできない。
さらに、StringBufferクラスは可変長なため、StringBufferクラスに対してバッファオーバーフロー起こすことはできない。
以上の理由から、Javaでは「Javaそのものの欠陥」でない限り、バッファオーバーフローを発生させることはできない。
 
そもそも、Javaではバッファオーバーフローを起こす意味がない。
WindowsにおけるExeのような「実ファイル」の場合、バッファオーバーフローは致命的な問題となる。それは、アクセスできるメモリ上に、変数プログラムが同一に格納されているためである。
そのため、バッファオーバーフローにより「配列のサイズを越えた文字列」を書き込むことで「プログラムを書き換える」ことが可能になり、任意のプログラムが実できるからである。
また、こういった実ファイルを作るC++言語等が「バッファオーバーフローを検出できない」ため、バッファオーバーフローを許すことになる。
だが、Java仮想マシンの場合、メモリ環境は完全な管理下に置かれており、このようなことは通常は発生しない。

参考サイト

  • (参考サイトはありません)

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // たとえばchar型配列で4文字の場合。
        char[] chars = new char[]{ 'あ''い''う''え' };
        System.out.println( chars );

        // このサイズを越えて文字列を書き込むことを
        // 「バッファオーバーフロー」と言います。
        try
        {
            chars[4] = 'お';
        }
        catch( ArrayIndexOutOfBoundsException e )
        {
            e.printStackTrace();
            // java.lang.ArrayIndexOutOfBoundsException: 4
            //     at Sample.main(Sample.java:14)
        }

        // このように、Javaでは例外が発生します。
        // また、String型は書き換え不可能ですし、
        // StringBufferは可変長なので、これらも
        // バッファオーバーフローは発生しません。
        // そもそも、メモリ環境が実行環境と異なるので
        // バッファオーバーフローを発生させる意味もありません。
    }
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // たとえばchar型配列で4文字の場合。
        char[] chars = new char[]{ 'あ', 'い', 'う', 'え' };
        System.out.println( chars );

        // このサイズを越えて文字列を書き込むことを
        // 「バッファオーバーフロー」と言います。
        try
        {
            chars[4] = 'お';
        }
        catch( ArrayIndexOutOfBoundsException e )
        {
            e.printStackTrace();
            // java.lang.ArrayIndexOutOfBoundsException: 4
            //     at Sample.main(Sample.java:14)
        }

        // このように、Javaでは例外が発生します。
        // また、String型は書き換え不可能ですし、
        // StringBufferは可変長なので、これらも
        // バッファオーバーフローは発生しません。
        // そもそも、メモリ環境が実行環境と異なるので
        // バッファオーバーフローを発生させる意味もありません。
    }
}

この単語を含むページ

「みだし」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/06/20
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。