Hallo,
ein Nutzer der
DEC (Delphi Encryption Compendium) hat einen Bug gemeldet,
der zu einem Integer Overflow führen kann.
Details siehe hier:
https://github.com/MHumm/DelphiEncry...dium/issues/59
Mit dem dort skizzierten Testprogramm und einer > 600 MB Datei bekomme ich das in D12.0 nachvollzogen
und finde, dass es in TDECHash.Increment8 in DECHashBase.pas in der Unterprozedur AddC hier knallt:
Delphi-Quellcode:
procedure AddC(var Value: UInt32; const Add: UInt32; var Carry: Boolean);
begin
if Carry then
begin
Value := Value + 1;
Carry := (Value = 0); // we might cause another overflow by adding the carry bit
end
else
Carry := False;
Value := Value + Add;
Carry := Carry or (Value < Add); // set Carry Flag on overflow or keep it if already set
end;
Ok, packe ich das Value := Value + Add; in {$Q-} {$Q+} ein knallt es nicht mehr und auch alle
bisher funktionierenden
unit Tests funktionieren weiter.
Nur: ich will ja nicht einfach $Q+ danach anmachen, egal ob es schon an war oder nicht.
Ich hab' mir jetzt das hier überlegt:
Delphi-Quellcode:
{$IFDEF Q+}
{$define USES_OVERFLOW_CHECKING}
{$ENDIF}
{$Q-}
Value := Value + Add;
{$IFDEF USES_OVERFLOW_CHECKING}
{$Q+}
{$undefine USES_OVERFLOW_CHECKING}
{$ENDIF}
Carry := Carry or (Value < Add); // set Carry Flag on overflow or keep it if already set
Spricht da was dagegen?
Grüße
TurboMagic