Ist es nicht gefährlich, in Stream.read die Langezahl mit der Int64-Größe zu verwenden?

9

Ich habe die Klasse TMemoryStream untersucht und die folgende Routine gefunden :

%Vor%

Ich habe dieses Muster sehr oft gesehen, wo Int64 einem Longint zugewiesen wurde.

Mein Verständnis ist, dass Longint vier Bytes und Int64 ist acht Bytes in 32-Bit- und 64-Bit-Windows, also wenn meine Dateigröße FFFF FFFF == 8589934591 == 8 GB ist dann wird diese Routine einfach nicht lesen, weil die endgültige Zählung $ FFFF FFFF == -1 ist.

Ich verstehe nicht, wie das erlaubt ist und vielleicht nicht berücksichtigt wird (vielleicht versuchen nicht viele Leute, eine Datei mit mehr als 8 GB zu lesen).

    
Nasreddine Abdelillah Galfout 31.12.2017, 01:27
quelle

1 Antwort

1

Ich habe ein Ticket dafür eingeloggt und es wurde anscheinend in Tokio 10.2 behoben. Dies ist ein Problem für die 64-Bit-Kompilierung.

Ссылка

Es gibt Probleme mit großen (& gt; 2 GB) Dateien in TCustomMemoryStream und TMemoryStream . In TMemoryStream sind die Probleme einfach, da die lokalen Variablen als NativeInt anstelle von LongInt deklariert werden müssen und die Kapazität in NativeInt geändert werden muss. In TCustomMemoryStream sind sie subtiler, weil beide Methoden TCustomMemoryStream.Read das Ergebnis einer Int64 - Int64 Berechnung direkt einer LongInt zuweisen. Dies wird selbst dann überlaufen, wenn das Ergebnis dieser Berechnung nicht größer als% LongInt ist.

Wenn Sie dies in Seattle beheben möchten, müssen Sie entweder einen Code-Hook durchführen, die Unit System.Classes ersetzen oder Ihre eigene Ersatzklasse für TMemoryStream einrichten. Beachten Sie, dass Sie für die letzte Option auch TBytesStream und TStringStream ersetzen müssen, da diese von TMemoryStream abstammen.

Das andere Problem mit der letzten Option ist, dass Komponenten von Drittanbietern keine "Fixes" haben. Für uns hatten wir nur ein paar Stellen, an denen wir mit Dateien arbeiten mussten, die größer als 2 GB waren, also haben wir diese umgekehrt.

Die Korrekturen für TCustomMemoryStream.Read (müssen für beide Methoden gelten) sehen etwa so aus:

%Vor%     
Graymatter 09.01.2018, 02:22
quelle

Tags und Links