是否有编译器设置来控制何时可能发生范围检查?

时间:2017-05-19 19:49:52

标签: delphi

我说这个的原因是最近的。多年来一直在我们项目中的旧库代码,最近开始生成范围检查。在过去,这段代码构建并运行没有问题。

这是一个示例场景,就像今天发生的一样。

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时,会进行范围检查。我通过将长度检查移动到开头来修复它。但是,我觉得奇怪的是,它根据它正在评估事物的顺序起作用,它最终会尝试评估超出字符串范围的索引。

欢迎任何想法和建议。

1 个答案:

答案 0 :(得分:2)

该代码总是被破坏,如果它曾经有效,那么这纯粹是偶然的。没有编译器开关会在编译时发现这样的缺陷。

在所有版本的Delphi中,启用范围检查时,如果访问超出字符串末尾,将生成运行时错误。如果你的代码在没有运行时错误的情况下运行,那么只有两个解释:

  1. 先前已禁用范围检查。
  2. 此循环先前在超出范围条件之前断开。