EN JP CN

CWARN.ALIGNMENT

CWARN.ALIGNMENT

不正確なポインターのスケーリングの可能性があります

C および C++ において、算術操作が明示的にスケーリングされている方法のため、不適切なメモリにうっかりして参照することがあります。CWARN.ALIGNMENT チェッカーは、ポインターが正しく向いていない可能性のあるインスタンスを検出します。

脆弱性とリスク

間違ったポインターのスケーリングはバッファオーバーフロー状態を引き起こす可能性があります。

脆弱コード例

1 int buffer[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
2 int test1() {
3 char *temp = (char *)buffer;
4 int res = (int) (*(temp+6));
5 return res;
6 }

この例では、間違ったポインタースケーリングの可能性があるため、Klocwork は 4 行目で CWARN.ALIGNMENT 警告を出します。この行で 'res' は配列 'buffer' の 7 番目の要素を取得するよう意図されたのでしょうが、変数 'temp' に 6 を足すことで 6 バイトを足すだけになっています。この場合は、この整数値が 'buffer' の 3 番目の要素の中央から抽出されています。

修正コード例

1 int buffer[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
2 int test1() {
3 char *temp = (char *)buffer;
4 int res = *((int*)temp+6);
5 return res;
6 }

修正例では、'res' が 'buffer' の 7 番目の要素を明確に参照するようなコードになっています。