Delphi 编译器不警告此代码
Delphi compiler does not warn about this code
调试我的代码时,我注意到 Delphi 编译器 (Berlin 10.1) 不会对没有 return 值的函数发出警告。这是正常的吗?
一个简单的例子:
function f(s:string):String;
begin
stringreplace(s,#32,'',[rfReplaceAll]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
showmessage(F('te st'));
end;
这一行
stringreplace(s,#32,'',[rfReplaceAll]);
应该是
result:= stringreplace(s,#32,'',[rfReplaceAll]);
没有警告!
我认为它应该警告 "return value might be undefined"。但事实并非如此。
最近几天我更改并重写了部分旧代码。恐怕我的申请中有这种错误。
这是一个编译器缺陷。托管类型 return 值作为 var 参数实现。因此,一旦编译器将函数转换为具有 return 值的额外 var 参数的过程,它就会看到它假定由调用者初始化的 var 参数。这就是问题的根本原因。不过,我并不是在为它找借口,这是一个明显的缺陷,而且是一个糟糕的缺陷。我只是提供一些关于如何发生这种情况的背景知识。
对此您无能为力。也许您能做的最好的事情就是确保您的代码具有强大的单元测试覆盖率。还可以部署 FixInsight 等静态分析工具来帮助根除代码中的此类错误。
调试我的代码时,我注意到 Delphi 编译器 (Berlin 10.1) 不会对没有 return 值的函数发出警告。这是正常的吗?
一个简单的例子:
function f(s:string):String;
begin
stringreplace(s,#32,'',[rfReplaceAll]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
showmessage(F('te st'));
end;
这一行
stringreplace(s,#32,'',[rfReplaceAll]);
应该是
result:= stringreplace(s,#32,'',[rfReplaceAll]);
没有警告!
我认为它应该警告 "return value might be undefined"。但事实并非如此。 最近几天我更改并重写了部分旧代码。恐怕我的申请中有这种错误。
这是一个编译器缺陷。托管类型 return 值作为 var 参数实现。因此,一旦编译器将函数转换为具有 return 值的额外 var 参数的过程,它就会看到它假定由调用者初始化的 var 参数。这就是问题的根本原因。不过,我并不是在为它找借口,这是一个明显的缺陷,而且是一个糟糕的缺陷。我只是提供一些关于如何发生这种情况的背景知识。
对此您无能为力。也许您能做的最好的事情就是确保您的代码具有强大的单元测试覆盖率。还可以部署 FixInsight 等静态分析工具来帮助根除代码中的此类错误。