In aktuelleren Delphis sind nun "standardmäßig" die Bereichs- und Überlaufprüfung aktiv (sowie auch die Indexprüfung), für neue Projekte.
Natürlich könnte man das einfach wieder deaktivieren,
aber nicht unbedingt in den Projektoptionen,
sondern vor/um die jeweilige Stelle, wo man "absichtlich" mit einem "Überlauf" arbeitet,
wobei sich hier das Problem auch einfach durch passende TypeCasts beheben lässt.
Delphi-Quellcode:
if (FCost = 31) then
rounds := UInt32(MaxLongint)
else
rounds := UInt32((UInt32(1) shl FCost) - 1);
if (FCost = 31) then
Int32(rounds) := MaxLongint
else
Int32(rounds) := (Int32(1) shl FCost) - 1;
Da aber Hashing und Verschlüsselung sowieso per se mit Überläufen arbeitet, ist hier das Deaktivieren der Prüfung, innerhalb dieser
Unit, eine legitime Lösung.
Bei deiner Berechnung ist der Typ des Ergebnisses nunmal nicht nur vom Typen der Konstante abhängig, denn nach SHL und
-
kann ein anderer Typ rauskommen.
Bei einer Subtraction kann theoretisch auch ein negativer Wert raus kommen, weswegen es nach dem - vielleicht zu Int32 werden könnte, selbst wenn die 1 ein UInt32 wäre.
Delphi-Quellcode:
rounds := UInt32(1 shl FCost) - 1;
rounds := UInt32(1 shl FCost - 1);
Ebenfalls Max
Longint ist
kein UInt32, also müsste eigentlich MaxLongCardinal bzw. MaxUInt sein
, oder einfach
High(UInt32)
.