(también posted on the MSDN forum - pero que no recibe mucho tráfico, por lo que yo puedo ver.)¿Debería el verificador estático de contratos de código ser capaz de verificar el límite aritmético?
He estado tratando de proporcionar un ejemplo de Assert
y Assume
. Aquí está el código que tengo:
public static int RollDice(Random rng)
{
Contract.Ensures(Contract.Result<int>() >= 2 &&
Contract.Result<int>() <= 12);
if (rng == null)
{
rng = new Random();
}
Contract.Assert(rng != null);
int firstRoll = rng.Next(1, 7);
Contract.Assume(firstRoll >= 1 && firstRoll <= 6);
int secondRoll = rng.Next(1, 7);
Contract.Assume(secondRoll >= 1 && secondRoll <= 6);
return firstRoll + secondRoll;
}
(El negocio de ser capaz de pasar de una referencia nula en lugar de una referencia existente Random
es puramente pedagógica, por supuesto.)
yo esperaba que si el inspector sabía que firstRoll
y secondRoll
estaban cada uno en el rango [1, 6]
, se podría deducir que la suma estaba en el rango [2, 12]
.
¿Es esta una esperanza irracional? Me doy cuenta de que es un asunto complicado, resolver exactamente lo que podría pasar ... pero esperaba que el verificador fuera lo suficientemente inteligente :)
Si esto no es compatible ahora, ¿alguien sabe aquí si es probable que sea compatible? en el futuro cercano?
EDITAR: Ahora he encontrado que hay opciones muy complicadas para la aritmética en el comprobador estático. Usando el cuadro de texto "avanzado" puedo probarlos desde Visual Studio, pero no hay una explicación decente de lo que hacen, hasta donde sé.
Jon, ¿has intentado contactar a los chicos de DevLabs directamente? Encontrará los miembros del equipo enumerados en la parte inferior de esta página: http://research.microsoft.com/en-us/projects/contracts/ –
Y su dirección de correo electrónico es codconfb _at_ microsoft _dot_ com (como se menciona en el misma página). Me interesaría saber la respuesta a tu pregunta. –
Pensé que sería un poco más educado hacer las preguntas en el foro primero ... si no escucho en los foros o aquí, lo preguntaré por correo electrónico también. –