Un objectif important des méthodes formelles est de prouver l'exactitude des systèmes, par des moyens automatisés ou dirigés par l'homme. Cependant, il semble que même si vous pouvez fournir une preuve d'exactitude, vous ne pourrez PAS garantir que le système n'échouera pas. Par exemple:
- La spécification peut ne pas modéliser correctement le système, ou un système de production peut être trop compliqué à modéliser, ou le système peut être intrinsèquement défectueux en raison d'exigences contradictoires. Quelles techniques sont connues pour tester si une spécification a un sens?
- Le processus de preuve peut aussi être défectueux! Qui sait que ces règles d'inférence sont correctes et légitimes? De plus, les preuves peuvent être très volumineuses, et comment savoir qu'elles ne contiennent pas d'erreurs? C'est le cœur de la critique de De Millo, Lipton et Perlis "Processus sociaux et preuves de théorèmes et programmes". Comment les chercheurs en méthodes formelles modernes répondent-ils à cette critique?
- Au moment de l'exécution, de nombreux événements et facteurs non déterministes peuvent sérieusement affecter le système. Par exemple, les rayons cosmiques peuvent altérer la RAM de manière imprévisible, et plus généralement nous n'avons aucune garantie que le matériel ne souffrira pas de défauts byzantins, contre lesquels Lamport a prouvé qu'il est très difficile de résister. Ainsi, l'exactitude du système statique ne garantit pas que le système n'échouera pas! Existe-t-il des techniques connues pour expliquer la faillibilité d'un matériel réel?
- À l'heure actuelle, les tests sont l'outil le plus important dont nous disposons pour établir que le logiciel fonctionne. Il semble que ce devrait être un outil complémentaire avec des méthodes formelles. Cependant, je vois surtout des recherches axées sur des méthodes formelles ou des tests. Que sait-on de la combinaison des deux?