String 为什么要测试这些数字(2^16,2^31…)

String 为什么要测试这些数字(2^16,2^31…),string,testing,numbers,integer,long-integer,String,Testing,Numbers,Integer,Long Integer,经过讨论,我看到以下建议: 数字:32768(2^15)32769(2^15+1)65536(2^16+1)65537(2^16+1)2147483648(2^31)2147483649(2^31+1)4294967296(2^32)4294967297(2^32+1) 有人知道测试所有这些案例的原因吗?我的直觉与开发人员可能使用的数据类型(整型、长型、双精度…)一致 类似地,对于字符串: Long(255、256、257、1000、1024、2000、2048或更多字符)这些字符表示边界 整数

经过讨论,我看到以下建议:

数字:32768(2^15)32769(2^15+1)65536(2^16+1)65537(2^16+1)2147483648(2^31)2147483649(2^31+1)4294967296(2^32)4294967297(2^32+1)

有人知道测试所有这些案例的原因吗?我的直觉与开发人员可能使用的数据类型(整型、长型、双精度…)一致

类似地,对于字符串:


Long(255、256、257、1000、1024、2000、2048或更多字符)

这些字符表示边界

整数

  • 2^15位于有符号16位整数的边界处
  • 2^16位于无符号16位整数的边界处
  • 2^31位于有符号32位整数的边界处
  • 2^32位于无符号32位整数的边界处
测试接近公共边界的值可以测试溢出是否得到正确处理(对于各种整数类型,可以是算术溢出,对于可能导致缓冲区溢出的长字符串,可以是缓冲区溢出)

字符串

  • 255/256位于可以用8位表示的数字边界处
  • 1024位于可以用10位表示的数字边界处
  • 2048位于可以用11位表示的数字的边界

我怀疑诸如255、256、1000、1024、2000、2048之类的建议是基于经验/观察的,一些开发人员可能会分配一个他们认为“无论如何都足够大”的固定大小的缓冲区,并且无法检查输入。这种态度导致。

这些边界值接近于最大有符号
short
、最大无符号short,对于
int
也是如此。测试它们的原因是为了找到发生在典型数据类型的边界值附近的bug


例如,您的代码使用带符号的
short
,并且您有一个测试,该测试执行的内容正好低于和正好高于此类类型的最大值。如果第一个测试通过而第二个测试失败,您可以很容易地判断出
short
上的溢出/截断是原因。

这些数字是围栏两侧的边界情况(+1、0和-1),表示“整和圆”计算机数字,它们总是2的幂。2的幂也不是随机的,代表整数精度的标准选择——8、16、32等位宽。

+1表示有趣的备忘单!2000可能针对URL长度攻击。看见也。