H2077 внутри блока try finally с помощью goto - это дефект компилятора Токио?

После обновления до 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 (по умолчанию для Конфигурация выпуска) — 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 также содержат циклы с внутренними goto. Я знаю, как переписать всю эту логику во вложенные if then else блоки, но, возможно, есть более простой способ исправить это, не дожидаясь исправления дефекта компилятора или стороннего компонента (я знаю, что ничего из этого не произойдет в ближайшее время).


person BrakNicku    schedule 21.09.2017    source источник
comment
Прошло более 20 лет с тех пор, как я снова видел, как кто-то использует goto. Я думал, что мы, наконец, избавились от этого...   -  person GuidoG    schedule 22.09.2017


Ответы (1)


Это дефект компилятора. foo(1) должен вернуть True. Похоже, оптимизатор сбит с толку именно этим использованием goto.

Отправьте отчет об ошибке в Embarcadero. Чтобы решить проблему, вы можете:

  • Обратитесь к стороннему поставщику компонентов и попросите обходной путь, или
  • перепишите код, чтобы избежать goto, который, кажется, сбивает с толку оптимизатор, или
  • вернуться к более старой версии компилятора, которая исправна, или
  • отключить оптимизацию для любых функций, затронутых дефектом.
person David Heffernan    schedule 21.09.2017
comment
Следуя вашему совету, вы отправили RSP-19110. - person BrakNicku; 21.09.2017