AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unverständliche Compiler Warnung

Ein Thema von TurboMagic · begonnen am 10. Dez 2023 · letzter Beitrag vom 10. Dez 2023
Antwort Antwort
Seite 1 von 2  1 2      
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#1

Unverständliche Compiler Warnung

  Alt 10. Dez 2023, 14:22
Hallo,

in folgendem Codefragment bekomme ich diese Compilerwarung:
[DCC Warnung] DECHash.pas(5316): W1012 Konstantenausdruck verletzt untere Grenzen

Delphi-Quellcode:
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;
FCost ist dabei ein UInt8.
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:
procedure THash_BCrypt.EksBlowfishSetup(var Password : TBytes;
                                        PasswordSize : Integer);
in DECHash.pas hier: https://github.com/decfpc/DelphiEncryptionCompendium

Was löst die Warnung aus?

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#2

AW: Unverständliche Compiler Warnung

  Alt 10. Dez 2023, 14:34
Wir wissen genausowenig wie der Kompiler, welche Werte FCost zu Laufzeit annehmen kann.

Sollte FCost mal 0 sein, dann kommt hier (Int32(1) shl FCost) - 1; -1 heraus und das ist außerhalb des zulässigen Bereiches für rounds als UInt32.

[edit]
Misst, jetzt kann ich nichtmal mehr 1 -1 ausrechnen, erinnert mich an Positive Zahlen in negative umwandeln

Geändert von Delphi.Narium (10. Dez 2023 um 14:53 Uhr)
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
346 Beiträge
 
#3

AW: Unverständliche Compiler Warnung

  Alt 10. Dez 2023, 14:37
Wir wissen genausowenig wie der Kompiler, welche Werte FCost zu Laufzeit annehmen kann.

Sollte FCost mal 0 sein, dann kommt hier (Int32(1) shl FCost) - 1; -1 heraus und das ist außerhalb des zulässigen Bereiches für rounds als UInt32.
"shl 0" and "shr 0" will do nothing, hence if FCost =0
Zitat:
(Int32(1) shl FCost) - 1 = 0
Kas
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#4

AW: Unverständliche Compiler Warnung

  Alt 10. Dez 2023, 14:38
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#5

AW: Unverständliche Compiler Warnung

  Alt 10. Dez 2023, 14:39
Die Warnung sprich von einem Konstantausdruck. Ich denke Laufzeitwerte sind dabei egal.

Davon abgesehen ist (1 shl 0) - 1 = 0 und nicht -1.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#6

AW: Unverständliche Compiler Warnung

  Alt 10. Dez 2023, 14:40
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.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#7

AW: Unverständliche Compiler Warnung

  Alt 10. Dez 2023, 14:42
Stimmt!

Nur wo ist da die Konstante?
MaxLongint? Oder Int32(1)?
Falls letzteres: UInt32(1) hat nicht geholfen.

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#8

AW: Unverständliche Compiler Warnung

  Alt 10. Dez 2023, 14:44
Übrigens kann ich weder die Klasse noch die Routine in DecHash.pas des verlinkten Repos finden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#9

AW: Unverständliche Compiler Warnung

  Alt 10. Dez 2023, 14:54
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 MaxLongint ist kein UInt32, also müsste eigentlich MaxLongCardinal bzw. MaxUInt sein , oder einfach High(UInt32) .
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Dez 2023 um 15:03 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#10

AW: Unverständliche Compiler Warnung

  Alt 10. Dez 2023, 14:54
Komisch! Das kann eigentlich nicht sein. Hast du im Development Branch geschaut?

Grüße
TurboMagic
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz