Simple Science

La science de pointe expliquée simplement

# Informatique# Génie logiciel

Automatisation des tests pour les dialectes de compilateur en évolution

Une nouvelle méthode vise à automatiser les tests dans des environnements de compilateurs en évolution.

― 6 min lire


Tester des compilateursTester des compilateursdevient plus simple.les compilateurs.processus de génération de tests pourUne nouvelle méthode simplifie le
Table des matières

Ces dernières années, il y a eu un gros changement dans la conception des compilateurs, en mettant l'accent sur des moyens plus flexibles et modulaires de définir comment le code est représenté et géré. Ce changement est particulièrement évident avec le développement d'un outil appelé Multi-Level Intermediate Representation (MLIR). Contrairement aux compilateurs traditionnels qui s'en tiennent à une seule façon de représenter le code, MLIR permet aux développeurs de créer de nouvelles représentations qui correspondent à leurs besoins spécifiques.

Le défi des tests dans la conception de compilateurs

À mesure que les compilateurs évoluent, ils intègrent souvent de nouvelles fonctionnalités et représentations, connues sous le nom de Dialectes. Ces dialectes peuvent introduire des règles et des exigences uniques qui sont importantes pour l'exécution correcte du code. Cependant, créer des tests pour ces nouveaux dialectes peut être très long et complexe. En général, si un dialecte change ou de nouveaux sont ajoutés, les développeurs doivent écrire manuellement de nouveaux tests pour s'assurer que tout fonctionne correctement. C'est là que réside le problème : suivre l'évolution rapide des dialectes peut être une tâche décourageante.

Une nouvelle approche pour tester le code des compilateurs

Pour résoudre ce problème, une nouvelle méthode a été proposée pour créer automatiquement des tests pour ces dialectes en évolution. L'idée est simple : plutôt que de demander aux développeurs d'écrire de nouveaux tests chaque fois qu'un dialecte change, cette méthode peut apprendre des cas de test existants et les adapter à de nouveaux contextes. Cela signifie qu'au lieu de tout recommencer à zéro, le programme peut prendre ce qu'il sait déjà et l'appliquer à de nouvelles situations.

Comment fonctionne cette méthode

La méthode fonctionne en analysant les cas de test existants et en extrayant des motifs. Ces motifs fournissent un plan pour créer de nouveaux tests qui respectent les règles et les contraintes des différents dialectes. En utilisant le contexte des tests existants, le programme identifie où des mises à jour ou des changements doivent être effectués pour garantir la correction. De cette façon, les développeurs peuvent gagner du temps et des efforts lors des tests de nouveaux dialectes.

Mutations sensibles au contexte

Un des points forts de cette nouvelle approche est sa capacité à créer des mutations sensibles au contexte. Sensible au contexte signifie que le programme considère le code environnant lors des modifications. Par exemple, si une fonction nécessite deux entrées, le programme vérifie que ces entrées sont bien disponibles dans le contexte environnant avant d'appliquer un changement. Cela réduit la probabilité de créer des tests invalides qui pourraient entraîner des erreurs.

Paramétrisation des changements

Une autre caractéristique importante est la paramétrisation. Cela permet au programme d'apporter des changements de manière flexible. Au lieu de coder en dur des valeurs spécifiques dans les tests, le programme peut utiliser des espaces réservés. Lorsqu'il applique la mutation, il remplacera ces espaces réservés par des valeurs réelles provenant du contexte environnant. Cette capacité à s'adapter et à remplir des valeurs en fonction du contexte contribue à créer des cas de test plus valides.

Comparaison avec d'autres techniques

Pour comprendre comment cette nouvelle méthode fonctionne, elle a été comparée à d'autres techniques existantes. Les fuzzers traditionnels basés sur la grammaire, par exemple, s'appuient sur des règles fixes pour créer des tests. Bien que ceux-ci puissent générer de nouveaux cas de test, ils ont souvent du mal à respecter les exigences spécifiques de certains dialectes. Cela conduit à de nombreux cas de test invalides, qui n'aident pas à identifier les défauts dans le compilateur.

