ホームページ >バックエンド開発 >C++ >符号付き整数のオーバーフローにより、この C コードで無限ループが発生するのはなぜですか?

符号付き整数のオーバーフローにより、この C コードで無限ループが発生するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-02 22:12:11552ブラウズ

Why Does Signed Integer Overflow Cause an Infinite Loop in This C   Code?

提供されたコード内の整数オーバーフローは、一見重要ではないように見えますが、ループ変数の値が壊れるという重大な結果をもたらします。

ここで観察される動作は、 C 11 ドラフトに記載されている、符号付き整数のオーバーフローに起因する未定義の動作N3337:

「式の評価中に、結果が数学的に定義されていない場合、またはその型で表現可能な値
の範囲内にない場合、動作は未定義です。」

この未定義の動作では、あらゆることが起こる可能性があり、C ルールの下では特にこの動作が発生する理由の分析は無意味になります。

コードのアセンブリ リストから、明示的な加算によりオーバーフローが発生し、事実上ループが無限ループになります。この動作は、2 より大きい値に対する未定義の動作の存在に基づいて、最適化を目的として i が 2 以下であるという仮定によるものです。その結果、ループ条件は常に true とみなされます。

この問題を修正し、正しく実行されるようにするには、条件を修正して未定義の動作を排除し、確実に終了することが重要です

以上が符号付き整数のオーバーフローにより、この C コードで無限ループが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。