EN JP CN

CWARN.BAD.PTR.ARITH

CWARN.BAD.PTR.ARITH

不良なポインター算術演算

ポインター算術を行う際、C および C++ において、算術操作が明示的にスケーリングされている方法のため、不適切なメモリにうっかりして参照することがあります。CWARN.BAD.PTR.ARITH チェッカーは、自動スケーリングの見過ごしであった可能性が高い値により増分または減分されたポインターのインスタンスを検索します。

脆弱性とリスク

不良なインターの算術はバッファオーバーフロー状態を引き起こす可能性があります。

脆弱コード例

1  #define ARRAY_SIZE 5
2  void initialize_array()
3  {
4      int buf[ARRAY_SIZE];
5      for (int* p = buf; p < (buf + ARRAY_SIZE); p += sizeof(int)) {
6          *p = 0;
7      }
8  }

Klockwork はライン 5 に対して、不良ポインター算術レポートを作成し、不良な算術がポインター「p」に適用されたことを示します。このレポートは、式 p += sizeof(int) がポインター「p」を sizeof(int) で増分する代わりに sizeof(int) * sizeof(int) バイト(自動スケーリングのため)で増分していることをレビューアに知らせます。そのため、この例ではバッファーオーバーフローが生じます。

修正コード例

1  #define ARRAY_SIZE 5
2  void initialize_array()
3  {
4      int buf[ARRAY_SIZE];
5      for (int* p = buf; p < (buf + ARRAY_SIZE); p++) {
6          *p = 0;
7      }
8  }

前のスニペットからの問題が修正されました。ポインターは sizeof(int) * sizeof(int) の代わりにsizeof(int) バイトで増分されています。

関連チェッカー