我试图接受微软DevLabs代码合同静态分析器,并遇到了当我实际上不知道它是我还是他们时的情况。所以这是代码:代码合同和类型转换
public static int GenerateInBetween(int min, int max)
{
Contract.Requires(min < max);
Contract.Requires((long)(max - min) <= (long)(Int32.MaxValue));
Contract.Ensures(Contract.Result<int>() >= min);
Contract.Ensures(Contract.Result<int>() <= max); // Unpvoven!
long range = max - min;
double basicRandom = new Random().NextDouble();
Contract.Assert(basicRandom >= 0.0);
Contract.Assert(basicRandom <= 1.0); // Unpvoven!
double randomDouble = basicRandom * range;
Contract.Assert(randomDouble >= 0.0);
Contract.Assert(randomDouble <= (double)range); // Unpvoven!
int randomInt32 = (int)randomDouble;
Contract.Assert(randomInt32 >= 0);
Contract.Assert(randomInt32 <= range);
return min + randomInt32;
}
静态分析器坚持认为后置条件和断言无法被证明。我看不清它什么时候会出错。
编辑即使我假设后置条件仍未被证实。
已经有一个'System.Random.Next(int min,int max)'方法。但最大参数是唯一的上限。 – 2009-10-31 12:06:43
谢谢。为了方便,我插入了System.Random.Next()调用。我使用的是密码强度随机算法,但问题以任何方式发生。 – 2009-11-01 13:04:55