我们有一个大型的Delphi XE代码库,我们希望将其移植到64位。
我拥有Delphi XE2许可证,我找不到任何警告或提示,可以帮助我检测有效的32位结构,这些结构现在可能导致64位平台下的数据丢失。例如,对于32位编译器完全有效的 THandle 到 Cardinal 分配在编译Win64时不会引发任何警告。
使用Delphi 2009迁移到Unicode时,我们收到大量警告,帮助我们跟踪和修复可疑代码。有了XE2,我找不到任何东西。我无法想象在编译器级别上没有任何集成,以避免我们对所有代码进行人工审核。
我错过了什么吗?如果你尝试过,你是如何将项目移植到64位的?
谢谢!
答案 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)
正如您所说,大多数潜在问题来自:
THandle
不再映射到integer
,而是映射到NativeUInt
(即仅在Win32下的cardinal
); Integer
类型转换未映射到NativeInt
。最新版本会引发编译器错误,不仅是警告(它是显式类型不匹配),而且THandle
更改应该被警告为。
Embarcadero关于主编译器我不会那么难 - 我更关心后台编译器(例如CodeInsight)是not synchronized with the main compiler。对我来说,主编译器工作正常,我从不抱怨错过警告。只是明确搜索THandle
并不是那么困难。