数组越界访问之前使用数组偏移量¶
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
该程序包含一个与表达式,其中数组访问定义在范围检查之前。因此,数组访问没有进行任何边界检查。范围检查无法保护程序免受因尝试读取缓冲区末尾之外的数据而导致的段错误。
建议¶
更新与表达式,使范围检查先于数组偏移量。这样可以确保在访问数组之前检查边界。
示例¶
如果 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
函数)。