此单元生成一个警告,说明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吗?
2条答案
按热度按时间g0czyy6m1#
这是编译器中的bug吗?
是的。这里真的没什么好说的了。看起来所有这些额外的局部变量都足以使编译器产生混乱,以至于它会发出这个虚假的警告。
2q5ifsrm2#
Delphi 编译器警告W1035函数的返回值可能未定义的最常见原因是函数结果仅在以下条件语句中赋值:
仅在if语句内赋值的结果
仅在case语句中分配结果
此外,由于循环在某种程度上是条件语句,在这种情况下,您将多次重复相同的代码块,直到满足某些条件,因此您会收到相同的W1035编译器警告。
结果仅在for循环内赋值
仅在重复循环中分配结果
结果仅在while循环中分配
所有这些示例都将引发W1035编译器警告。为什么?因为不能保证满足条件语句所需的条件来执行代码的特定部分。
PS:如果我没记错的话, Delphi 6有时也会生成W1035警告,如果结果只在try语句中赋值的话。
所以我建议你检查你的原始代码,看看结果是否只在一些条件语句中赋值,并在函数的开始添加一些默认的结果赋值。