调试我的代码,我注意到Delphi编译器(柏林10.1)没有警告没有返回值的函数。这是正常的吗?
一个简单的例子:
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]);
没有警告!
我认为它应警告"返回值可能未定义"。但事实并非如此。 我在最后几天更改并重写了旧代码的一部分。我恐怕在申请中有这种错误。
答案 0 :(得分:9)
这是一个编译器缺陷。托管类型返回值实现为var参数。因此,一旦编译器将函数转换为具有返回值的额外var参数的过程,它就会看到它假定的var参数由调用者初始化。这是问题的根本原因。我并不是在禁止它,它是一个明显的缺陷,也是一个糟糕的缺陷。我只是给出了一些关于如何发生这种情况的背景知识。
你可以做很多事情。也许您可以做的最好的事情是确保您的代码具有强大的单元测试覆盖率。还可以部署像FixInsight这样的静态分析工具,以帮助根除代码中的此类错误。