Findbugs Warnung: Ganzzahlverschiebung um 32 - was bedeutet das?

8

Ich habe mit Findbugs einen Drittanbieter-Quellcode gescannt (um vorsichtig zu sein, bevor ich ihn in meine integriert habe) und die folgende Warnung gefunden:

%Vor%
  

Bug: Integer-Verschiebung um 32 Muster-ID:   ICAST_BAD_SHIFT_AMOUNT, geben Sie ein: BSHIFT,   Kategorie: KORREKTHEIT

     

Der Code führt eine Ganzzahlverschiebung um   eine konstante Menge außerhalb des Bereichs   0..31. Dies hat zur Folge, dass die unteren 5 Bits des ganzzahligen Werts verwendet werden   um zu entscheiden, wie weit man sich bewegen soll. Dies   wahrscheinlich wurde nicht erwartet, und   es ist zumindest verwirrend.

Könnte jemand bitte erklären, was genau das oben bedeutet?

Danke! (Ich bin ein Neuling in Java-Programmierung)

    
His 21.06.2009, 07:28
quelle

2 Antworten

30

Aus der Java-Sprachspezifikation :

  

Wenn der hochgestufte Typ des linken Operanden int ist, werden nur die fünf niedrigstwertigen Bits des rechten Operanden als Verschiebungsentfernung verwendet. Es ist so, als ob der rechte Operand einem bitweisen logischen UND-Operator & amp; (§15.22.1) mit dem Maskenwert 0x1f. Die tatsächlich genutzte Verschiebestrecke liegt daher immer im Bereich von 0 bis einschließlich 31.

Wenn also b ein int ist, ist der Ausdruck identisch mit

%Vor%

was ich sehr bezweifle ist, was beabsichtigt ist. Es hätte wahrscheinlich

sein sollen %Vor%

(Wenn b bereits lang ist, ist der Code korrekt und FindBugs irrt sich über den Fehler).

    
Rasmus Faber 21.06.2009, 07:38
quelle
5

Bearbeitet: Das Problem ist fast sicher darauf zurückzuführen, dass "b" ein "int" und kein "long" ist.

In C, wenn 'b' eine Ganzzahl anstelle einer langen ist und Sie um 32 Bits nach links verschieben, wurden alle Bits aus dem ursprünglichen Wert entfernt, so dass das Ergebnis des Gesamtausdrucks derselbe wäre als 'c' würden Sie undefiniertes Verhalten aufrufen, daher ist jedes Ergebnis zulässig. Java definiert Dinge anders - wie in dem Kommentar von Rasmus Faber und der gewählten Antwort angemerkt - und verschiebt überlange Verschiebungen modulo die maximale Anzahl von Bits, die verschoben werden können. [Es scheint eine seltsame Art, Geschäfte zu machen; Ich hätte wahrscheinlich eine Ausnahme in einer Sprache arrangiert, die sie hat. Es ist jedoch klar definiert, was wichtiger ist als genau, was die Definition ist.] Die Nötigung auf 64 Bits tritt nicht auf, während der Ausdruck ausgewertet wird; Es tritt auf, wenn der Ausdruck vollständig ist und die Zuweisung erfolgt.

Der Hinweis auf 5 Bits ist ... faszinierend. Das bedeutet, dass Sie, wenn Sie um beispielsweise 48 oder 110000 nach links gehen, dasselbe tun, als würden Sie um 16 nach links verschieben. Alternativ ist " x << n " dasselbe wie " x << (n % 32) ".

    
Jonathan Leffler 21.06.2009 07:32
quelle

Tags und Links