# HG changeset patch # User igerasim # Date 1399357728 -14400 # Node ID f524e23d7f7b0735a7f9119491d5a3eb8ec8e38a # Parent da9a41004459e1c8940bf0a50a01a07306217f61 8040806: BitSet.toString() can throw IndexOutOfBoundsException Reviewed-by: plevart, mduigou diff -r da9a41004459 -r f524e23d7f7b jdk/src/share/classes/java/util/BitSet.java --- a/jdk/src/share/classes/java/util/BitSet.java Thu Mar 06 16:51:30 2014 +0000 +++ b/jdk/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 da9a41004459 -r f524e23d7f7b jdk/test/java/util/BitSet/BSMethods.java --- a/jdk/test/java/util/BitSet/BSMethods.java Thu Mar 06 16:51:30 2014 +0000 +++ b/jdk/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() {