算术表达式中的不受控数据¶
ID: cpp/uncontrolled-arithmetic
Kind: path-problem
Security severity: 8.6
Severity: warning
Precision: high
Tags:
- security
- external/cwe/cwe-190
- external/cwe/cwe-191
Query suites:
- cpp-code-scanning.qls
- cpp-security-extended.qls
- cpp-security-and-quality.qls
除非对输入进行验证,否则对不受控数据执行计算可能会导致整数溢出。
如果数据不受您控制,并且可能取极大的值,那么即使是通常会导致幅度发生微小变化的算术运算也可能导致溢出。
建议¶
始终通过执行以下操作之一来防止对不受控数据执行算术运算时发生溢出:
验证数据。
在算术表达式上定义一个防护,以便仅当结果已知小于或等于该类型的最大值(例如
INT_MAX
)时才执行运算。使用更宽的类型,以便较大的输入值不会导致溢出。
示例¶
在此示例中,将生成一个随机整数。由于该值不受程序员控制,因此它可能非常大。因此,对该值执行算术运算可能会导致溢出。为了避免这种情况发生,该示例展示了如何在执行算术运算之前执行检查。
int main(int argc, char** argv) {
int i = rand();
// BAD: potential overflow
int j = i + 1000;
// ...
int n = rand();
int k;
// GOOD: use a guard to prevent overflow
if (n < INT_MAX-1000)
k = n + 1000;
else
k = INT_MAX;
}