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 缺陷,因为指针用于算术表达式。