45 votes

Compiler des cas de test ou comment tester un compilateur

Les compilateurs, comme tous les logiciels, seraient également sujets aux bogues et erreurs logiques.

Comment valider la sortie générée par le compilateur. En général, ma question est :

  • Comment valider que le code machine généré est correct ?

  • Comment s'assurer que le code machine généré est conforme à la spécification du langage.

  • A-t-il du sens de choisir simplement un projet open source (en C si on écrit également un compilateur en C) pour simplement le compiler à travers le "compilateur". Dans ce cas également, comment juger si le compilateur se comporte comme prévu.

  • Y a-t-il des cas de tests formels (documentation) fournis par le comité des normes du langage qu'un compilateur conforme au langage doit satisfaire ?

  • Quels sont les signes certains indiquant que le problème dans un programme compilé par un compilateur est un bogue du compilateur et non un bogue du programme.

    - Y a-t-il des exemples où les compilateurs populaires sont confus et compilent mal le code ?

Des liens vers toute documentation seraient appréciés.

1 votes

Une grande suite de tests propriétaire: solidsands.nl/supertest-general

14voto

Norman Ramsey Points 115730

Les bons ensembles de tests pour les langages réels sont coûteux à créer et à maintenir. Il y a une raison pour laquelle le jeu de tests Plum Hall, qui est la norme de l'industrie pour le langage ANSI C, est si coûteux.

La validation de traduction de George Necula est une idée brillante mais aussi assez coûteuse à implémenter. Validation de traduction.

La seule chose qui soit bon marché et facile à faire est la suivante : maintenez un ensemble de tests de régression, et chaque fois que vous corrigez un bug dans votre compilateur, ajoutez un test approprié à vos suites de régression. Avec les compilateurs, il est incroyablement facile de réintroduire le même bug encore et encore. Les ajouts disciplinés à votre suite de régression empêcheront cela, et cela ne coûte pas cher.

12voto

Trent Points 5924

Il existe plusieurs ensembles de tests de compilateurs disponibles. Nous avons eu un certain succès en utilisant l'ensemble de tests de Plum Hall pour un compilateur C. Il se compose d'un grand ensemble de code C spécifiquement écrit pour tester la conformité à la norme du langage. Il vérifie que le compilateur peut gérer la syntaxe et la sémantique du langage.

0 votes

Ne répond pas à tout mais le lien est excellent. Merci.

0 votes

Y a-t-il une alternative open source à Plum Hall?

0 votes

J'ai soumis la demande d'informations sur le produit à Plum Hall mais le serveur renvoie un code d'erreur 500. Et je ne trouve aucun e-mail de Plum Hall... Il semble que Plum Hall n'ait pas été maintenu depuis un certain temps, ou je n'ai pas de chance d'avoir simplement rencontré un crash du serveur?

9voto

BCS Points 18500

La pratique générale consiste à créer un grand ensemble de petits programmes, chacun démontrant un aspect du compilateur. Cela inclura à la fois des programmes qui se compilent et ceux qui ne devraient pas. En général, l'ASM sortant n'est pas vérifié, mais plutôt le programme est exécuté et sa sortie est vérifiée. Quant à la manière de s'assurer qu'il n'y a pas de bugs dans les cas de test : les rendre petits, comme 5 à 10 lignes chacun.

Ces suites de tests peuvent être très vastes, allant de centaines à des milliers de tests (par exemple : une suite de tests obsolète pour le langage de programmation D) et comprennent généralement un ou plusieurs cas de test pour chaque bug jamais signalé.

0 votes

Mais si je crée de petits fichiers source et que je les teste individuellement, comment cela garantit-il qu'ils fonctionneront tous lorsque ils seront intégrés dans le même programme. Par exemple, je prends un projet open source et laisse mon compilateur s'y attaquer.

1 votes

Ça ne marche pas. Mais il est beaucoup plus probable que votre compilateur échoue sur l'un des petits programmes. Il n'y a aucun moyen possible de prouver qu'un compilateur peut compiler correctement une source donnée - cela équivaudrait à résoudre le Problème de l'arrêt.

0 votes

Généralement, vous obtenez un mélange de cas de test générés à partir de la spécification du langage (principalement très petits) et de cas provenant de bugs (aussi petits que possible pour la reproduction). En ce qui concerne la certitude que les choses fonctionneront dans tous les cas, je ne suis pas sûr que vous puissiez (pour la plupart des langages) même prouver que la spécification est cohérente, encore moins qu'elle est implémentée correctement.

4voto

Eike Points 971

Pour l'idée de compiler un grand projet open source :

Vous pourriez prendre un projet qui a lui-même une suite de tests. Ensuite, vous compilez le projet et sa suite de tests et voyez si les tests passent. Pour valider ces résultats, vous compilez le projet et la suite de tests avec un autre compilateur, et exécutez à nouveau les tests.

2voto

plinth Points 26817

Il y avait une question précédente liée à cela pour le langage C, mais cela se résume à une suite de tests compilés soigneusement écrite.

Quant aux erreurs de compilateurs, j'ai assez souvent rencontré cela dans ma carrière professionnelle, merci. Cela arrive de moins en moins au fil du temps, mais j'ai découvert un bug dans les compilateurs MS C++ ciblant CLI cette semaine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X