常见整数运算的问题

  • 有符号整数运算时出现溢出(undefined behavior)
  • 无符号整数运算时出现回绕(其实也是溢出)
  • 整数类型转换导致符号错误
  • 按位操作有符号整数导致符号错误

整数运算不当带来的风险

  • 运算产生异常
  • 死循环(将整数运算作为循环判断条件)
  • 内存分配错误(将整数运算结果作为内存分配大小的参数)
  • 内存复制、指针偏移、数组索引等出现越界

建议

对于外部输入(不可控)的整数,需要做相应的边界检查!

  • 如果参与运算的整数来自外部或者整数的绝对值偏大,需要考虑运算后是否出现溢出
  • 特别关注整数被用在指针偏移、数组索引、内存拷贝长度、内存分配大小、循环判断条件等场景

alt text|1000

|1000

这里尤其注意,低于 int 类型的无符号整数做位运算时,会进行整型提升