【发布时间】:2009-10-31 06:53:42
【问题描述】:
我尝试使用 Microsoft DevLabs Code Contracts 静态分析器,但遇到了我实际上不知道是我还是他们的情况。所以这里是代码:
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)方法。但 max 参数是一个排他性的上限。 -
谢谢。为了方便起见,我插入了 System.Random.Next() 调用。我在那个地方使用 crypt-strong 随机算法,但无论哪种方式都会出现问题。
标签: c# .net code-contracts