AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)
Thema durchsuchen
Ansicht
Themen-Optionen

MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)

Ein Thema von s.h.a.r.k · begonnen am 23. Jan 2008 · letzter Beitrag vom 26. Jan 2008
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#11

Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)

  Alt 26. Jan 2008, 09:07
Zitat:
llerdings die entsprechenden Proceduren mit {$Q-}...{$Q+] klammern und immer den Standardwert wieder herstellen.
Nein so geht es nicht korrekt. Wenn dann so:

Delphi-Quellcode:
{$ifopt R+}
{ $define RangeCheckOn}
{$endif}

{$R-}
procedure OhneRangeCheck;
begin
end;
{$ifdef RangCheckOn $R+ $endif}
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.

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
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#12

Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)

  Alt 26. Jan 2008, 11:10
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:

// 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}
Bei Verwendung dieser Include-Dateien sieht Hagens Beispiel so aus:

Delphi-Quellcode:
{$I R-}
procedure OhneRangeCheck;
begin
end;
{$I R=}
Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#13

Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)

  Alt 26. Jan 2008, 11:21
Normalerweise müsste es auch so gehen

Delphi-Quellcode:
procedure OhneRangeCheck(params);
{$R-}
begin
end;
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.

PS: eine Include sollte die Extension .inc haben und nicht .pas

Gruß Hagen
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#14

Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)

  Alt 26. Jan 2008, 11:55
Hallo Hagen,

Zitat von negaH:
[...]weil diese Switches dann nur lokale Gültigkeit haben sollten (per Definition).
Das sehe ich anders:

Zitat von Delphi-Hilfe:
Lokale Direktiven betreffen nur den Teil der Compilierung, der sich von der Direktive bis zum nächsten Auftreten derselben Direktive erstreckt. Die Direktiven können an jeder beliebigen Position stehen.
Aus dieser Passage geht für mich eindeutig hervor, daß ein Bereich von zwei Compiler-Direktiven eingeschlossen wird.

Zitat:
eine Include sollte die Extension .inc haben und nicht .pas
Es mag gebräuchlich sein, zwingend vorgeschrieben ist es nicht:

Zitat von Delphi-Hilfe:
Die Parameter-Direktive $I weist den Compiler an, die angegebene Datei in die Compilierung aufzunehmen. Diese Datei wird direkt nach der Direktive {$I Dateiname} in den Text eingefügt. Die vorgegebene Namenserweiterung für die Datei ist .pas.
Eine abweichende Namenserweiterung muß angegeben werden, die Erweiterung ".pas" kann entfallen. Der "Ersatz-Schalter" sieht damit fast aus wie sein Vorbild.

Gruß Hawkeye
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#15

Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)

  Alt 26. Jan 2008, 18:27
Zitat von negaH:
Zitat:
llerdings die entsprechenden Proceduren mit {$Q-}...{$Q+] klammern und immer den Standardwert wieder herstellen.
Nein so geht es nicht korrekt. Wenn dann so:

Delphi-Quellcode:
{$ifopt R+}
{ $define RangeCheckOn}
{$endif}

{$R-}
procedure OhneRangeCheck;
begin
end;
{$ifdef RangCheckOn $R+ $endif}
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.

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
Nun, so geht's nun ganz bestimmt nicht:
1. Wir reden hier von Overflowcheck, also $Q+ oder $Q-
2. Dein {$ifdef RangCheckOn $R+ $endif} ist nicht sehr sinnvoll. Richtig wäre
{$ifdef RangCheckOn} {$R+} {$endif} Also richtig

Delphi-Quellcode:
{$ifopt Q+}
  {$define TurnonQ}
  {$Q-}
{$else}
  {$undef  TurnonQ}
{$endif}

procedure OhneOverflowCheck;
begin
end;

{$ifdef TurnonQ}
  {$Q+}
{$endif}
Gruß Gammatester
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: MD5-Hash wirft Integer-Überlauf Exception (EIntOverflow)

  Alt 26. Jan 2008, 23:34
hatte es mal aus Interesse einfach getestet und...
Delphi-Quellcode:
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.
tja, mit Lokal ala
Delphi-Quellcode:
procedure OhneRangeCheck(params);
{$R-}
begin
ist wohl nix

Code:
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)
1: hier hat wohl noch die P3 'ne Nachwirkung
2: hmmm ... irgendwie sollte hier doch auch ON stehn
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 04:46 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