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 ... ... 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). P> 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. ; -) P> 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> < 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. P> P>
6 Réponses :
Peut être votre calcul avec Java .Math.Biginteger et comparez le résultat avec
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.
Vous voulez cela au moment de la compilation? Je n'ai pas vu un réglage pour faire cela. P>
Si vous vraiment em> veux-y, le meilleur pari est le plus susceptible d'écrire un nouveau jeu de règles pour PMD? P>
Quel serait le résultat attendu pour cela?
long testMethod () { long aLong = Integer.MAX_VALUE + doesMethodContainAnOverflow ( "testMethod" ) ? 0 : 1; return aLong; }
La question est pour potentiel i> 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).
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. P>
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. P>
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.
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 p>
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: p>
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 ...
Si vous ne savez pas ce que X pourrait être, cela pourrait être le pire des cas. Donc, quel est le pire cas: 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
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 code> astuce ...