CWARN.BAD.PTR.ARITH
指针算术运算错误
在 C 和 C++ 中执行指针算术运算时,由于数学运算隐式缩放的方式,可能意外指向错误的内存。CWARN.BAD.PTR.ARITH 检查器会搜索通过最可能是监督自动缩放的值递增或递减指针所在的实例。
漏洞与风险
指针算术运算错误可能导致缓冲区溢出状况。
漏洞代码示例
复制
#define ARRAY_SIZE 5
void initialize_array()
{
int buf[ARRAY_SIZE];
for (int* p = buf; p < (buf + ARRAY_SIZE); p += sizeof(int)) {
*p = 0;
}
}
Klocwork 针对第 5 行生成指针算术运算错误报告,指明错误的算术运算已应用于指针 p。此处的报告用于通知审阅者表达式 p += sizeof(int) 通过 sizeof(int) * sizeof(int) 字节(由于自动缩放)递增指针“p”,而非仅通过 sizeof(int) 字节递增该指针。因此,在此示例中会出现缓冲区溢出。
修正代码示例
复制
#define ARRAY_SIZE 5
void initialize_array()
{
int buf[ARRAY_SIZE];
for (int* p = buf; p < (buf + ARRAY_SIZE); p++) {
*p = 0;
}
}
之前的代码段中出现的问题已修正:指针通过 sizeof(int) 字节而非 sizeof(int) * sizeof(int) 字节递增。