9

我们有一个大型的 Delphi XE 代码库,我们想要移植到 64 位。

我拥有 Delphi XE2 许可证,我找不到任何警告或提示可以帮助我检测有效的 32 位结构,这些结构现在可能导致 64 位平台下的数据丢失。例如,在 32 位编译器中完全有效的THandleCardinal分配在为 Win64 编译时不会引发任何警告。

在使用 Delphi 2009 迁移到 Unicode 时,我们收到了大量警告,这些警告对我们跟踪和修复可疑代码很有帮助。使用 XE2,我找不到任何东西。我无法想象编译器级别没有集成任何东西来避免我们对所有代码进行手动审查。

我错过了什么吗?如果您尝试过,您是如何将项目移植到 64 位的?

谢谢 !

4

3 回答 3

2

你没有错过任何东西。产品中没有任何东西可以帮助您。

我也觉得这有点令人失望,但我完全希望 Emba 设计师考虑到这一点。我只能得出结论,他们的经验是添加此类警告导致的噪音多于信号。Delphi 编译器在分配给不兼容的整数类型时从未发出警告。例如,将整数分配给字节从来都不是警告或错误。

是时候启动 grep 并搜索Integer\(.*\), Longint\(.*\), Cardinal\(.*\),Longword\(.*\)等了THandle


为了回应 Arnaud 的评论和回答,我提供了以下代码,该代码在针对 64 位时编译时不会出现警告和错误。

procedure NaughtyCode;
var
  Handle: THandle;
  int: Integer;
  card: Cardinal;
  P: Pointer;
begin
  Handle := high(Handle);
  int := Handle;
  card := Handle;
  P := Pointer(Handle);
  int := Integer(P);
  card := Cardinal(P);
end;
于 2011-11-04T22:02:11.030 回答
0

大约 5 年前,我将它们移植到 64 位 Free Pascal。(即使只有带有简单单元测试的部件来检测它们)

使用两种编译器进行测试只会发现更多问题。

于 2011-11-04T19:27:31.460 回答
0

正如您所说,大多数潜在问题来自:

  • WinAPI 更改(但大部分时间相同/兼容);
  • THandle不再映射到integer,而是映射到NativeUInt(即cardinal只有Win32下的a);
  • 在指针算术中,Integer类型转换未映射到NativeInt.

最新的将引发编译器错误,不仅是警告(它是显式类型不匹配),而且THandle更改应该被警告为 .

关于主编译器,我不会对 Embarcadero 这么难——我更关心后台编译器(例如 CodeInsight)与主编译器不同步。对我来说,主编译器工作正常,我从不抱怨缺少警告。只是明确地搜索THandle并不是那么困难。

于 2011-11-05T10:47:19.237 回答