可疑的指针缩放¶
ID: cpp/suspicious-pointer-scaling
Kind: problem
Security severity: 8.8
Severity: warning
Precision: medium
Tags:
- security
- external/cwe/cwe-468
Query suites:
- cpp-security-extended.qls
- cpp-security-and-quality.qls
C 和 C++ 中的指针算术会根据数据类型的大小自动缩放。例如,如果 p
的类型为 T*
且 sizeof(T) == 4
,则表达式 p+1
会将 p
加 4 个字节。如果程序员忘记他们正在添加 sizeof(T)
的倍数而不是字节数,则这可能会导致缓冲区溢出情况。
此查询查找指针算术表达式,其中程序员似乎忘记了偏移量会自动缩放。
建议¶
尽可能使用数组下标运算符而不是指针算术。例如,将
*(p+k)
替换为p[k]
。在使用指针算术之前强制转换为正确的类型。例如,如果
p
的类型为int*
,但它实际上指向double[]
类型的数组,则使用语法(double*)p + k
获取指向数组第k
个元素的指针。
示例¶
int example1(int i) {
int intArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *intPointer = intArray;
// BAD: the offset is already automatically scaled by sizeof(int),
// so this code will compute the wrong offset.
return *(intPointer + (i * sizeof(int)));
}
int example2(int i) {
int intArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *intPointer = intArray;
// GOOD: the offset is automatically scaled by sizeof(int).
return *(intPointer + i);
}
参考¶
常见弱点枚举:CWE-468。