我说这个的原因是最近的。多年来一直在我们项目中的旧库代码,最近开始生成范围检查。在过去,这段代码构建并运行没有问题。
这是一个示例场景,就像今天发生的一样。
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;
当i
为>len
时,会进行范围检查。我通过将长度检查移动到开头来修复它。但是,我觉得奇怪的是,它根据它正在评估事物的顺序起作用,它最终会尝试评估超出字符串范围的索引。
欢迎任何想法和建议。
答案 0 :(得分:2)
该代码总是被破坏,如果它曾经有效,那么这纯粹是偶然的。没有编译器开关会在编译时发现这样的缺陷。
在所有版本的Delphi中,启用范围检查时,如果访问超出字符串末尾,将生成运行时错误。如果你的代码在没有运行时错误的情况下运行,那么只有两个解释: