Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: TStream.ReadBuffer schlägt fehl

  Alt 7. Apr 2022, 23:28
Mal geguckt, was Read für'n Rückgabetyp hat und welchen Typ der Count Parameter hat?
Ja, Count hat NativeInt und der Rückgabewert von Read ist LongInt.
Hoecker, sie sind raus. (siehe Screenshot im Anhang)

Das ist leider eine der vielen Stellen, die unter 64bit ein bissle defekt sind. Der Count Parameter von ReadBuffer is zwar NativeInt, aber net der von Read. Somit passiert hier nen impliziter Cast mit potenziellem Datenverlust. Und wenn alles ziemlich in die Hose geht, übergibt man da nen Integer, bei dem das höchste bit 1 ist (weils nunmal die unteren 32bit des 64bit NativeInts sind) was einen negativen Integer ergibt.

Aber weil ja alles abwärtskompatibel sein muss, kann man diese Bugs in den Signaturen nicht so einfach fixen.

TFile.DoReadAllBytes ist übrigens auch schon defekt, denn LFileStream.Size ist Int64, aber auf 32bit kann man nur einen Integer an SetLength übergeben. Da die RTL aber ohne Range und Overflow checks gebaut wird, passiert hier potenziell dasselbe wie oben erklärt, wenn ich unter 32bit ne Datei lesen möchte die größer als 2^31-1 Bytes ist, dann landet hier Grütze im SetLength und es kommen irgendwelche Fehler aber sicher kein "Hey die Datei is zu groß"

Wenn Embarcadero beim Kompilieren ihres Sourcecodes W1071-W1073 anschalten würde, dann würds aufleuchten wie nen Weihnachtsbaum.
Miniaturansicht angehängter Grafiken
readbuffer.png  
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 7. Apr 2022 um 23:40 Uhr)
  Mit Zitat antworten Zitat