![]() |
MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Morgen erst mal,
ich sitze zurzeit an einem sehr komischen Problem: Und zwar handelt es sich darum, dass ich über die Unit, welche ich in den Anhang gesteckt habe, einen MD5-Hash ausgeben lassen will. Bisher, d.h. so circa 2 Monate lang ging es auch ohne Problem, nur seit gestern macht die Unit zicken und wirft mit jedes Mal, wenn ich die Anwendung ausführe eine EIntOverflow-Exception. Ich weiß nicht mehr weiter... Vor allem, weil es bisher wunderbar funktioniert hat. In Zeile 111 erscheint dann der folgende Fehler: Zitat:
Delphi-Quellcode:
Noch ein paar Informationen:
{Z:109} procedure FF(var a: DWORD; b, c, d, x: DWORD; s: BYTE; ac: DWORD);
{Z:110} begin {Z:111} inc(a, F(b, c, d) + x + ac); // <<< hier tritt der Fehler auf... {Z:112} rot(a, s); {Z:113} inc(a, b); {Z:114} end; // Die Werte: // a = 1732584193 // b = 4023233417 // c = 2562383102 // d = 271733878 // x = 128 // s = 7 // ac = 3614090360 - wir sind eine Gruppe von Programmieren, d.h. ich kann nicht genau sagen wer, was, wann, wie geändert hat! - das Projekt umfasst doch mehrere tausend Zeilen - wir arbeiten mit der BDS 2006 (ohne Updates, soweit ich weiß) - ich habe die Unit aus dem Internet geladen und daran nicht geändert! - Ich habe auch schon andere Units getestet, mit dem selben Fehler! Ich hoffe Ihr könnt mir hierbei weiterhelfen. Ich bin echt am verzweifeln :wall: Mit freundlichen Grüßen der Hai [edit] Schreibfehler gefunden und für schlecht empfunden ;) [/edit] |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Hey,
ich könnt echt die Wand hochlaufen... Hab den Fehler selbst gefunden :wall: schon toll, dass jemand an den Projekteinstellungen rumgedreht hat. Man kann dort unter den Compiler-Einstellungen (nicht Compiler-Meldungen) die Laufzeitfehler einstellen. Dort war ein Haken bei der Überlaufprüfung gesetzt, welcher dort nicht stehen sollte. >>> Haken rausgenommen, keinerlei Fehler mehr, Programmierer glücklich ;) Mit freundlichen Grüßen der Hai |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Zitat:
Zitat:
Ansonsten wenn der Überlauf gewollt ist, dann sollte man die Überlaufprüfung nur für den Bereich abschalten und für das Projekt als solches aber einschalten. Gleiches gilt für die Bereichsprüfung! |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Man sollte dann eher {$R-} verwenden. Es kann ja sein, dass jemand anderes den globalen Schalter gesetzt hat, weil er will dass in den von ihm programmierten Modulen Exceptions auftreten und entsprechen abgefangen werden. In den von ihm erstellten Sourcen sollte dann explizit {R+} eingefügt werden.
|
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Zitat:
Der Sinn und Zweck dieser Compilerschalter ist doch Codestellen zu finden, welche nicht ordentlich funktionieren bzw. sich ungewollt verhalten. Wenn du explizit Codebereiche fest markierst, welche überprüft werden sollen, dann blendest du haufenweise anderen Code aus, welcher genau solche Problemfälle beinhaltet. Wenn ich schon weiß wo der Fehler liegt, ist das ok, aber die Optionen sollen doch helfen Code zu finden, wo man keinen Fehler vermutet, dieser aber trotzdem welche enthält. $R ist die Bereichsprüfung und nicht die Überlaufprüfung! |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Zitat:
Zitat:
|
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Du könntest auch folgendes mal probieren...
Delphi-Quellcode:
Damit lässt sich meine MD5 zumindest compilen,auch mit den genannten Prüfroutinen..
procedure FF(var a: DWORD; b, c, d, x: DWORD; s: BYTE; ac: DWORD);
begin a:=a+F(b, c, d) + x + ac; rot(a, s); a:=a+b; end; |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Compilieren lies es sich immer! Nur während der Laufzeit hab ich dann die Exception bekommen. Hätte ich wohl noch dazu erwähnen können :oops:
|
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Bei MD5 (und den meisten anderen Hashalgorithmen) MUSS {$Q-} gesetzt sein, weil dort Integerarithmetik mod 2^32 benutzt wird, und mit 32Bit-Arithmetik Überlaufe praktisch immer vorkommen. Die Alternative wäre 64-Bit-Arithmetik und nach jeder Operatiion ein and $FFFFFFFF dazu programmieren.
Damit ist aber die Performance ziemlich runter und übersichtlicher ist es auch nicht. Man muss halt wissen was man macht, und hier ist {$Q-} definitiv angebracht. Man kann allerdings die entsprechenden Proceduren mit {$Q-}...{$Q+] klammern und immer den Standardwert wieder herstellen. Gruß Gammatester |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Zitat:
alternativ könnte ich noch negaH's DEC empfehlen, dort wird per ASM gearbeitet und die Fehlerprüfung somit umgangen. eine Implementation ist ebenfalls in ASM, also auch keine Probleme und zu guter Letzt könnte man sich auch direkt an Windows wenden, dessen Implementation (seit Win2000 immer dabei) hat auch nicht soclhe Problemchen, |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 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