Delphi代码在64位访问冲突时失败

use*_*784 9 delphi

这个Delphi代码在编译为32位时有效,但在编译为64位时会产生访问冲突.代码有问题,还是有编译器错误?

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
  MaxSize = 2; // nothing special about this value, could equally be 1

type
  TArraySize = 1..MaxSize;

procedure Main;
var
  size: TArraySize;
  arr: array [-MaxSize..MaxSize] of Integer;
begin
  FillChar(arr, SizeOf(arr), 0); // zero initialize
  size := MaxSize;
  Writeln(arr[-size]);
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 12

这是编译器错误.编译器无法处理

arr[-size]
Run Code Online (Sandbox Code Playgroud)

正确的,大概是因为size是一个子范围类型.

您可以通过强制编译器在Integer上下文中执行算法来解决该错误.

arr[-Integer(size)]
Run Code Online (Sandbox Code Playgroud)

您应该向Embarcadero的质量门户提交错误报告.

更新

我在XE7中测试了这个.根据评论,该缺陷似乎至少在西雅图得到修复.

  • FWIW,错误似乎是64位代码将RAX设置为2,然后否定*EAX*,这使得RAX $ 00000000FFFFFFFE,而不是$ FFFFFFFFFFFFFFFE.然后它访问[RBP + 4*RAX + $ 2C].RAX不是-2,因此非常错误.后来的版本插入一个MOVSXD RAX,EAX,该符号将EAX扩展为RAX,因此它变为-2. (2认同)