# HG changeset patch # User igerasim # Date 1399357728 -14400 # Node ID fdd0f8ace274e5cfaadd795930b01edee9664163 # Parent bbb6ce1a16abd51383efcca93f19977eab8bbfbc 8040806: BitSet.toString() can throw IndexOutOfBoundsException Reviewed-by: plevart, mduigou diff -r bbb6ce1a16ab -r fdd0f8ace274 src/share/classes/java/util/BitSet.java --- a/src/share/classes/java/util/BitSet.java Fri Nov 07 10:24:22 2014 -0800 +++ b/src/share/classes/java/util/BitSet.java Tue May 06 10:28:48 2014 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -696,6 +696,9 @@ *
 {@code
      * for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
      *     // operate on index i here
+     *     if (i == Integer.MAX_VALUE) {
+     *         break; // or (i+1) would overflow
+     *     }
      * }}
* * @param fromIndex the index to start checking from (inclusive) @@ -1186,10 +1189,12 @@ int i = nextSetBit(0); if (i != -1) { b.append(i); - for (i = nextSetBit(i+1); i >= 0; i = nextSetBit(i+1)) { + while (true) { + if (++i < 0) break; + if ((i = nextSetBit(i)) < 0) break; int endOfRun = nextClearBit(i); do { b.append(", ").append(i); } - while (++i < endOfRun); + while (++i != endOfRun); } } diff -r bbb6ce1a16ab -r fdd0f8ace274 test/java/util/BitSet/BSMethods.java --- a/test/java/util/BitSet/BSMethods.java Fri Nov 07 10:24:22 2014 -0800 +++ b/test/java/util/BitSet/BSMethods.java Tue May 06 10:28:48 2014 +0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* @test * @bug 4098239 4107540 4080736 4261102 4274710 4305272 - * 4979017 4979028 4979031 5030267 6222207 + * 4979017 4979028 4979031 5030267 6222207 8040806 * @summary Test the operation of the methods of BitSet class * @author Mike McCloskey, Martin Buchholz */ @@ -897,6 +897,16 @@ private static void testToString() { check(new BitSet().toString().equals("{}")); check(makeSet(2,3,42,43,234).toString().equals("{2, 3, 42, 43, 234}")); + try { + check(makeSet(Integer.MAX_VALUE-1).toString().equals( + "{" + (Integer.MAX_VALUE-1) + "}")); + check(makeSet(Integer.MAX_VALUE).toString().equals( + "{" + Integer.MAX_VALUE + "}")); + check(makeSet(0, 1, Integer.MAX_VALUE-1, Integer.MAX_VALUE).toString().equals( + "{0, 1, " + (Integer.MAX_VALUE-1) + ", " + Integer.MAX_VALUE + "}")); + } catch (IndexOutOfBoundsException exc) { + fail("toString() with indices near MAX_VALUE"); + } } private static void testLogicalIdentities() {