AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Crash bei TBytes Typecast

Ein Thema von TurboMagic · begonnen am 21. Apr 2025 · letzter Beitrag vom 21. Apr 2025
Antwort Antwort
TurboMagic

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

Crash bei TBytes Typecast

  Alt Gestern, 18:41
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?
Grüße
TurboMagic

Geändert von TurboMagic (Gestern um 18:42 Uhr) Grund: Delphi Tag hinzugefügt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Crash bei TBytes Typecast

  Alt Gestern, 19:51
Natürlich muß das knallen

Lösung: SetLength und danach Delphi-Referenz durchsuchenMove vom Parameter in diese Variable.


TBytes ist ein dynamisches Array, welches wie String/AnsiString
eine Kontrollstreuktur mit Referenzzählung und Längenangabe enthält,
was bei einem statischen Array fehlt.

Andersrum geht es aber, also TByte in einen Pointer auf ein statisches Array zu casten,
genauso wie String zu PChar.


Ja, PChar zu String "geht", aber das ist kein Cast, sondern CompilerMagic,
da hierfür in eine entsprechende Funktion der System.pas umgeleitet wird.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (Gestern um 19:53 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

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

AW: Crash bei TBytes Typecast

  Alt Gestern, 20:18
Hallo,

danke für die Infos!
Damit kann ich es sicher vorübergehend fixen.
Eigentlich will man aber vermutlich das Umkopieren der Daten vermeiden,
damit wäre es wohl stärker umzubauen, was vorher analysiert werden muss.
Aber natürlich ist es wichtig den Crash schnellstmöglich zu beseitigen,
selbst wenn das die Performance vorübergehend verschlechtert.
Grüße
TurboMagic
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.951 Beiträge
 
Delphi 12 Athens
 
#4

AW: Crash bei TBytes Typecast

  Alt Gestern, 21:12
Ich kenne den restlichen Quelltext nicht, aber für mein Empfinden wäre es, wenn die Zielgröße feststeht (wie hier), die sauberste Variante, wenn der Aufrufer nur korrekt dimensionierte Arrays übergeben darf.

Dann werden dahinter nur Pointer übergeben, was auch performancemäßig sauber ist. Wenn dann noch FGCM.EncodeGCM einfach PUInt8Array bekäme...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:03 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