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



我这么说的原因是最近。旧库代码已经在我们的项目中存在多年,最近开始生成范围检查。过去,此代码构建和运行没有问题。

下面是一个类似于今天发生的示例场景。

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 中,启用范围检查后,当您访问超出字符串末尾时,将生成运行时错误。如果您的代码之前运行时没有运行时错误,那么只有两种解释:

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

相关内容

最新更新