D'un autre côté, cette nouvelle approche a montré qu'elle augmentait considérablement les chances de générer des cas de test valides. En s'appuyant sur des exemples existants et en les adaptant au contexte actuel, elle atteint une meilleure précision. Dans de nombreux tests, elle a surpassé d'autres méthodes en termes de Couverture des branches et de couverture des dialectes, indiquant une meilleure compréhension et exploitation des structures sous-jacentes.

Évaluation empirique

L'efficacité de cette méthode a été évaluée en utilisant divers projets basés sur MLIR, chacun contenant son propre ensemble de dialectes. Les résultats ont montré que la nouvelle méthode a non seulement produit un ensemble diversifié de cas de test, mais a également amélioré de manière significative la couverture des branches globale. Cela signifie qu'elle a mieux exploré différentes parties du code, aidant à détecter des bugs potentiels.

Insights des expériences

Bien que les résultats soient prometteurs, l'expérience a également révélé certaines limites. Par exemple, lorsque le contexte était trop strict, cela limitait parfois le nombre de cas de test valides générés. Trouver un équilibre entre l'utilisation d'un contexte suffisant pour garantir la correction tout en permettant la diversité dans la génération de tests est crucial.

Conclusion

En résumé, à mesure que les compilateurs deviennent plus complexes avec l'introduction de plusieurs dialectes, trouver des moyens efficaces de tester ces systèmes est essentiel. La méthode proposée de synthétiser des tests à partir de cas existants offre une solution prometteuse. Avec son accent sur le contexte et la flexibilité, elle est prête à révolutionner la façon dont les tests sont réalisés dans le domaine de la conception de compilateurs. Cette approche non seulement fait gagner du temps aux développeurs, mais augmente aussi la fiabilité du processus de test, menant finalement à de meilleurs compilateurs.

À mesure que les compilateurs continuent d'évoluer, il sera important d'adapter les stratégies de test qui suivent ces changements. Cette méthode représente un pas significatif dans cette direction, démontrant que l'adaptation intelligente peut donner de meilleurs résultats dans le monde chaotique du développement de compilateurs.

Source originale

Titre: Fuzzing MLIR Compilers with Custom Mutation Synthesis

Résumé: Compiler technologies in deep learning and domain-specific hardware acceleration are increasingly adopting extensible compiler frameworks such as Multi-Level Intermediate Representation (MLIR) to facilitate more efficient development. With MLIR, compiler developers can easily define their own custom IRs in the form of MLIR dialects. However, the diversity and rapid evolution of such custom IRs make it impractical to manually write a custom test generator for each dialect. To address this problem, we design a new test generator called SYNTHFUZZ that combines grammar-based fuzzing with custom mutation synthesis. The key essence of SYNTHFUZZ is two fold: (1) It automatically infers parameterized context-dependent custom mutations from existing test cases. (2) It then concretizes the mutation's content depending on the target context and reduces the chance of inserting invalid edits by performing k-ancestor and pre(post)fix matching. SYNTHFUZZ obviates the need to manually define custom mutation operators for each dialect. We compare SYNTHFUZZ to three baselines: Grammarinator, MLIRSmith, and NeuRI. We conduct this comprehensive comparison on four different MLIR projects. Each project defines a new set of MLIR dialects where manually writing a custom test generator would take weeks of effort. Our evaluation shows that SYNTHFUZZ on average improves MLIR dialect pair coverage by 1.75 times, which increases branch coverage by 1.22 times. Further, we show that our context dependent custom mutation increases the proportion of valid tests by up to 1.11 times, indicating that SYNTHFUZZ correctly concretizes its parameterized mutations with respect to the target context. Parameterization of the mutations reduces the fraction of tests violating the base MLIR constraints by 0.57 times, increasing the time spent fuzzing dialect-specific code.

Auteurs: Ben Limpanukorn, Jiyuan Wang, Hong Jin Kang, Eric Zitong Zhou, Miryung Kim

Dernière mise à jour: 2024-08-27 00:00:00

Langue: English

Source URL: https://arxiv.org/abs/2404.16947

Source PDF: https://arxiv.org/pdf/2404.16947

Licence: https://creativecommons.org/licenses/by/4.0/

Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.

Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.

Plus d'auteurs

Articles similaires