Avertissement Findbugs: décalage d'entier de 32 & # 8212; Qu'est-ce que ça veut dire?

StackOverflow https://stackoverflow.com/questions/1023373

  •  06-07-2019
  •  | 
  •  

Question

Je scannais un code source tiers à l'aide de Findbugs (juste pour être prudent avant de l'intégrer au mien) et j'ai trouvé l'avertissement suivant:

long a = b << 32 | c
  

Bug: décalage entier de 32 identifiant de modèle:   ICAST_BAD_SHIFT_AMOUNT, tapez: BSHIFT,   catégorie: CORRECTNESS

     

Le code effectue un décalage entier de   une quantité constante en dehors de la plage   0..31. Ceci a pour effet d'utiliser les 5 bits inférieurs de la valeur entière   pour décider combien de déplacer par. Ce   probablement pas était était attendu, et   au moins déroutant.

Quelqu'un pourrait-il expliquer ce que cela signifie exactement?

Merci! (Je suis un novice en programmation Java)

Était-ce utile?

La solution

D'après les spécification du langage Java :

  

Si le type promu de l'opérande gauche est int, seuls les cinq bits de poids faible de l'opérande droit sont utilisés comme distance de décalage. C'est comme si l'opérande de droite était soumis à un opérateur AND logique au niveau des bits, & amp; (§15.22.1) avec la valeur de masque 0x1f. La distance de décalage réellement utilisée est donc toujours comprise entre 0 et 31 inclus.

Donc si b est un entier, l'expression est identique à

long a = b | c;

que je doute fortement est ce qui est destiné Cela aurait probablement dû être

long a = ((long) b << 32) | c;

(Si b est déjà long, le code est correct et FindBugs se trompe à propos du bogue).

Autres conseils

Édité: Le problème provient certainement du fait que "b" est un "int" et non un "long".

En C, si 'b' est un entier au lieu d'un long et que vous décalez à gauche de 32 bits, tous les bits de la valeur d'origine ont été supprimés, le résultat de l'expression globale serait alors le même. En tant que 'c' , vous invoquez un comportement indéfini, ainsi tout résultat est autorisé. Java définit les choses différemment - comme indiqué dans le commentaire de Rasmus Faber et la réponse choisie - et décale de manière excessive le nombre maximal de bits pouvant être décalés. [Cela semble une façon étrange de faire des affaires; J'aurais probablement organisé une exception dans une langue qui les contient. Cependant, il est clairement défini, ce qui est plus important que la définition exacte.] La contrainte sur 64 bits ne se produit pas tant que l'expression est évaluée. cela se produit lorsque l'expression est terminée et que l'assignation est effectuée.

La référence à 5 bits est ... intrigante. Cela signifie que si vous décalez à gauche de, disons, 48 ??ou 110000 binaire, cela équivaut à un décalage à gauche de 16. Ou, alternativement, ' x < < n 'est identique à' x < < (n% 32) '.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top