我这么说的原因是最近。旧库代码已经在我们的项目中存在多年,最近开始生成范围检查。过去,此代码构建和运行没有问题。
下面是一个类似于今天发生的示例场景。
function DoStringStuff(const S: string): string;
var
i: Integer;
len: Integer;
begin
...
while (Result[i] <> #32)
and (i <= len) do
begin
Result[i] := UpperCase(Result[i])[1];
inc(i);
end;
...
end;
>len
i
时,将进行范围检查。我通过将长度检查移动到开头来修复它。 但是,我觉得很奇怪,考虑到它评估事物的顺序,它根本有效,它最终会尝试评估超出字符串范围的索引。
欢迎任何想法和建议。
该代码总是被破坏,如果它曾经起作用,那纯粹是偶然的。没有编译器开关会在编译时发现这样的缺陷。
在所有版本的 Delphi 中,启用范围检查后,当您访问超出字符串末尾时,将生成运行时错误。如果您的代码之前运行时没有运行时错误,那么只有两种解释:
- 范围检查以前已禁用。
- 循环先前在超出范围条件之前中断。