Código contratos que falla Ejemplo Graph.Remove (Edge E)
-
28-10-2019 - |
Pregunta
Aquí hay un método simple de manipulación de gráficos que he decorado con contratos de código.
¡La reclamación asegura que no lo probará, pero no puedo ver por qué! Creo que afirma que después de llamar a Remove (), el borde ya no está en la lista de bordes o el resultado es falso. No afirma nada sobre el estado del gráfico si el resultado es cierto. A la verificación estática no le gusta y no he conseguido que PEX me diga cómo (aunque probablemente no sé cómo usarlo).
La cerradura es extraña para este ejemplo, creo, pero lo dejaré por si acaso. Además, el delegado de OnremoveEdge no tiene garantías, pero asumiré implícitamente por ahora que no es reentrante en el código gráfico. Además, la suposición lo detiene.
public bool Remove(E edge)
{
Contract.Requires(edge != null);
Contract.Ensures(!Contract.Exists(edges, e => e == edge) || !Contract.Result<bool>());
lock (sync)
{
if (!OnBeforeRemoveEdge(edge)) return false;
if (!edges.Remove(edge)) return false;
}
OnRemoveEdge(edge);
Contract.Assume(!Contract.Exists(edges, e => e == edge));
return true;
}
ACTUALIZACIÓN: Cambié el código para mover el controlador de eventos, onremoveEdge (), (pero no el delegado, onborereMoveEdge) fuera del bloqueo. Pero entonces, ¿qué hace esto para la suposición del contrato relacionada con los hilos? ¿Los contratos de código suponen un modelo único? Mmm.
Solución
De La respuesta de Jack Leitch a una pregunta similar:
los Manual de usuario de contratos de código afirma: "El verificador de contratos estáticos aún no se ocupa de cuantificadores para todos o existe".
Verdadero. verdadero.