バッファアンダーフロー
日本語 | 文字配列逆溢れ |
英語 | buffer underflow |
ふりがな | ばっふぁあんだーふろー |
フリガナ | バッファアンダーフロー |
文字列を格納する配列の前の位置へと値を格納すること。
文字列を格納する配列を「バッファ」といい、そのサイズを越えた文字列を格納した時に配列の先頭方向に溢れた場合、「オーバーフロー」の逆の「アンダーフロー」したことになるため「バッファアンダーフロー」と呼ばれる。
また、この原因となる「バッファアンダーラン」が同義語として使われることもある。
要は、バッファオーバーフローの逆で、文字列の書き込み時に、インデックスナンバーにマイナスの値を使用した場合に発生する。文字列を逆方向からコピーした際に発生しやすい。
バッファオーバーフローと同様、Javaでは通常発生しない。
バッファオーバーフローとバッファアンダーフローはほぼ同義語である。違いは、溢れる方向が、バッファオーバーフローはプラス方向、バッファアンダーフローがマイナス方向という違いである。
OSの中には、アドレスの小さい方にプログラムが置かれ、アドレスの大きい方に変数領域が置かれるものがある。その場合、バッファアンダーフローでなければプログラムを書き換えることができないため、この違いが大きな意味を持つ。
また、バッファアンダーフローにはCD-RやDVD-Rの書き込み時のエラーや、データをストリーミングで配信する場合のエラーを指す場合がある。
データを、一時格納箇所としての「バッファ」に起き、それを対象に渡すような処理の場合、バッファへの書き込みが、バッファから対象へ渡す速さよりも遅い場合に「バッファのデータが枯渇する」エラーが発生する。
これを、「バッファが枯渇してしまう」ことから、バッファが溢れてしまう「オーバーフロー」の逆として「バッファアンダーフロー」と呼ぶ。
この場合、前述のバッファアンダーフローとは意味が異なるため注意が必要。
文字列を格納する配列を「バッファ」といい、そのサイズを越えた文字列を格納した時に配列の先頭方向に溢れた場合、「オーバーフロー」の逆の「アンダーフロー」したことになるため「バッファアンダーフロー」と呼ばれる。
また、この原因となる「バッファアンダーラン」が同義語として使われることもある。
要は、バッファオーバーフローの逆で、文字列の書き込み時に、インデックスナンバーにマイナスの値を使用した場合に発生する。文字列を逆方向からコピーした際に発生しやすい。
バッファオーバーフローと同様、Javaでは通常発生しない。
バッファオーバーフローとバッファアンダーフローはほぼ同義語である。違いは、溢れる方向が、バッファオーバーフローはプラス方向、バッファアンダーフローがマイナス方向という違いである。
OSの中には、アドレスの小さい方にプログラムが置かれ、アドレスの大きい方に変数領域が置かれるものがある。その場合、バッファアンダーフローでなければプログラムを書き換えることができないため、この違いが大きな意味を持つ。
また、バッファアンダーフローにはCD-RやDVD-Rの書き込み時のエラーや、データをストリーミングで配信する場合のエラーを指す場合がある。
データを、一時格納箇所としての「バッファ」に起き、それを対象に渡すような処理の場合、バッファへの書き込みが、バッファから対象へ渡す速さよりも遅い場合に「バッファのデータが枯渇する」エラーが発生する。
これを、「バッファが枯渇してしまう」ことから、バッファが溢れてしまう「オーバーフロー」の逆として「バッファアンダーフロー」と呼ぶ。
この場合、前述のバッファアンダーフローとは意味が異なるため注意が必要。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// たとえばchar型配列4文字の場合。
char[] chars = new char[]{ 'あ', 'い', 'う', 'え' };
System.out.println( chars );
// この配列の前、つまりインデックスナンバーが
// マイナスの値でアクセスしようとすることを
// 「バッファアンダーフロー」と言います。
try
{
chars[-1] = 'ん';
}
catch( ArrayIndexOutOfBoundsException e )
{
e.printStackTrace();
// java.lang.ArrayIndexOutOfBoundsException: -1
// at Sample.main(Sample.java:15)
}
// このように、Javaでは例外が発生します。
}
}
public class Sample
{
public static void main( String[] args )
{
// たとえばchar型配列4文字の場合。
char[] chars = new char[]{ 'あ', 'い', 'う', 'え' };
System.out.println( chars );
// この配列の前、つまりインデックスナンバーが
// マイナスの値でアクセスしようとすることを
// 「バッファアンダーフロー」と言います。
try
{
chars[-1] = 'ん';
}
catch( ArrayIndexOutOfBoundsException e )
{
e.printStackTrace();
// java.lang.ArrayIndexOutOfBoundsException: -1
// at Sample.main(Sample.java:15)
}
// このように、Javaでは例外が発生します。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // たとえばchar型配列4文字の場合。 char[] chars = new char[]{ 'あ', 'い', 'う', 'え' }; System.out.println( chars ); // この配列の前、つまりインデックスナンバーが // マイナスの値でアクセスしようとすることを // 「バッファアンダーフロー」と言います。 try { chars[-1] = 'ん'; } catch( ArrayIndexOutOfBoundsException e ) { e.printStackTrace(); // java.lang.ArrayIndexOutOfBoundsException: -1 // at Sample.main(Sample.java:15) } // このように、Javaでは例外が発生します。 } }