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.