我尝试使用微软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 参数是一个排除的上限。 - Wim Coenen