2009-09-16 2 views
7

자바 코드의 잠재적 숫자 오버 플로우를 찾을 수있는 방법은 이클립스 IDE를 사용하여,이 있습니까? 예를 들어 ... Eclipse를 사용하여 Java 코드에서 잠재적 인 숫자 오버 플로우를 찾는 방법은 무엇입니까?

long aLong = X * Y * Z; 

... X, Y 및 Z int 타입이며 결과에 Integer.MAX_VALUE 오버플 수있는 위치. (이 예제의 결과가 Integer.MAX_VALUE를 오버플로하면 aLong에 잘못된 오버플로 값이 할당됩니다.

Eclipse의 경고 설정, PMD 규칙 및 FindBugs 규칙을 살펴본 결과이 설정을 찾을 수 없습니다. 동료는 IntelliJ가 이것에 대해 경고 할 것이라고 말하면서 Eclipse에서 똑같이 할 수 없다는 것을 인정해야한다는 것을 싫어합니다. ;-)


명확한 설명 1 :. 내가 거짓 양성 ... "당신이 여기에 오버 플로우 문제가있을 수 있습니다"라는 경고와,

대한 설명이 있습니다 뭔가를 찾는 게 아니에요 :이 "개발 시점"에서 ... Eclipse가 사용하지 않는 수입을 찾고있는 동일한 단계에서 PMD가 규칙을 확인하고 있음을 의미합니다.

+0

그래서 당신은 어떤 산술 연산의 경고 싶어? a, x와 y가 같은 정수형 인 경우 a = x + y는 오버플로 할 수 있습니다. – Mark

+0

같은 검사를하고 싶지만 곱셈 만하고 싶습니다. 나는 콘테스트 프로그래밍을하고 있는데 일반적으로 값은 최대 9^9이므로 추가는 문제가 아니지만 곱셈은 경고가되고 그렇지 않으면 나는 '1L * x * y' 트릭을 잊어 버린다. – Betlista

답변

-1

java.math.BigInteger으로 계산을 수행하고

new java.math.BigInteger(String.valueOf(Long.MAX_VALUE)) 
+0

그 은 오류없이 계산을 수행하는 방법이지만 계산에 특정 유형의 오류가 있는지 여부를 감지하지는 않습니다. 이는 질문에서 묻는 것입니다. – Carl

0

컴파일 타임에 원하십니까? 이것을 할 설정을 보지 못했습니다.

이 실제로 인 경우 PMD에 대한 새로운 규칙 집합을 쓰는 것이 가장 좋습니다.

0

예상되는 결과는 무엇입니까?

long testMethod() { 
    long aLong = Integer.MAX_VALUE + doesMethodContainAnOverflow ("testMethod") ? 0 : 1; 

    return aLong; 
} 

오버플로가없는 경우에만 오버플로가 발생합니다.

고정 된 표현 정수 연산에는 잠재적 인 오버플로가 있습니다. 실제 오버플로가 있는지 여부를 결정하는 것은 중단 문제로 쉽게 전환 할 수 있습니다. 당신은, 예를 들어, 프로그램을 통해 모든 숫자 작업의 상한과 하한을 추적 할 수 있고 최악의 경우 답을 얻을 수 있지만를 작성 - 인 IntelliJ 어떤 경우에 경고를 몇 가지 발견이없는 것을 의미하지 않는다 정확한 규칙은 사소하거나 결정할 수 없다.

+0

질문은 * potential * overflows에 대한 것입니다. 이것은 최악의 경우의 대답으로, 여러분이 지적한대로 결정할 수 있습니다. 이 기능은 어쨌든 오버 플로우를 결정하는 것이 아니라 프로그래머가 잠재적 인 오버플로 포인트로 인식하지 못했던 것에주의를 환기시키는 것과 비슷합니다. 잡음은 아마도 꽤 높습니다 (변수 정수의 단순한 추가로 해제해야합니다.). – Carl

+0

누군가가 GEB – Jherico

0

알고리즘의 심층 분석이 필요하거나 변수가 포함 된 모든 산술 연산에 대해 경고를 줄 수 있습니다.

EDIT : 오, 당신은 X, Y, Z가 정수인 경우, 곱셈은 정수가되고 aLong에만 할당된다는 것을 의미합니까? IntelliJ Idea는 경고로 표시하지만 검사는 기본적으로 해제되어 있습니다. 긴

정수 곱셈 캐스트의 결과하지만 어떻게 든이 다음 코드에서 문제를 감지 할 수 없습니다 : 다음 FindPuzzlers 검출기의 설명을

ICAST_INTEGER_MULTIPLY_CAST_TO_LONG (ICAST, STYLE)를 포함 FindBugs에서

+0

을 읽고 있습니다. 예, 편집이 정확합니다. IntelliJ Idea가하는 것과 유사한 경고를 찾고 있습니다. – dirtyvagabond

+0

FindBugs 규칙의 PMD를 작성할 수는 있지만 그만한 가치는 없다고 생각합니다. –

1

final int x = 10000; 
    final int y = 10000; 
    final int z = 10000; 
    final long aLong = x * y * z; 
    System.out.println(aLong); 
+0

Eclipse 플러그인에는 "최소 순위보고"및 "최소 신뢰도보고"설정이 있습니다. 이 등급은 17 등급이며 자신감이 낮음 또는 중간으로 설정된 경우 표시됩니다. – Betlista

4

X가 무엇인지 알 수없는 경우 최악의 경우 일 수 있습니다.

int X = Integer.MAX_VALUE; 
long aLong = X + 1; 

결론 : 그래서, 최악의 경우 무엇 당신은 이클립스가 모든 것에 대해 경고하고 싶지 않아요.

당신이

long aLong = X * Y * Z; //you could write 
long aLong = (long)X * Y * Z; 

결론의 정수 오버 플로우 문제를 해결하려면 다음이 긴 오버 플로우 문제를 해결하지 않을 것이다. 당신이 그들을 수정하려는 경우 같은 코드를 작성해야 :

BigInteger tmp = BigInteger.valueOf(X).multiply(BigInteger.valueOf(Y)).multiply(BigInteger.valueOf(Z)); 
if(BigInteger.valueOf(Long.MAX_VALUE).compareTo(tmp)>=0){ 
    long aLong = tmp.longValue(); 
}else{ 
    System.out.println("Overflow"); 
} 

을하지만 결과 값은 길이에 맞게 수있는 경우에만 확인합니다. 그러나 계산 중에 "오버플로"가 발생했는지 묻는 중입니다. 이것은 모든 계산 후에 이것을 확인해야 함을 의미합니다.

전체 소스 파일을 구문 분석하여이 파일을 찾는 Eclipse 용 도구를 작성하려면 다음을 수행하십시오. 그러나 그것은 쉽게 단지 전체를 많이가 다음과 같은 값을 기억하는 것입니다 :

/*11111111111111111111111111111111*/int Y = -1; //-1 
/*11111111111111111111111111111111*/int QRY = (Y >> 1); //-1 
/*11111111111111111111111111111110*/int QLY = (Y << 1); //-2 
/*11111111111111111111111111111110*/int QLX = (X << 1); //-2 
/*11000000000000000000000000000000*/int QRZ = (Z >> 1); //-1073741824 
/*10000000000000000000000000000000*/int Z = Integer.MIN_VALUE; //-2147483648 
/*01111111111111111111111111111111*/int X = Integer.MAX_VALUE; // 2147483647 
/*00111111111111111111111111111111*/int QRX = (X >> 1); // 1073741823 
/*00000000000000000000000000000000*/int QLZ = (Z << 1); // 0 
관련 문제