Jump to content
Alexander Sviridenkov

Warning: serious bug in XE10.4.2/DCC64

Recommended Posts

Just found serious bug in 10.4.2 when compiling to Win64 target: int64 value returned by function is truncated to 32 bit.

In XE11 the same code works OK. F.e. this will lead to errors when working with files/streams larger that 2 Gb.

  • Confused 1

Share this post


Link to post

This code seems to work on a fully patched 10.4.2:

procedure TForm2.FormCreate(Sender: TObject);
Var
 x: Int64;
begin
 x := Int64.MaxValue;

 If x <> Test Then Raise Exception.Create('Fail');
end;

function TForm2.Test: Int64;
begin
  Result := Int64.MaxValue;
end;

Checked with TFileStream too:

procedure TForm2.FormCreate(Sender: TObject);
Var
 fs: TFileStream;
 tb, r: TBytes;
 a: Int64;
 b: Integer;
begin
 SetLength(tb, 1024 * 1024); // 1 MByte
 For a := Low(tb) To High(tb) Do
  tb[a] := a Mod 255;

 fs := TFileStream.Create('C:\Users\xxx\test.tmp', fmCreate);
 Try
  For a := 0 To 4 * 1024 Do
   fs.Write(tb, Length(tb));
 finally
  fs.Free;
 End;

 SetLength(r, Length(tb));
 fs := TFileStream.Create('C:\Users\xxx\test.tmp', fmOpenRead);
 Try
  Repeat
   b := fs.Read(r, Length(r));
   If b > 0 Then If (b <> Length(tb)) Or Not CompareMem(@r[0], @tb[0], Length(tb)) Then Raise Exception.Create('Read error, read ' + b.ToString + ' bytes');
  Until b = 0;
 finally
  fs.Free;
 End;
end;

Runs and works properly.

 

Am I missing something?

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×