gpt4 book ai didi

德尔福64位: finding incorrect casts?

转载 作者:行者123 更新时间:2023-12-03 14:36:19 27 4
gpt4 key购买 nike

我正在致力于将大型 Delphi 代码库调整为 64 位。在许多情况下,有些行将指针转换为 32 位值或从 32 位值转换为类似于以下内容的行:

var
p1,p2 : pointer;
begin
inc(Integer(p1),10);
p2 := Pointer(Integer(p1) + 42);

在我可以找到这些转换的地方,我已将它们替换为 NativeInt 转换,以使它们在 64 位模式下正确。

但是我不确定我是否已全部找到它们。有时,转换更加微妙,因此仅通过文本搜索字符串“integer(”也是不够的。

由于如果指针值高于整数类型的范围,“integer(”转换将在 64 位中失败,所以我有一个想法:如果我可以强制内存管理器分配高于 4GB 的内存会怎样(因此指针值使用超过 32 位)?然后我会得到运行时错误,并且可以更容易地找到错误的转换。这可能吗?或者有人可以推荐一些其他技术吗?

最佳答案

除了您正在使用的文本搜索之外,没有什么神奇的技巧可以找到这些类型转换。如果编译器警告这种强制转换,那就太好了。我觉得非常令人失望的是它没有。

当你确实发现这样的问题时,不要更改为NativeInt。将指针更改为类型指针,并使用指针算术。

var
p1, p2: PByte;
....
inc(p1, 10);
p2 := p2;
inc(p2, 42);

那么您的代码将永远安全。

仍有一些情况需要转换为整数。例如,将地址传递给 SendMessage 时。但根据需要将它们转换为 WPARAMLPARAM

您强制运行时错误的想法是合理的,值得庆幸的是,这不是原创的!您应该使用 FastMM 的完整版本并定义 AlwaysAllocateTopDown。这会强制 FastMM 对 VirtualAlloc 的调用传递 MEM_TOP_DOWN 标志。这会将大部分错误的转换清除为运行时指针截断错误。

但是,这只会强制自上而下分配内存管理器分配的内存。进程中的其他模块将使用自下而上的默认策略。您可以设置计算机范围的设置来更改该默认策略。将 HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference 设置为 REG_DWORD,值为 0x100000 并重新启动。

请注意,这可能会导致您的计算机出现稳定性问题。许多应用程序无法应对这一点。特别是很少有防病毒产品可以应对这种设置。我发现 MSE 适合机器范围内自上而下的分配。更重要的是,64 位调试器不能在自上而下的分配下运行!所以你必须在没有调试器的情况下进行这种测试。我的QC report仍然开放,这个问题还没有得到解决,即使在 XE3 中也是如此。

关于德尔福64位: finding incorrect casts?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14231013/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com