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