Hauptinhalt

Finanziert von der Deutschen Forschungsgemeinschaft (2024–2027)

Programmtransformationen implementieren Codeanalysen und -änderungen, z. B. zur Überwachung und Analyse von Programmausführungen und zur Mutation von Programmen im Rahmen von Mutationstests. Java-Programme werden häufig auf Bytecode-Ebene transformiert, da der Bytecode dann nicht neu kompiliert werden muss.  Bestehende Bytecode-Toolkits sind auf eine baumartige Programmdarstellung beschränkt, was die Spezifikation komplexerer Programmtransformationen erschwert. Abstraktere, problemspezifische Strukturen werden nicht unterstützt. Zur Lösung größerr Aufgaben können Transformationen zwar kombiniert werden, sie können sich aber in unerwünschter Weise beeinflussen. Das Auffinden von Fehlern in Programmtransformationen wird momentan kaum unterstützt.

Mutationstests überprüfen die Qualität einer Testsuite: Mutationen schleusen Fehler durch geringfügige Änderungen des Programmverhaltens ein; wenn die Testsuite diese nicht findet, ist sie zu schwach. Mutationstests sind ein repräsentativer und anspruchsvoller Anwendungsfall für Programmtransformationen, da wichtige Schwachstellen der Testsuite aufgedeckt werden sollen. Die Spezifikation fortgeschrittener Mutationsoperatoren, die typischen Programmierfehlern wie z.B. der falschen Verwendung von APIs ähneln, wird von existierenden Mutationstestwerkzeugen nicht unterstützt. 

Ziel des Projekts ist die Entwicklung eines Frameworks zur benutzerfreundlichen Entwicklung von modularen Programmtransformationen, insbesondere in Java-Bytecode. Es ermöglicht den Entwicklenden, flexibel erweiterbare und nachvollziehbare Programmstrukturen zu definieren, die für die zu lösenden Transformationsprobleme gut geeignet sind. Um sicherzustellen, dass der transformierte Bytecode ausführbar ist und andere wichtige Konsistenzeigenschaften erfüllt, können konsistenzerhaltende Transformationsmodule definiert werden. Insbesondere werden wir Kompositionsoperatoren und Analysetechniken entwickeln, um modulare Programmtransformationen ohne Seiteneffekte zu unterstützen. Da Java-Projekte sehr groß werden können und Transformationen oft nur lokale Änderungen vornehmen, werden die Programmtransformationen inkrementell ausgeführt, um die Skalierbarkeit zu gewährleisten.

Die Flexibilität und Ausdrucksstärke des Frameworks wird durch eine leistungsstarke Implementierung von effektiven Mutationstests von Java-Bytecode demonstriert. Dazu entwickeln wir einen Ansatz, der es Entwickelnden ermöglicht, fortgeschrittene Mutationsoperatoren und intelligente Strategien für ihre Anwendung einfach zu spezifizieren und auszuführen. Unser Ziel ist es, ein flexibles und benutzerfreundliches Werkzeug für das Mutationstesten  von realen Java-Projekten zur Verfügung zu stellen. Um eine Testsuite zu verbessern, werden  mutierte Programme verwendet, deren Mutationen von der Testsuite nicht gefunden werden, um weitere Testfälle automatisch zu generieren.

Kooperationspartner
Prof. Dr.-Ing. Christoph Bockisch, AG Programmiersprachen und -werkzeuge