IT TIP

Java BigDecimal 가능한 오버 플로우 버그

itqueen 2020. 10. 12. 21:17
반응형

Java BigDecimal 가능한 오버 플로우 버그


를 포함하는 일부 코드에서 경계 조건을 테스트하고 있었는데 BigDecimala BigDecimal가 문자열로 초기화 될 때 "1e2147483647"예기치 않게 작동 한다는 것을 알았 습니다. 사이의 값을 갖고있는 것 같아요 01e-2147483647. 내가 전화 할 때 intValue(), 나는 얻을 NegativeArraySizeException. 2147483647내 시스템에서 정수의 최대 값 이라는 점에 유의해야 합니다. 내가 뭘 잘못하고 BigDecimal있습니까 , 아니면 이것이 문제 입니까?

BigDecimal test = new BigDecimal("1e2147483647");

test.compareTo(new BigDecimal(0));  //Returns 1
test.compareTo(new BigDecimal("1e-2147483647"));  //Returns -1
test.intValue();  //Throws NegativeArraySizeException

아니요, 합법적 인 버그가있는 것 같습니다. 버그는 JDK7에 있지만 JDK8에서 수정되었습니다. 값은 BigDecimals 로 올바르게 표현할 수 있으며 올바르게 작동해야하지만 그렇지 않습니다.

추적을 통해 소스 코드BigDecimal 라인 2585에하면 this.precision()1이고, this.scale이다 -2147483647. this.precision() - this.scale따라서 오버플로가 발생하고 다음 오버플로가 올바르게 처리되지 않습니다.

이 버그 산술 에서 빼기를 수행하여long JDK8 에서 수정되었습니다 .

참고 URL : https://stackoverflow.com/questions/31170459/java-bigdecimal-possible-overflow-bug

반응형