class String_overflow { static void getChars() { String source = "abcdefg"; char[] dest = new char [3]; try { source.getChars (0, 5, // Source dest, (1<<31) - 1); Fail ("getChars", "Should not have succeeded"); } catch (Throwable e) { ExpectArrayIndex ("getChars", e); } } /* How do I stop a compiler warning causing a test to fail? static void getBytes() { String source = "abcdefg"; byte[] dest = new byte[3]; try { source.getBytes (0, 5, dest, (1<<31) - 1); Fail ("getBytes", "Should not have succeeded"); } catch (Throwable e) { ExpectArrayIndex ("getBytes", e); } } */ static void regionMatches() { if ("abcdefg".regionMatches (4, "abcdefg", 4, -1)) { Fail ("regionMatches", "Should not return true"); } try { if ("abcdefg".regionMatches (4, "abcdefg", 4, (1<<31)-1)) { Fail ("regionMatches (2nd)", "Should not return true"); } } catch (Throwable e) { Fail ("regionMatches (2nd)", e); } } static void regionMatchesCase() { if ("abcdefg".regionMatches (true, 4, "abcdefg", 4, -1)) { Fail ("regionMatchesCase", "Should not return true"); } try { if ("abcdefg".regionMatches (true, 4, "abcdefg", 4, (1<<31)-1)) { Fail ("regionMatchesCase (2nd)", "Should not return true"); } } catch (Throwable e) { Fail ("regionMatchesCase (2nd)", e); } } static void startsWith() { // We make the arg pretty big to try and cause a segfault. String s = new String ("abcdef"); StringBuffer b = new StringBuffer (1000000); b.setLength (1000000); String arg = new String (b); try { s.startsWith (arg, (1<<31) - 1000000); } catch (Throwable e) { Fail ("startsWith", e); } } static void valueOf() { char[] array = new char[] {'a', 'b', 'c', 'd', 'e'}; try { String.valueOf (array, 4, (1<<31)-1); Fail ("valueOf", "should not succeed"); } catch (Throwable e) { ExpectArrayIndex ("valueOf", e); } } public static void main (String[] args) throws Throwable { getChars(); // getBytes(); regionMatches(); regionMatchesCase(); startsWith(); valueOf(); if (tests_failed == 0) System.out.println ("ok"); } static void ExpectArrayIndex (String test, Throwable e) { if (e instanceof ArrayIndexOutOfBoundsException) return; Fail (test, e); } static void Fail (String test, Object problem) { ++tests_failed; System.err.print (test); System.err.print ('\t'); System.err.println (problem); } static int tests_failed; }