如何追踪双指针使用错误

Kro*_*ica 1 delphi pointers

最近我将大量的C++代码移植到Delphi(超过1mb的C代码).代码已满,带有指针.尽管项目编制和的99%的时间运作良好,我看到不时有些怪异的结果时,这使我觉得可能是用的指针操作错误 - 事实上,我已经发现一对夫妇.问题是,如果没有编译器的任何线索/提示,它们很难被追踪.

对于这种情况,也许你有一些提示:

var
  a: PSingle;

GetMem(a, SizeOf(Single));

a^ := 1.1;

// Call func declared as - someFunc(aIn: PSingle);

someFunc(@a); // <<-- Bug here. I mistakely added @ while porting. 
              // someFunc needs PSingle, but gets a PPSingle instead
Run Code Online (Sandbox Code Playgroud)

在示例中,@插入错误.程序不会崩溃,只处理错误的数据并继续运行.我需要一种方法来找到这样的情况,其中"指向值的指针"被传递而不是"指向值的指针".

你如何追踪像这样的指针错误?

Rob*_*edy 12

"typed @ operator"编译器选项旨在准确检测出那种错误.当它被禁用时,表达式@a具有类型Pointer,它与所有指针类型兼容.启用该选项,同一表达式具有^PSingle与预期不兼容的类型PSingle.

我建议在所有项目中启用该选项; 令我感到困惑的是Delphi并没有始终将该选项作为默认选项.

您可以使用$T+and $T-compiler指令修改代码中该选项的状态.


您可以做的另一件事是将代码转换为使用更多惯用的Delphi.例如,通过引用而不是指针值传递参数.更改参数的定义:

procedure someFunc(var arg: Single);
Run Code Online (Sandbox Code Playgroud)

使用该声明,传递@a将是编译器将找到并禁止的错误.你会转而通过a^,或者你甚至可以完全摆脱指针而只是声明a为平原Single而不是PSingle.

仅仅因为原始代码是用C和C风格的C++编写的,并不意味着你的Delphi代码必须看起来像它.