![]() |
Unverständliche Compiler Warnung
Hallo,
in folgendem Codefragment bekomme ich diese Compilerwarung: [DCC Warnung] DECHash.pas(5316): W1012 Konstantenausdruck verletzt untere Grenzen
Delphi-Quellcode:
FCost ist dabei ein UInt8.
var
i, rounds: UInt32; begin // number of rounds = 2^cost, loop includes 0 if (FCost = 31) then rounds := MaxLongint else rounds := (Int32(1) shl FCost) - 1; Und leider zeigt die IDE auf das ELSE wenn ich von der Warnunbg aus hinspringe. Ein Ändern des Typecast auf UInt32(1) hat nicht geholfen. Wer sich für mehr Kontext interessiert:
Delphi-Quellcode:
in DECHash.pas hier:
procedure THash_BCrypt.EksBlowfishSetup(var Password : TBytes;
PasswordSize : Integer); ![]() Was löst die Warnung aus? Grüße TurboMagic |
AW: Unverständliche Compiler Warnung
Wir wissen genausowenig wie der Kompiler, welche Werte FCost zu Laufzeit annehmen kann.
Sollte FCost mal 0 sein, dann kommt hier
Delphi-Quellcode:
-1 heraus und das ist außerhalb des zulässigen Bereiches für rounds als UInt32.
(Int32(1) shl FCost) - 1;
[edit] Misst, jetzt kann ich nichtmal mehr 1 -1 ausrechnen, erinnert mich an ![]() |
AW: Unverständliche Compiler Warnung
Zitat:
Zitat:
|
AW: Unverständliche Compiler Warnung
Hallo,
danke für diese schnelle Analyse! Nur: wie fixe ich das...? Das was mir gerade einfiele wäre, FCost nicht als UInt8 zu definieren, sondern einen eigenen Typen anzulegen, der dann bei 1 beginnt. FCost ist in dem Fall der "Kostenfaktor" für den BCrypt Passwort Hash Algorithmus. Grüße TurboMagic |
AW: Unverständliche Compiler Warnung
Die Warnung sprich von einem Konstantausdruck. Ich denke Laufzeitwerte sind dabei egal.
Davon abgesehen ist (1 shl 0) - 1 = 0 und nicht -1. |
AW: Unverständliche Compiler Warnung
Ok, I already got that now.
I'm thinking about how to fix this in that algorithm. It's the cost factor for the BCrypt password hashing algorithm. It's used to adapt this to higher CPU speeds. I'm toying with creating my own datatype which starts at 1 so nobody can define a cost of 0. But I'm not sure yet whether this is a good idea or not. |
AW: Unverständliche Compiler Warnung
Stimmt!
Nur wo ist da die Konstante? MaxLongint? Oder Int32(1)? Falls letzteres: UInt32(1) hat nicht geholfen. Grüße TurboMagic |
AW: Unverständliche Compiler Warnung
Übrigens kann ich weder die Klasse noch die Routine in DecHash.pas des verlinkten Repos finden.
|
AW: Unverständliche Compiler Warnung
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:
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.
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; Bei deiner Berechnung ist der Typ des Ergebnisses nunmal nicht nur vom Typen der Konstante abhängig, denn nach SHL und
Delphi-Quellcode:
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:
Ebenfalls MaxLongint ist kein UInt32, also müsste eigentlich MaxLongCardinal bzw. MaxUInt sein :stupid:, oder einfach
rounds := UInt32(1 shl FCost) - 1;
rounds := UInt32(1 shl FCost - 1);
Delphi-Quellcode:
.
High(UInt32)
|
AW: Unverständliche Compiler Warnung
Komisch! Das kann eigentlich nicht sein. Hast du im Development Branch geschaut?
Grüße TurboMagic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz