8
votes

Comment trouver des débordements numériques potentiels dans le code Java, en utilisant Eclipse?

Y a-t-il un moyen de trouver des débordements numériques potentiels dans le code Java, en utilisant l'Eclipse IDE? Par exemple ... xxx

... où x, y et z sont des INT et le résultat peut déborder entier.max_value. (Notez que, peut-être contre-intuitivement, si le résultat dans cet exemple déborde integer.max_value, se verra attribuer la valeur erronée erronée).

J'ai examiné les paramètres d'avertissements d'Eclipse, des règles PMD et Règles Findbugs et je ne trouve aucun réglage pour vous aider avec cela. Un collègue note que Intellij fera avertir cela ... et je détesterai à admettre que je ne peux pas faire la même chose avec Eclipse. ; -)


Clarification 1: Je ne cherche pas quelque chose qui donne 0 faux positifs ... juste des avertissements que "Vous pouvez avoir un problème de dépassement ici"., < P> Clarification 2: Ceci est souhaité au "temps de développement" ... signification, à la même étape que Eclipse recherche des importations non utilisées, PMD vérifie ses règles, etc.


2 commentaires

Vous voulez donc être averti de toute opération arithmétique? A = X + Y peut déborder si A, X et Y sont le même type intégral


J'aimerais aussi avoir un tel chèque, mais seulement pour la multiplication. Je fais la programmation du concours et généralement, les valeurs sont jusqu'à 10 ^ 9, l'addition n'est pas un problème, mais la multiplication est et je veux être averti, sinon j'oublie 1L * x * y astuce ...


6 Réponses :


-1
votes

Peut être votre calcul avec Java .Math.Biginteger et comparez le résultat avec xxx


1 commentaires

C'est un moyen de faire le calcul sans erreurs, mais de ne pas détecter si un calcul est soumis à un type d'erreur particulier, ce qui est la question de la question.



0
votes

Vous voulez cela au moment de la compilation? Je n'ai pas vu un réglage pour faire cela.

Si vous vraiment veux-y, le meilleur pari est le plus susceptible d'écrire un nouveau jeu de règles pour PMD?


0 commentaires

0
votes

Quel serait le résultat attendu pour cela?

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

     return aLong;
 }


1 commentaires

La question est pour potentiel Overflows, qui est la réponse pire des cas, ce que vous soulignez, est décidable. La fonctionnalité ne consiste pas à décider des débordements de toute façon, cela ressemble plus à une attention particulière aux choses que le programmeur n'aurait peut-être pas reconnu comme des points de débordement potentiels, bien que le bruit soit probablement assez élevé (l'ajout simple d'entiers variables doit le mettre hors tension, par exemple).



0
votes

Cela nécessiterait une analyse profonde d'un algorithme ou vous donnerait simplement un avertissement pour chaque opération arithmétique qui implique des variables.

EDIT: Oh, voulez-vous dire que si x, y et z sont des entiers, la multiplication serait sur des entiers et que ce ne serait attribué qu'en suivi? Intellij Ideaillera comme un avertissement, mais l'inspection est désactivée par défaut.


2 commentaires

Oui, votre édition est correcte. Je cherche juste un avertissement similaire à l'idée d'Intellij.


Vous pouvez écrire une règle PMD de Findbugs, mais je ne pense pas cela en vaut la peine.



1
votes

Dans Findbugs La description du détecteur FindPuzzlers contient

iCast_integer_multiphe_cast_to_long (ICAST, style): résultat de la multiplication entier de moulage à long

mais d'une manière ou d'une autre, je ne peux pas faire de cela détecter le problème dans le code suivant: xxx


1 commentaires

Il existe deux réglages dans le plug-in Eclipse - "Classe minimum au rapport" et "confiance minimale au rapport". Ceci a rang 17 et est montré lorsque la confiance est définie sur basse ou moyenne ...



4
votes

Si vous ne savez pas ce que X pourrait être, cela pourrait être le pire des cas. Donc, quel est le pire cas: xxx pré>

Conclusion: vous ne voulez pas que Eclipse vous avertit de tout. P>

Si vous voulez réparer le débordement entier de P>

 /*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


0 commentaires