常见整数运算的问题
- 有符号整数运算时出现溢出(undefined behavior)
- 无符号整数运算时出现回绕(其实也是溢出)
- 整数类型转换导致符号错误
- 按位操作有符号整数导致符号错误
整数运算不当带来的风险
- 运算产生异常
- 死循环(将整数运算作为循环判断条件)
- 内存分配错误(将整数运算结果作为内存分配大小的参数)
- 内存复制、指针偏移、数组索引等出现越界
建议
对于外部输入(不可控)的整数,需要做相应的边界检查!
- 如果参与运算的整数来自外部或者整数的绝对值偏大,需要考虑运算后是否出现溢出
- 特别关注整数被用在指针偏移、数组索引、内存拷贝长度、内存分配大小、循环判断条件等场景
这里尤其注意,低于 int 类型的无符号整数做位运算时,会进行整型提升!