Einzelnen Beitrag anzeigen

Kas Ob.

Registriert seit: 3. Sep 2023
412 Beiträge
 
#5

AW: Crash bei TBytes Typecast

  Alt 22. Apr 2025, 10:40
Hallo,

ein Nutzer der DEC hat einen Crash gemeldet. Ich kann den mit dessen
Beispielprogramm nachstellen, ich verstehe aber noch nicht warum das passiert.

Es gibt diese Typdeklarationen:
Delphi-Quellcode:
  /// <summary>
  /// Replacement for PByteArray
  /// </summary>
  PUInt8Array = ^TInt8Array;
  TInt8Array = array[0..MaxInt-1] of Byte;
Der Crash passiert hier drin:

Delphi-Quellcode:
procedure TDECCipherModes.EncodeGCM(Source, Dest: PUInt8Array; Size: Integer);
var
  PlainText,
  CipherText : TBytes;
begin
  if (Size > 0) then
  begin
    PlainText := TBytes(@Source^);
    SetLength(PlainText, Size);
Crash> CipherText := TBytes(@Dest^);
    SetLength(CipherText, Size);
  end
  else
  begin
    SetLength(PlainText, 0);
    SetLength(CipherText, 0);
  end;

  FGCM.EncodeGCM(PlainText, CipherText, Size);
end;
Es gibt da eine Zugriffsverletzung.
Das SetLength(PlainText, Size) und SetLength(CipherText, Size) habe ich schon ergänzt.

EncodeGCM wird von dieser Methode aus aufgerufen:
Delphi-Quellcode:
procedure TDECCipherModes.Encode(const Source; var Dest; DataSize: Integer);
begin
  EncodeGCM(@Source, @Dest, DataSize);
end;
Debugge ich doert hin liefert Assigned(@Dest) unter Watches true

Das Testprogramm übergibt diese Variablen an Encode:

ciphText, refCipherText : Array[0..3] of LongWord;

1. Warum crasht der Typecast CipherText := TBytes(@Dest^);

2. Kann man das EncodeGCM evtl. irgendwie besser schreiben?
And that why i hate untyped parameter !

the problem as pointed by himitsu, to catch or solve all of such bugs you need to declare them as constants so the compiler will not access them for writing , try to change this
procedure TDECCipherModes.EncodeGCM(Source, Dest: PUInt8Array; Size: Integer); into
procedure TDECCipherModes.EncodeGCM(const Source, Dest: PUInt8Array; Size: Integer);
Kas

Geändert von Kas Ob. (22. Apr 2025 um 10:43 Uhr)
  Mit Zitat antworten Zitat