/* This tests some corner cases of arithmetic in StringBuffer. */ /* These tests can all be run on a 32 bit machine with modest amounts * of memory. */ /* The symptom of the problem is that ArrayIndexOutOfBoundsException * gets thrown, while the documentation says that * StringIndexOutOfBoundsException should be thrown. */ class StringBuffer_overflow { /* Test correct exception on getChars. */ static void getChars() { StringBuffer b = new StringBuffer ("x"); char[] s = new char [1]; try { // The substring we are attempting to obtain is invalid, // so we should get a StringIndexOutOfBoundsException. b.getChars (1, -1 << 31, s, 0); Fail ("getChars", "no exception"); } catch (Throwable e) { ExpectStringIndex ("getChars()", e); } } /* Test correct exception on append with bogus count. */ static void append() { StringBuffer s = new StringBuffer("a"); try { s.append ("".toCharArray(), 1, (1<<31)-1); Fail ("append", "no exception"); } catch (Throwable e) { ExpectStringIndex ("append", e); } } // Check that append still more or less works. static void appendbasic() { StringBuffer s = new StringBuffer(); try { if (!new StringBuffer().append ("abcdefg".toCharArray()) .toString().equals ("abcdefg")) { Fail ("appendbasic", "append gives incorrect result"); } } catch (Throwable e) { Fail ("appendbasic", e); } } /* Test correct expception on substring with bogus indexes. */ static void substring() { StringBuffer s = new StringBuffer ("abc"); try { // end - begin == -2 - ((1<<31)-1) == (1<<31) - 1 > 0. */ s.substring ((1<<31)-1, -2); Fail ("substring", "no exception"); } catch (Throwable e) { ExpectStringIndex ("substring", e); } } static void insert() { StringBuffer s = new StringBuffer (""); try { s.insert (0, "abcd".toCharArray(), (1<<31)-1, 1); Fail ("insert", "no exception"); } catch (Throwable e) { ExpectStringIndex ("insert", e); } } public static void main (String[] unused) { getChars(); append(); appendbasic(); substring(); insert(); if (tests_failed == 0) { System.out.println ("ok"); } } static int tests_failed = 0; static void ExpectStringIndex (String name, Throwable exception) { if (! (exception instanceof StringIndexOutOfBoundsException)) { Fail (name, exception); } } static void Fail (String name, Object why) { ++tests_failed; System.err.print (name); System.err.print ('\t'); System.err.println (why); } }