将Delphi代码移植到64位 - 为什么没有编译器警告?

时间:2011-11-04 19:25:19

标签: windows delphi 64-bit delphi-xe2 win64

我们有一个大型的Delphi XE代码库,我们希望将其移植到64位。

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

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

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

谢谢!

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

Embarcadero关于主编译器我不会那么难 - 我更关心后台编译器(例如CodeInsight)是not synchronized with the main compiler。对我来说,主编译器工作正常,我从不抱怨错过警告。只是明确搜索THandle并不是那么困难。

相关问题