mirror of
https://github.com/openjdk/jdk.git
synced 2026-06-02 00:34:44 +00:00
4421494: infinite loop while parsing double literal
Reviewed-by: darcy, alanb
This commit is contained in:
parent
477c01454f
commit
aa6f495fbe
@ -1547,7 +1547,7 @@ public class FloatingDecimal{
|
||||
if ( (cmpResult = bigB.cmp( bigD ) ) > 0 ){
|
||||
overvalue = true; // our candidate is too big.
|
||||
diff = bigB.sub( bigD );
|
||||
if ( (bigIntNBits == 1) && (bigIntExp > -expBias) ){
|
||||
if ( (bigIntNBits == 1) && (bigIntExp > -expBias+1) ){
|
||||
// candidate is a normalized exact power of 2 and
|
||||
// is too big. We will be subtracting.
|
||||
// For our purposes, ulp is the ulp of the
|
||||
|
||||
@ -23,11 +23,12 @@
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 4160406 4705734 4707389 4826774 4895911
|
||||
* @bug 4160406 4705734 4707389 4826774 4895911 4421494
|
||||
* @summary Test for Double.parseDouble method and acceptance regex
|
||||
*/
|
||||
|
||||
import java.util.regex.*;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public class ParseDouble {
|
||||
|
||||
@ -416,7 +417,15 @@ public class ParseDouble {
|
||||
|
||||
"0x00100p1",
|
||||
"0x00.100p1",
|
||||
"0x001.100p1"
|
||||
"0x001.100p1",
|
||||
|
||||
// Limits
|
||||
|
||||
"1.7976931348623157E308", // Double.MAX_VALUE
|
||||
"4.9e-324", // Double.MIN_VALUE
|
||||
"2.2250738585072014e-308", // Double.MIN_NORMAL
|
||||
|
||||
"2.2250738585072012e-308", // near Double.MIN_NORMAL
|
||||
};
|
||||
|
||||
static String paddedBadStrings[];
|
||||
@ -546,6 +555,32 @@ public class ParseDouble {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* For each subnormal power of two, test at boundaries of
|
||||
* region that should convert to that value.
|
||||
*/
|
||||
private static void testSubnormalPowers() {
|
||||
BigDecimal TWO = BigDecimal.valueOf(2);
|
||||
// An ulp is the same for all subnormal values
|
||||
BigDecimal ulp_BD = new BigDecimal(Double.MIN_VALUE);
|
||||
|
||||
// Test subnormal powers of two
|
||||
for(int i = -1074; i <= -1022; i++) {
|
||||
double d = Math.scalb(1.0, i);
|
||||
|
||||
/*
|
||||
* The region [d - ulp/2, d + ulp/2] should round to d.
|
||||
*/
|
||||
BigDecimal d_BD = new BigDecimal(d);
|
||||
|
||||
BigDecimal lowerBound = d_BD.subtract(ulp_BD.divide(TWO));
|
||||
BigDecimal upperBound = d_BD.add(ulp_BD.divide(TWO));
|
||||
|
||||
double convertedLowerBound = Double.parseDouble(lowerBound.toString());
|
||||
double convertedUpperBound = Double.parseDouble(upperBound.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
rudimentaryTest();
|
||||
|
||||
@ -558,5 +593,7 @@ public class ParseDouble {
|
||||
testRegex(paddedGoodStrings, false);
|
||||
testRegex(badStrings, true);
|
||||
testRegex(paddedBadStrings, true);
|
||||
|
||||
testSubnormalPowers();
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user