CERT.ARR.PTR.ARITH

算術式で使用されているポインター

CERT.ARR.PTR.ARITH チェッカーは、算術式で使用されているポインターのインスタンスにフラグを立てます。

脆弱性とリスク

C/C++ のポインター算術は、一部のシナリオで紛らわしくなることがあります。ptr+1 という式は、ptr に保持されているアドレスに 1 を加えるものと誤って解釈される可能性があります。実際には、新しいメモリアドレスはポインターのターゲットのバイトサイズで決まります。この誤解は、sizeof が不正に適用される場合、予期しない動作を引き起こす可能性があります。

軽減と防止

ポインター算術では、配列添え字構文 ptr[expr] を使用した配列インデックス付けが望まれます。この方法はポインター操作よりも明確で、エラーが発生しにくいためです。

脆弱コード例

コピー
  #include <stdint.h>
  #include <stddef.h>
  void func ( uint8_t *ptr1, uint8_t ptr2[ ] )
  {
      ptr1 = ptr1 + 5;
      ptr1 = ptr1 - 1;
      ptr2 = ptr2 + 3;
  }
 
  int main()
  {
      uint8_t a1[ 16 ];
      uint8_t a2[ 16 ];
      uint8_t data = 0U;
      func ( a1, a2 );
      return 0;
  }

この不適合例では、Klocwork は、算術式でポインターが使用されている 5 行目、6 行目、7 行目で CERT.ARR.PTR.ARITH 欠陥を報告します。