Einzelnen Beitrag anzeigen

TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#1

Wert eines Defines merken und wiederherstellen

  Alt 17. Dez 2023, 18:27
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
  Mit Zitat antworten Zitat