Entwickler-Ecke

Sonstiges (Delphi) - Lazarus Laufzeitfehler 215


Peter18 - Sa 10.11.18 12:15
Titel: Lazarus Laufzeitfehler 215
Ein freundliches Hallo an alle,

und wieder habe ich ein Problem mit Lazarus. In einer Routine bekomme ich einen Überlauf, der anscheinend bei Delphi4 und Berlin nichts ausmacht aber bei Lazarus gemeldet wird. Ich habe die Konfiguration geprüft, aber nichts gefunden. Na ja, Lazarus ist für mich neu. Fünf mal draufgeguckt und immer noch nicht gesehen. Viellleicht hat jemand eine Brille für mich, damit ich das Problem nicht mehr übersehe.

Die Variablen:

Delphi-Quelltext
1:
2:
3:
4:
5:
  a, b, c, d, t  : Cardinal                ;
  k              : Array[0..63of Cardinal;
  w              : Array[0..15of Cardinal;
  f, g           : Cardinal                ;
  x              : Cardinal                ;


Die Formel "a + f + k[j]" habe ich zerlegt, um die Stelle zu finden:

Delphi-Quelltext
1:
2:
3:
4:
5:
x := a                  ;
x := x + f              ;
x := x + k[j]           ;
x := x + w[g]           ;
x := a + f + k[j] + w[g];


Die Werte:

Delphi-Quelltext
1:
2:
3:
4:
A    = 1732584193
f    = 2562383102
k[j] = 3614090360
w[g] = 6422583


Beim Addieren von "k[j]" (Zeile 3) kommt es zum Überlauf und zur Fehlermeldung. Die gleiche Routine liefert bei Delphi4 und Berlin keinen Fehler. Irgendwo habe ich anscheinend eine Einstellung geändert, aber ich finde sie nicht wieder. Hat jemnd einen Tipp wo ich suchen muß?

Grüße von der bedeckten Nordsee

Peter


Sinspin - Sa 10.11.18 16:05

Hallo,

ich hätte jetzt spontan auf die Überlaufprüfung wie bei Delphi getippt. Aber zumindest bei mir ist das in Lazarus auch aus.
Allerdings wäre der genaue Wortlaut der Meldung mal interessant. Also ob es ein Integer Überlauf ist oder ein Stack Überlauf.


Gammatester - Sa 10.11.18 16:23

Du hast Overflow-Checks eingeschaltet. Global für Dein Projekt kannst Du das ändern in den Projektoptionen / Debugging / Checks and assertion.

Allerings ist es sinnvoll, diese bei der Entwicklung einzuschalten. Wenn Du es unbedingt brauchst, kannst Du es auch lokal ausschalten.


Delphi-Quelltext
1:
2:
{$OVERFLOWCHECKS OFF} 
x := a + f + k[j] + w[g];

Allerdings ist das Ergebnis dann eigentlich a + f + k[j] + w[g] modulo 2^32, d.h. heißt es ist falsch für Integer-Rechnung, es gibt das wieder was mit 32-Bit-Registern gerechnet wird:
1732584193 + 2562383102 + 3614090360 = 7909057655

Dein Programm rechnet
1732584193 + 2562383102 + 3614090360 = 3614090359


Peter18 - Sa 10.11.18 17:15

Hallo Stefan, hallo Gammatester,

Dank euch für die Antworten und die Brille. Der Knick in der Optik ist weg.

Ich habe mehrmals an der Stelle nachgesehen und es nicht gesehen. Die Fehlermeldung enthält außer dem, was ich geschrieben habe nur noch den Pfad und die Zeilennummer.

Gammatester hat recht, Überprüfen/Ändern liefert 3614090359 aber das Programm liefert eine Exception. Mit"{$OVERFLOWCHECKS OFF}" und on läuft das ganze. Und offensichtlich war es vom Autor auch so gedacht, denn damit wird ein Password für die Fritzbox verschlüsselt. Es funktioniert.

Grüße von der Nordsee

Peter