Je viens de découvrir le nouveau tutoriel Introduction à la preuve de programmes C avec Frama-C et son greffon WP et après en avoir rapidement lu une partie en diagonale1, je me suis dit qu’il y avait matière à discussion.
Personnellement, je trouve qu’essayer de prouver un programme C (à grande échelle) est à peu près aussi désespéré que d’essayer de s’assurer que 30 gosses de 3-5 ans ne vont pas se blesser en passant une journée dans un atelier d’ébéniste mal rangé avec un seul encadrant. On le fait parce c’est de loin l’endroit que l’on connais le mieux et qu’on est bien rodé, mais il n’empêche que ça reste difficile et épuisant. Je sais bien qu’un programme C prouvé sera toujours mieux qu’un programme non prouvé, mais je reste étonné par la manière dont le problème est souvent abordé.
Je serais plutôt du genre à préférer un langage qui syntaxiquement et/ou sémantiquement ne permet pas de faire certaines conneries (pointeurs nuls, utilisation de mémoire désallouée, division par zéro, etc) plutôt que d’accepter ces programmes pour ensuite essayer de vérifier qu’ils n’ont pas ces problèmes. En gros, avoir un langage A pour lequel "il n’existe pas de programme A valide qui exhibe le problème X". Je sais bien que ça ne résout pas complètement le problème initiale de vérifier qu’un programme dans son entièreté vérifie certaines spécifications, mais ça reste un grand pas vers le généralisation de programmes qui ont moins de bugs, et ça aide certainement à se focaliser sur ce qui est actuellement important que sur les centaines de choses permis qu’il faut ensuite interdire.
Un autre point qui me chiffonne est la supposition que les spécifications sont parfaites et qu’elles ne contiennent aucun bug. Si c’est vraiment le cas2, est-ce qu’il ne serait pas plus intéressant que le compilateur écrive lui-même le code à partir des spécifications? Si je dis ça, c’est que les spécifications (formelles) d’un programme sont la plupart du temps écrites dans un langage déclaratif plus expressif que le C. Si on fait plus confiance en ce code, la "bonne" approche ne serait-elle pas d’écrire le programme dans un langage similaire et de laisser le compilateur faire son travail?