Hauptinhalt

Finanziert von der Deutschen Forschungsgemeinschaft (2024–2027)

Programmtransformationen implementieren Codeanalysen und -änderungen, z. B. zur Überwachung der Ausführung. Java-Programme werden häufig auf Bytecode-Ebene transformiert, da Bytecode dann nicht neu kompiliert werden muss. Während wir uns in der Compilerbautheorie oft mit Graphen wie Kontroll- oder Datenflussgraphen befassen, sind bestehende Bytecode-Toolkits auf eine baumartige Programmdarstellung festgelegt. Abstraktere, problemspezifische Strukturen werden noch nicht unterstützt. Um größere Aufgaben zu lösen, können Transformationen kombiniert werden, sie können sich aber auf unerwünschte Weise beeinflussen. Die Validierung von transformiertem Bytecode wird zwar in bestehenden Bytecode-Toolkits unterstützt, fehlerhafte Transformationen müssen aber rückgängig gemacht werden. Die bereitgestellte Validierung konzentriert sich auf die Ausführbarkeit von Code und kann nicht an andere Bedürfnisse angepasst werden.

Mutationstesten überprüft die Qualität einer Testsuite: Mutationen schleusen durch geringfügige Änderungen des Programmverhaltens Fehler ein; werden diese von der Testsuite nicht gefunden, ist sie zu schwach. Mutationstesten bildet einen repräsentativen und herausfordernden Anwendungsfall für Programmtransformationen, da es wichtig ist, die Mutationen mit dem Potenzial, wichtige Schwachstellen der Testsuite aufzudecken, zu identifizieren. Die Spezifikation fortgeschrittener Mutationsoperatoren, die typischen Programmierfehlern, wie der Fehlbenutzung von APIs ähneln, wird von bestehenden Mutationstestwerkzeugen nicht gut unterstützt.

Ziel des Projekts ist die Entwicklung eines Frameworks zur benutzerfreundlichen Entwicklung modularer Programmtransformationen, insbesondere von 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 Einschränkungen erfüllt, können konsistenzerhaltende Transformationsmodule verwendet werden. Kompositionsoperatoren und Analysetechniken hierfür werden verfügbar sein, um eine modulare Programmtransformation ohne Seiteneffekte zu unterstützen. Da Java-Projekte groß werden können und Transformationen oft nur lokale Änderungen vornehmen, werden die Programmtransformationen inkrementell ausgeführt, um Skalierbarkeit zu gewährleisten.

Die Flexibilität und Ausdrucksstärke des Frameworks wird durch eine leistungsstarke Implementierung von effektivem Mutationstesten von Java-Bytecode demonstriert. Hierzu wird eine Transformationssprache benötigt, die es Entwicklenden ermöglicht, fortgeschrittene Mutationsoperatoren und intelligente Strategien für ihre Anwendung einfach zu spezifizieren. Darüber hinaus sollten Mutationstests auf reale Projekte anwendbar sein. Unser Ziel ist ein flexibler, benutzerfreundlichen Ansatz für Mutationstesten mit Tool-Unterstützung, um effektive Mutanten zu finden und Testsuiten entsprechend zu optimieren.

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