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 欠陥を報告します。