13

升级到 10.2 Tokyo 后,第三方组件之一开始引发大量异常。调试显示有问题的部分代码,可以用这个(希望是)最少的代码来表示:

function foo(i: Integer): Boolean;
label bar;
begin
  try
  if i=1 then goto bar;
  Result:=False;
  EXIT;
bar:
  Result:=True;  //<~~ H2077 Value assigned to 'foo' never used with Optimization on
  finally
  end;
end;

将编译器选项中的 优化设置为

  • True ( Release 配置的默认值) -foo(1)返回False
  • False(调试配置的默认值) -foo(1)返回True

XE7不会出现这样的问题。这个解释东京编译器变化的答案可能是相关的 - 但也许修复了一些新引入的问题。

我的问题是: 这是东京的编译器缺陷吗?我很确定是这样,但我是 Delphi 编程的新手,如果能从更有经验的用户那里得到确认,那就太好了。

如果是编译器的缺陷,那么我有一个后续问题:有没有快速修复此代码的方法?我知道如何goto用简单的语句在我的 MCVE中删除if then else,但实际代码要复杂得多:

if cond1 then goto bar;
if cond2 then goto bar;
if cond3 then goto bar;
...
if condN then goto bar;

并且一些if块还包含带有 inner 的循环goto。我知道如何将所有这些逻辑重写为嵌套if then else块,但也许有一种更简单的方法来修复它,而无需等待编译器的缺陷或第三方组件被修复(我知道这些都不会很快发生)。

4

1 回答 1

7

这是一个编译器缺陷。foo(1)应该返回True。看起来优化器被goto.

向 Embarcadero 提交错误报告。要在此期间解决问题,您可以:

  • 联系第三方组件供应商并寻求解决方法,或
  • 重新编写代码以避免goto混淆优化器,或者
  • 恢复到没有缺陷的旧版本的编译器,或者
  • 禁用受缺陷影响的任何功能的优化。
于 2017-09-21T16:58:13.760 回答