13

unsigned問題のコードをからにint、そして再コンパイル時にできるだけ多くの変数を変更するという決定を下したところ、次の警告メッセージが表示されました。

freespace_state.c:203: warning: assuming that the loop is not infinite

問題の行:

for (x = startx; x <= endx; ++x, ++xptr)

このループは60行のコード(空白/角かっこなどを含む)であり、そのgoto中に少なくとも1つの。がありcontinueます。

この場合、GCCがこのループが無限ではないと想定していることに感謝します。なぜなら、無限にループすることは決してないからです。

GCCはここで私に何を伝えようとしていますか?

警告の文法は、警告が他の警告のコンテキスト内で取られるべきであることをほぼ示唆していますが、そのコンテキスト内には何もありません。

[編集] それはすべて完全に私自身のせいです。私はここの質問からいくつかの最適化と警告のオプションを実際に理解せずに盗み、それ以来それらを忘れていました。

-Wunsafe-loop-optimizationsMark Rushakoffの答えを参照してください。さらに、 GCCがループについて仮定を行っているかどうかを明示的に警告するためにも使用しました。http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.htmlを参照してください

4

3 に答える 3

13

2005年のこのGCCパッチによると、GCCは「安全でないループの最適化」を実行しているようです-funsafe-loop-optimizations(設定されているため、警告が表示されます)。ループ無限大の場合、この特定の最適化はどういうわけか失敗します。

終了ループだとおっしゃっていたので、何も心配する必要はありません。

パッチの別の関連部分:

@opindexWunsafe-loop-optimizations
コンパイラができなかったためにループを最適化できない場合に警告する
ループインデックスの境界にあるものをすべて想定します。と
@option {-funsafe-loop-optimizations}は、コンパイラが作成した場合に警告します
+そのような仮定。
于 2010-06-05T23:25:24.580 に答える
2

GCCが警告する理由は、安全でない最適化を引き出したためです。それ以外の

for (x = startx; x <= endx; ++x, ++xptr)

基本的に使用します:

for( x = startx; x < (endx+1); ++x, ++xptr)

endx+1これはオーバーフローしない場合にのみ正しいですが、これendxはが可能な最大値である場合に発生します。これは、それx <= endxが常に真であることを意味します。コンパイラは、これが発生しないことを前提としています。

ここで重要なのはループの有限性ではないため、警告は少し混乱することがあります。コンパイラの警告に十分短いメッセージのより良い候補があるかどうかはわかりません。

1つの例は、たとえば整数である場合xendx最適化が実際に標準で許可されていると解釈できる場合endx==MAX_INTです。条件がtrueの場合、x最終的にオーバーフローが発生し、未定義の動作になります。これは、コンパイラがこれは起こらないと仮定します。ループを完全にスキップすることは、この解釈による標準的な準拠動作です。

もう1つのケースは、プログラムがループ中に終了しないか、揮発性メモリを変更する(つまり、観察可能な動作をする)場合です。これは、無限ループが未定義の動作を意味することを意味します(IIRC、少なくともコンパイラはこれが発生しないと想定できます) 。

于 2016-05-31T08:00:00.297 に答える
0

GCCは、ループが無限ではないと判断できず、コンパイルを続行していると言っていると思います。これは警告であり、エラーではなく、考えてみたいことです。

于 2010-06-05T23:24:28.120 に答える