![]() |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Zitat:
Delphi-Quellcode:
Man muß also selektiv erstmal abfragen ob $R+ aktiviert wurde und nur dann $R+ auch wieder einschalten, ansonsten würde man ja $R+ einschalten obwohl es vorher in den globalen Compilerswitches nicht aktiviert war.
{$ifopt R+}
{ $define RangeCheckOn} {$endif} {$R-} procedure OhneRangeCheck; begin end; {$ifdef RangCheckOn $R+ $endif} Alternaiv kann man einen Switch lokal innerhalb der Procedure aktivieren, ich habe aber die Erfahrung gemacht das das je nach Compilerversion nicht richtig funktioniert bzw. Seiteneffekte provoziert. Gruß hagen |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Hallo,
in den Turbo-Pascal-Zeiten gab es für die Compilerschalter neben den Optionen "+" und "-" noch die Option "=", die den vorigen Zustand des Schalters wiederherstellte. Delphi bietet diese Möglichkeit leider nicht mehr, man kann sich aber relativ leicht behelfen, indem man für den betreffenden Schalter Include-Dateien im Bibliothekspfad bereitstellt und diese einbindet:
Delphi-Quellcode:
Bei Verwendung dieser Include-Dateien sieht Hagens Beispiel so aus:// Datei "R+.pas" {$ifopt R-} {$undef RangeCheckIsOn} {$R+} {$else} {$define RangeCheckIsOn} {$endif} // Datei "R-.pas" {$ifopt R+} {$define RangeCheckIsOn} {$R-} {$else} {$undef RangeCheckIsOn} {$endif} // Datei "R=.pas" {$ifdef RangeCheckIsOn} {$R+} {$else} {$R-} {$endif}
Delphi-Quellcode:
Gruß Hawkeye
{$I R-}
procedure OhneRangeCheck; begin end; {$I R=} |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Normalerweise müsste es auch so gehen
Delphi-Quellcode:
weil diese Switches dann nur lokale Gültigkeit haben sollten (per Definition). Leider hat das Nachteile da verschiedene Delphiversionen sich nicht daran halten oder zb. ausgehend von den übergebenen Parametern denoch ihren Rangcheck aktivieren. Zumal die Range/Overflowcheks mit jeder neueren Delphiversion immer unzuverlässiger werden, mal schlagen sie zu wenn es nicht richtig ist mal schlagen sie nicht zu wenn es richtig wäre.
procedure OhneRangeCheck(params);
{$R-} begin end; PS: eine Include sollte die Extension .inc haben und nicht .pas ;) Gruß Hagen |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Hallo Hagen,
Zitat:
Zitat:
Zitat:
Zitat:
Gruß Hawkeye |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Zitat:
1. Wir reden hier von Overflowcheck, also $Q+ oder $Q- 2. Dein {$ifdef RangCheckOn $R+ $endif} ist nicht sehr sinnvoll. Richtig wäre
Delphi-Quellcode:
Also richtig
{$ifdef RangCheckOn} {$R+} {$endif}
Delphi-Quellcode:
Gruß Gammatester
{$ifopt Q+}
{$define TurnonQ} {$Q-} {$else} {$undef TurnonQ} {$endif} procedure OhneOverflowCheck; begin end; {$ifdef TurnonQ} {$Q+} {$endif} |
Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
hatte es mal aus Interesse einfach getestet und...
Delphi-Quellcode:
tja, mit Lokal ala
Program Project1;
{$APPTYPE CONSOLE} Uses SysUtils; // wegen Compileroptimierung und Nutzungswarnung: // If i = 0 Then ; {$OVERFLOWCHECKS ON} Procedure P1; Var i: Integer; Begin i := MaxInt; If i = 0 Then ; Try Inc(i); If i = 0 Then ; WriteLn('P1 - OverflowChecks OFF (global ON)'); Except WriteLn('P1 - OverflowChecks ON (global ON)'); End; End; {$OVERFLOWCHECKS OFF} Procedure P2; Var i: Integer; Begin i := MaxInt; If i = 0 Then ; Try Inc(i); If i = 0 Then ; WriteLn('P2 - OverflowChecks OFF (global OFF)'); Except WriteLn('P2 - OverflowChecks ON (global OFF)'); End; End; Procedure P3; {$OVERFLOWCHECKS ON} Var i: Integer; Begin i := MaxInt; If i = 0 Then ; Try Inc(i); If i = 0 Then ; WriteLn('P3 - OverflowChecks OFF (global OFF, local ON)'); Except WriteLn('P3 - OverflowChecks ON (global OFF, local ON)'); End; End; Procedure P4; Var i: Integer; Begin i := MaxInt; If i = 0 Then ; Try Inc(i); If i = 0 Then ; WriteLn('P4 - OverflowChecks OFF (global OFF)'); Except WriteLn('P4 - OverflowChecks ON (global OFF)'); End; End; {$OVERFLOWCHECKS OFF} Procedure P5; Var i: Integer; Begin i := MaxInt; If i = 0 Then ; Try {$OVERFLOWCHECKS ON} Inc(i); If i = 0 Then ; {$OVERFLOWCHECKS OFF} WriteLn('P5 - OverflowChecks OFF (global OFF, local ON)'); Except WriteLn('P5 - OverflowChecks ON (global OFF, local ON)'); End; End; Procedure P6; Var i: Integer; Begin i := MaxInt; If i = 0 Then ; Try Inc(i); If i = 0 Then ; WriteLn('P6 - OverflowChecks OFF (global OFF)'); Except WriteLn('P6 - OverflowChecks ON (global OFF)'); End; End; Begin P1; P2; P3; P4; P5; P6; ReadLn; End.
Delphi-Quellcode:
ist wohl nix :angel:
procedure OhneRangeCheck(params);
{$R-} begin
Code:
1: hier hat wohl noch die P3 'ne Nachwirkung
P1 - OverflowChecks ON (global ON)
P2 - OverflowChecks OFF (global OFF) P3 - OverflowChecks ON (global OFF, local ON) [color=#ff0000]P4 - OverflowChecks ON (global OFF)[/color] [color=gray]<< 1[/color] P5 - OverflowChecks OFF (global OFF, local ON) [color=gray]<< 2[/color] P6 - OverflowChecks OFF (global OFF) 2: hmmm ... irgendwie sollte hier doch auch ON stehn :shock: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:49 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