J'ai passé quelques heures sur cette question ... voici mon code:Contrats - analyse statique mal repérage Condition à remplir
public static IEnumerable<T> Generate<T>(this Func<T> generator) where T : class
{
Contract.Ensures(Contract.Result<IEnumerable<T>>() != null);
Contract.Ensures(Contract.ForAll<T>(Contract.Result<IEnumerable<T>>(), item => item != null));
if (generator == null)
yield break;
T t;
while ((t = generator()) != null)
yield return t;
}
public static IEnumerable<string> ReadLines(this TextReader reader)
{
Contract.Requires(reader != null);
Contract.Ensures(Contract.Result<IEnumerable<string>>() != null);
Contract.Ensures(Contract.ForAll<string>(Contract.Result<IEnumerable<string>>(), s => s != null));
return Generate(() => reader.ReadLine());
}
Pour une raison quelconque, la dernière ligne (l'invocation de générer()) est marqué comme "ensures unproven: Contract.ForAll<string>(Contract.Result<IEnumerable<string>>(), s => s != null)
". Je ne vois pas comment cela peut être le cas - Generate garantit qu'il ne renverra pas d'éléments NULL, et l'analyseur ne s'en plaindra pas. Qu'est-ce que je fais mal? [Edit] Hmm ... tout d'un coup, je reçois un avertissement sur la fonction Générer - même chose, l'assurance n'est pas prouvée. Je pourrais jurer que cela ne se passait pas avant, mais en tout cas - maintenant le problème a bougé. Comment puis-je persuader l'analyseur qu'il n'y a aucun moyen de renvoyer des éléments Null? Ou, alternativement, où ai-je tort et la fonction peut retourner des éléments null? [Modifier] Blech ... this article dit "les conditions de publication (c.-à-d. Contrat.Assurance) ne sont pas supportées par le vérificateur statique" (dans les itérateurs) ... quelqu'un peut-il confirmer cela?
pinailler: les gens dans le domaine utilisent le mot « correct » pour la capacité de l'analyseur à ne jamais diagnostiquer comme vraie une propriété qui ne l'est pas. J'ai momentanément pensé que cette question était très intéressante. Dans le contexte d'une vraie propriété diagnostiquée comme non prouvée, je recommanderais plutôt d'utiliser "imprécisément". –
Je suis d'avis que les faux négatifs sont aussi faux que les faux positifs :) Dans les deux cas, je ne peux pas faire mon travail à cause de cela. –