CodeQL 文档

数组越界访问之前使用数组偏移量

ID: cpp/offset-use-before-range-check
Kind: problem
Security severity: 8.2
Severity: warning
Precision: medium
Tags:
   - reliability
   - security
   - external/cwe/cwe-120
   - external/cwe/cwe-125
Query suites:
   - cpp-security-extended.qls
   - cpp-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

该程序包含一个与表达式,其中数组访问定义在范围检查之前。因此,数组访问没有进行任何边界检查。范围检查无法保护程序免受因尝试读取缓冲区末尾之外的数据而导致的段错误。

建议

更新与表达式,使范围检查先于数组偏移量。这样可以确保在访问数组之前检查边界。

示例

如果 start 长于或等于 str 指向的缓冲区的长度(或长于 len,具体取决于缓冲区的内容),则 find 函数可能会读取缓冲区末尾之外的数据。

int find(int start, char *str, char goal)
{
    int len = strlen(str);
    //Potential buffer overflow
    for (int i = start; str[i] != 0 && i < len; i++) { 
        if (str[i] == goal)
            return i; 
    }
    return -1;
}

int findRangeCheck(int start, char *str, char goal)
{
    int len = strlen(str);
    //Range check protects against buffer overflow
    for (int i = start; i < len && str[i] != 0 ; i++) {
        if (str[i] == goal)
            return i; 
    }
    return -1;
}



更新与表达式,使范围检查先于数组偏移量(例如,findRangeCheck 函数)。

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私