Investigating the application of differential fuzzing to support the identification and suppression of equivalent mutants: An experimental study
Diese experimentelle Studie zeigt, dass differenzielles Fuzzing ein praktischer, sprachunabhängiger Ansatz ist, um äquivalente Mutanten über diverse reale Softwareprojekte hinweg effizient zu identifizieren und zu unterdrücken, wobei nahezu perfekte Mutationsraten erzielt und zugleich handlungsrelevante Eingaben zur Stärkung traditioneller Testsuiten generiert werden.
Originalarbeit lizenziert unter CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Dies ist eine KI-generierte Erklärung des untenstehenden Papers. Sie wurde nicht von den Autoren verfasst oder gebilligt. Für technische Genauigkeit konsultieren Sie das Originalpaper. Vollständigen Haftungsausschluss lesen
Software-Testing ist der Prozess der Überprüfung, ob ein Computerprogramm korrekt funktioniert, aber das Finden aller möglichen Fehler ist nahezu unmöglich, da Programme komplex sind und die Eingaben unendlich sind. Um dies anzugehen, nutzen Forscher eine Technik namens Mutations-Testing, bei der absichtlich winzige, realistische Fehler in den Code eingeführt werden, um zu sehen, ob die bestehenden Tests diese erkennen können. Wenn ein Test den Fehler nicht bemerkt, bedeutet dies, dass die Testsuite nicht stark genug ist. Diese Methode steht jedoch vor einem hartnäckigen Hindernis: Einige dieser künstlichen Fehler sind so subtil, dass sie das Verhalten des Programms überhaupt nicht verändern, was sie unmöglich detektierbar macht. Dies sind sogenannte äquivalente Mutanten, und deren Identifizierung erfordert in der Regel einen menschlichen Experten, der viel Zeit damit verbringt, den Code Zeile für Zeile zu lesen – ein langsamer und teurer Prozess, der die weit verbreitete Anwendung dieser Testmethode lange Zeit behindert hat.
Gleichzeitig ist eine andere Testmethode namens Fuzzing zu einem Standardwerkzeug für das Finden von Sicherheitslücken geworden. Fuzzing funktioniert, indem es massenhaft zufällige oder fehlerhafte Daten in ein Programm einspeist, um zu sehen, ob es abstürzt. Während dies effektiv beim Finden von Bugs ist, die zum Stillstand eines Programms führen, übersieht traditionelles Fuzzing oft die Art von subtilen Fehlern, die die Art und Weise ändern, wie ein Programm rechnet oder sich verhält, ohne einen Absturz zu verursachen. Eine neue Studie von Forschern der University of São Paulo untersucht einen Weg, diese beiden Welten zu kombinieren. Sie untersuchten eine Technik namens Differential Fuzzing, bei der das Originalprogramm und eine Version mit einem winzigen Fehler nebeneinander ausgeführt werden, wobei ihnen exakt dieselben Daten zugeführt werden und die Ergebnisse verglichen werden. Wenn die beiden Versionen unterschiedliche Ausgaben liefern, wird der Fehler erkannt. Die Forscher wollten sehen, ob dieser Ansatz jene schwer fassbaren äquivalenten Mutanten automatisch identifizieren kann und ob er dies schneller als ein Mensch tun kann.
Um diese Idee zu testen, wählte das Team sechs spezifische Funktionen aus vier verschiedenen, bekannten Open-Source-Softwareprojekten, die in vier verschiedenen Programmiersprachen geschrieben wurden: C++, C, Go und Python. Zu diesen Projekten gehörten Bitcoin Core, ein Kryptowährungsprotokoll; OpenSSL, eine Kryptografie-Bibliothek; LND, ein Payment-Channel-Netzwerk; und Arrow, eine Datums- und Zeitbibliothek. Mit einem Tool, das Fehler für jede Programmiersprache generieren kann, erstellten sie 1.090 gültige Variationen dieser Funktionen. Vor Beginn des automatisierten Testens inspizierten die Forscher die Fehler manuell, um diejenigen zu entfernen, die offensichtlich äquivalent waren, wodurch ein Satz an herausfordernden Fällen übrig blieb, um zu prüfen, ob das automatisierte System den Rest unterscheiden kann. Sie führten daraufhin fünf verschiedene Testszenarien auf diese Fehler aus, die von Standard-Unit-Tests bis hin zu zeitlich begrenzten Fuzzing-Sitzungen reichten, die fünf Minuten pro Fehler dauerten.
Die Ergebnisse zeigten, dass traditionelles Fuzzing, das nur nach Abstürzen sucht, die am wenigsten effektive Methode war und sehr wenige der Fehler entdeckte. Im Gegensatz dazu erwies sich der Differential-Fuzzing-Ansatz als bemerkenswert leistungsstark. Als dieser Ansatz ein Zeitlimit von fünf Minuten pro Test erhielt, identifizierte und bestätigte er die Fehler im Verhalten in fünf von sechs Funktionen, wobei er eine Erfolgsquote zwischen 98 und 100 Prozent erreichte. Für die eine Funktion, bei der das System anfangs Schwierigkeiten hatte, stellten die Forscher fest, dass das Hinzufügen einer einfachen Liste erwarteter Schlüsselwörter dem System half, die Eingabe besser zu verstehen, was schließlich dazu führte, dass es ebenfalls eine perfekte Punktzahl erreichte. Die Studie zeigte auch, dass die Zeit, die benötigt wurde, um diese Fehler zu finden, überraschend kurz war; im Durchschnitt fand das System die Unterschiede in etwa 30 Sekunden, was viel schneller ist als die 15 Minuten, die ein Mensch typischerweise für die manuelle Analyse eines einzelnen Falls benötigt.
Über das bloße Finden der Fehler hinaus entdeckten die Forscher, dass die während des Fuzzing-Prozesses verwendeten Daten einen verborgenen Wert besitzen. Die Sammlung von Eingaben, die das Fuzzing-Tool generierte, bekannt als Seed-Korpus, enthielt spezifische Testfälle, die die Standard-Unit-Tests übersehen hatten. Diese Eingaben waren in der Lage, Mutanten zu eliminieren, die die traditionellen Testsuiten nicht entdecken konnten. Dies deutet darauf hin, dass die bereits von Sicherheitsteams generierten Daten wiederverwendet werden können, um reguläre Testsuiten zu stärken, wodurch ein Nebenprodukt der Sicherheitstests in eine Ressource für die allgemeine Softwarequalität verwandelt wird. Die Studie analysierte auch, wie lange es dauerte, die am schwersten zu detektierenden Fehler zu finden, und stellte fest, dass die meisten schnell gefunden wurden, einige jedoch deutlich mehr Zeit erforderten und ein Muster zeigten, bei dem die Schwierigkeit stark variierte, ähnlich wie bei Aufgaben, die entweder nur ein wenig länger dauern oder sehr viel Zeit in Anspruch nehmen.
Die Forscher kamen zu dem Schluss, dass Differential Fuzzing eine praktische, sprachunabhängige Möglichkeit bietet, die Klassifizierung dieser schwierigen Fehler zu unterstützen. Es erfordert keine komplexen neuen Tools oder sprachspezifische Setups, da es einfach den Originalcode gegen die modifizierte Version vergleicht. Indem sie die überlebenden Fehler als Kandidaten für eine manuelle Überprüfung behandeln, anstatt zu versuchen, jeden einzelnen zu klassifizieren, reduziert die Methode den menschlichen Aufwand drastisch. Die Studie legt nahe, dass dieser Ansatz in bestehende Arbeitsabläufe integriert werden kann, um effizient die Fehler herauszufiltern, die tatsächlich äquivalent sind, sodass sich menschliche Experten auf die kleine Anzahl von Fällen konzentrieren können, die weiterhin ungewiss bleiben. Dieser Befund deutet darauf hin, dass ein einfacher, automatisierter Vergleich von Programmberechnungen ein Problem lösen kann, das lange Zeit als zu kostspielig und zeitaufwendig für eine breite industrielle Anwendung galt.
Ertrinken Sie in Arbeiten in Ihrem Fachgebiet?
Erhalten Sie tägliche Digests der neuesten Arbeiten passend zu Ihren Forschungsbegriffen — mit technischen Zusammenfassungen, in Ihrer Sprache.