CodeQL 文档

可疑的指针缩放

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

点击查看 CodeQL 仓库中的查询

C 和 C++ 中的指针算术会根据数据类型的大小自动缩放。例如,如果 p 的类型为 T*sizeof(T) == 4,则表达式 p+1 会将 p 加 4 个字节。如果程序员忘记他们正在添加 sizeof(T) 的倍数而不是字节数,则这可能会导致缓冲区溢出情况。

此查询查找指针算术表达式,其中程序员似乎忘记了偏移量会自动缩放。

建议

  1. 尽可能使用数组下标运算符而不是指针算术。例如,将 *(p+k) 替换为 p[k]

  2. 在使用指针算术之前强制转换为正确的类型。例如,如果 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);
}

参考

  • ©GitHub 公司
  • 条款
  • 隐私