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

时间:2012-08-14 16:00:56

标签: string testing numbers integer long-integer

通过Elisabeth Hendrickson's test heuristics cheatsheet,我看到以下建议:

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

有人知道测试所有这些案件的原因吗?我的直觉是开发人员可能使用的数据类型(整数,长,双......)

同样,使用字符串:

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

3 个答案:

答案 0 :(得分:7)

这些代表边界

<强>整数

  • 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这样的建议是基于经验/观察,一些开发人员可能会分配一个固定大小的缓冲区,他们认为这个缓冲区“无论如何都足够大”并且失败检查输入。这种态度导致buffer overflow attacks

答案 1 :(得分:3)

这些边界值接近最大签名short,最大unsigned shortint相同。测试它们的原因是发现接近典型数据类型的边界值的错误。

E.g。你的代码使用了签名的short,并且你有一个测试,它可以在下面运行一些东西,就在这种类型的最大值之上。如果第一个测试通过而第二个测试失败,您可以轻松地告诉short上的溢出/截断是原因。

答案 2 :(得分:2)

这些数字是围栏两侧的边界情况(+ 1,0和-1),对于“整个和圆形”计算机数字,总是2的幂。那些2的幂也不是随机的并且是表示整数精度的标准选择 - 位宽为8,16,32等。