2017-09-21 6 views
13

10.2東京にアップグレードした後、サードパーティのコンポーネントの1つでは、多くの例外がスローされ始めました。 (デフォルトリリース構成)H2077の中で最後にgotoでブロックしよう - 東京のコンパイラの欠陥ですか?

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)はを返します。

このような問題はXE7では発生しません。 This answer東京のコンパイラの変更点はおそらく関連しているかもしれませんが、新しく導入された問題のいくつかを修正する可能性があります。

私の質問は ですそれは東京のコンパイラの欠陥ですか?私はかなり確信していますが、私はDelphiでプログラミングするのが初めてで、経験豊富なユーザーからの確認を得るのは素晴らしいことです。

コンパイラの欠陥の場合は、私はフォローアップの質問があります:このコードを修正するための迅速な方法はありますか?私はシンプルなif then else文で私のMCVEでgotoを削除する方法を知っているが、実際のコードは、方法より複雑です:

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ブロックの入れ子に書き換える方法を知っていますが、コンパイラの欠陥やサードパーティのコンポーネントが修正されるのを待たずに簡単に修正できる方法があります。

+0

私はもう一度gotoを使っている人を見たので、20年以上経ちました。私は最終的にそれを取り除いたと思った... – GuidoG

答えて

7

これはコンパイラの欠陥です。 foo(1)Trueを返す必要があります。 この特定の用途では、オプティマイザが混乱しているようです(goto)。

Embarcaderoにバグレポートを送信してください。ことができます。その間に、問題を乗り越えるために:

  • 問い合わせサードパーティコンポーネントベンダーと回避策を求める、または
  • 再書き込みオプティマイザを混同するように見えるgotoを避けるために、コードを、または
  • 欠陥のないコンパイラの古いバージョンに戻すか、または
  • 欠陥の影響を受けるすべての機能の最適化を無効にします。
+5

あなたのアドバイスに続き、[RSP-19110](https://quality.embarcadero.com/browse/RSP-19110)を提出しました。 – BrakNicku

関連する問題