Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

符号付き整数のオーバーフローに関する C コンパイラの考慮事項

コード ジェネレーターは、符号付き整数 C の演算がオーバーフロー時にラップすると仮定して、メモリ使用量を低減し、生成するコードのパフォーマンスを改善します。符号付き整数のオーバーフローは、算術演算の結果が出力データ型で表現可能な値の範囲外になると発生します。C プログラミング言語はこのような演算結果を定義しません。一部の C コンパイラは、オーバーフロー状態を引き起こしても、範囲内の値に対して符号付き演算をアグレッシブに最適化します。その他のコンパイラはオーバーフロー時にラップする動作全体を保持します。たとえば、gcc コンパイラと MinGW コンパイラは符号付き整数のオーバーフロー時に確実にオーバーフローをラップするオプションを用意しています。

コードを生成するときに、コード ジェネレーターが設定する既定のオプションでサポートされるコンパイラを使用すると、コンパイラはオーバーフロー時にラップする動作全体を保持します。コンパイラ オプションを変更する場合または別の開発環境でコードをコンパイルする場合、コンパイラはオーバーフロー時にラップする動作全体を保持しない可能性があります。この場合、実行可能プログラムは予測できない結果を生成する可能性があります。

この問題がお使いのアプリケーションで懸念事項となる場合、次の 1 つ以上のアクションを検討してください。

  • コンパイルしたコードで予測される結果が生成されるか確認する。

  • コンパイラにラップ動作を強制するオプションがある場合、オンにする。たとえば、gcc コンパイラまたは gcc ベースのコンパイラ (MinGW など) の場合、コンパイラ オプション -fwrapv を使用するようにビルド プロセスを構成します。

  • 整数のオーバーフローでラップするコンパイラを選択する。

  • Embedded Coder がインストールされている場合、符号付き整数用に生成されたコードを置換するカスタムのコード置換ライブラリを開発して適用する。詳細については、コード置換のカスタマイズ (Embedded Coder)を参照してください。

関連するトピック