delphi 为什么编译器警告函数'frog'的返回值可能未定义?

zmeyuzjn  于 2023-04-29  发布在  其他
关注(0)|答案(2)|浏览(142)

此单元生成一个警告,说明frog的值可能未定义,即使result是显式设置的:

unit homePage;

  interface

  function frog(const ts, fs: string; ci: integer; const ss: string; sb, sk, sr, ay, h: integer): string;

  implementation

  function frog(const ts, fs: string; ci: integer; const ss: string; sb, sk, sr, ay, h: integer): string;
  var
    s1, s2, s3, s4, s4a, s5, s6, s7, s8: string;
    m, i, j, n, sc, a, q, si, c, p, ct, f, pg, t: integer;
  begin
  m := 0; i := 0; j := 0; n := 0; sc := 0; a := 0; q := 0; si := 0; c := 0; p := 0; ct := 0; f := 0; pg := 0; t := 0;
  s1 := ''; s2 := ''; s3 := ''; s4 := ''; s4a := ''; s5 := ''; s6 := ''; s7 := ''; s8 := '';
  result := 'x';
  end;

  end.

编译器( Delphi 6 build 6.240与更新包2)正确地警告分配给整数的值永远不会被使用。原始代码(具有更多描述性的变量名)实际上设置或计算所有变量,因此原始代码生成的唯一警告是关于函数的返回值;上述代码已被最小化,但仍会生成神秘警告。与整数不同,编译器不会警告字符串变量永远不会被使用。
对上述代码的任何更改(删除或使用任何变量)都会使返回值警告消失。原始代码就没有这样的运气了,它总是而且只会生成返回值可能未定义的警告。
这是编译器中的bug吗?

g0czyy6m

g0czyy6m1#

这是编译器中的bug吗?
是的。这里真的没什么好说的了。看起来所有这些额外的局部变量都足以使编译器产生混乱,以至于它会发出这个虚假的警告。

2q5ifsrm

2q5ifsrm2#

Delphi 编译器警告W1035函数的返回值可能未定义的最常见原因是函数结果仅在以下条件语句中赋值:
仅在if语句内赋值的结果

function MyFunction(AInput: Integer): String;
begin
  if AInput = 5 then
  begin
    Result := 'Some output';
  end;
end;

仅在case语句中分配结果

function MyFunction(AInput: Integer): String;
begin
  case AInput of
    1: Result := 'Some output';
    2: Result := 'Some other output';
  end;
end;

此外,由于循环在某种程度上是条件语句,在这种情况下,您将多次重复相同的代码块,直到满足某些条件,因此您会收到相同的W1035编译器警告。
结果仅在for循环内赋值

function MyFunction(AInput: Integer): String;
var I: Integer;
begin
  for I = 0 to 10 do
  begin
    Result := 'Some output';
  end;
end;

仅在重复循环中分配结果

function MyFunction(AInput: Integer): String;
var I: Integer;
begin
  repeat
    Inc(I,1);
    Result := 'Some output';
  until I = 10;
end;

结果仅在while循环中分配

function MyFunction(AInput: Integer): String;
var I: Integer;
begin
  while I < 10 do
  begin
    Result := 'Some output';
    Inc(I,1);
  end;
end;

所有这些示例都将引发W1035编译器警告。为什么?因为不能保证满足条件语句所需的条件来执行代码的特定部分。
PS:如果我没记错的话, Delphi 6有时也会生成W1035警告,如果结果只在try语句中赋值的话。
所以我建议你检查你的原始代码,看看结果是否只在一些条件语句中赋值,并在函数的开始添加一些默认的结果赋值。

相关问题