Investigating the application of differential fuzzing to support the identification and suppression of equivalent mutants: An experimental study
Deze experimentele studie toont aan dat differential fuzzing een praktische, taalonafhankelijke benadering is voor het efficiënt identificeren en onderdrukken van equivalente mutanten binnen diverse real-world softwareprojecten, waarbij bijna perfecte mutatiescores worden behaald terwijl bruikbare inputs worden gegenereerd om traditionele testsuites te versterken.
Oorspronkelijk artikel gelicentieerd onder CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Dit is een AI-gegenereerde uitleg van het onderstaande artikel. Het is niet geschreven of goedgekeurd door de auteurs. Raadpleeg het oorspronkelijke artikel voor technische nauwkeurigheid. Lees de volledige disclaimer
Softwaretesten is het proces van controleren of een computerprogramma correct werkt, maar het vinden van elke mogelijke fout is bijna onmogelijk omdat programma's complex zijn en de hoeveelheid inputs eindeloos is. Om dit aan te pakken, gebruiken onderzoekers een techniek genaamd mutation testing, die werkt door opzettelijk kleine, realistische fouten in de code te introduceren om te zien of de bestaande tests deze kunnen ontdekken. Als een test de fout niet opmerkt, betekent dit dat de testsuite niet sterk genoeg is. Deze methode staat echter voor een hardnekkig obstakel: sommige van deze nepfouten zijn zo subtiel dat ze het gedrag van het programma helemaal niet veranderen, waardoor ze onmogelijk te detecteren zijn. Dit zijn zogenaamde 'equivalent mutants', en het identificeren ervan vereist meestal dat een menselijke expert een aanzienlijke hoeveelheid tijd besteedt aan het regel voor regel lezen van de code, een traag en duur proces dat de wijdverbreide toepassing van deze testmethode lang heeft tegengehouden.
Tegelijkertijd is een andere testmethode genaamd fuzzing een standaardinstrument geworden voor het vinden van beveiligingslekken. Fuzzing werkt door een programma enorme hoeveelheden willekeurige of foutieve data te voeren om te zien of het crasht. Hoewel het effectief is bij het vinden van bugs die ervoor zorgen dat een programma stopt met werken, mist traditionele fuzzing vaak het soort subtiele fouten die de manier waarop een programma berekent of zich gedraagt veranderen zonder een crash te veroorzaken. Een nieuwe studie door onderzoekers van de Universiteit van São Paulo onderzoekt een manier om deze twee werelden te combineren. Ze onderzochten een techniek genaamd differential fuzzing, die het originele programma en een versie met een kleine fout naast elkaar draait, exact dezelfde data voert en de resultaten vergelijkt. Als de twee versies verschillende outputs produceren, wordt de fout ontdekt. De onderzoekers wilden zien of deze aanpak automatisch die ongrijpbare equivalent mutants kon identificeren en dit sneller kon doen dan een mens.
Om dit idee te testen, selecteerde het team zes specifieke functies uit vier verschillende, bekende open-source softwareprojecten geschreven in vier verschillende programmeertalen: C++, C, Go en Python. Deze projecten omvatten Bitcoin Core, een cryptografisch protocol; OpenSSL, een cryptografiebibliotheek; LND, een netwerk voor betalingskanalen; en Arrow, een datum- en tijdbibliotheek. Met behulp van een tool die fouten voor elke programmeertaal kan genereren, creëerden ze 1.090 geldige variaties van deze functies. Voordat de geautomatiseerde tests begonnen, inspecteerden de onderzoekers de fouten handmatig om de fouten te verwijderen die overduidelijk equivalent waren, waardoor een set uitdagende gevallen overbleef om te zien of het geautomatiseerde systeem de rest kon onderscheiden. Vervolgens draaiden ze vijf verschillende testscenario's op deze fouten, variërend van standaard unit tests tot tijdgebonden fuzzing-sessies van vijf minuten per fout.
De resultaten toonden aan dat traditionele fuzzing, die alleen naar crashes kijkt, de minst effectieve methode was en zeer weinig van de fouten ontdekte. In tegenstelling hiertoe bleek de differential fuzzing-aanpak opmerkelijk krachtig te zijn. Wanneer deze methode een tijdslimiet van vijf minuten kreeg om elke fout te testen, identificeerde en bevestigde deze de gedragingen van de fouten in vijf van de zes functies, waarbij een succespercentage tussen de 9 98 en 100 procent werd bereikt. Voor de ene functie waar het systeem aanvankelijk moeite mee had, ontdekden de onderzoekers dat het toevoegen van een eenvoudige lijst met verwachte trefwoorden hielp om de input beter te begrijpen, wat uiteindelijk leidde tot een perfecte score. De studie onthulde ook dat de tijd die nodig was om deze fouten te vinden verrassend kort was; gemiddeld vond het systeem de verschillen in ongeveer 30 seconden, veel sneller dan de 15 minuten die een mens er doorgaans over doet om één geval handmatig te analyseren.
Naast het louter vinden van de fouten, ontdekten de onderzoekers dat de data die tijdens het fuzzingproces werd gebruikt, verborgen waarde bevat. De collectie inputs die de fuzzing-tool genereerde, bekend als een 'seed corpus', bevatte specifieke testgevallen die de standaard unit tests hadden gemist. Deze inputs waren in staat om mutants te doden die de traditionele testsuites niet konden detecteren. Dit suggereert dat de data die al door beveiligingsteams wordt gegenereerd, hergebruikt kan worden om reguliere testsuites te versterken, waardoor een bijproduct van beveiligingstesten wordt omgezet in een bron voor algemene softwarekwaliteit. De studie analyseerde ook hoe lang het duurde om de moeilijkst te detecteren fouten te vinden, en stelde vast dat hoewel de meeste snel werden gevonden, een enkel geval aanzienlijk meer tijd vereiste en een patroon vertoonde waarbij de moeilijkheidsgraad sterk varieerde, vergelijkbaar met hoe sommige taken iets langer duren terwijl andere een zeer lange tijd in beslag nemen.
De onderzoekers concludeerden dat differential fuzzing een praktische, taal-onafhankelijke manier biedt om de classificatie van deze moeilijke fouten te ondersteunen. Het vereist geen complexe nieuwe tools of taal-specifieke setups, aangezien het simpelweg de originele code vergelijkt met de gewijzigde versie. Door de overlevende fouten te behandelen als kandidaten voor handmatige beoordeling in plaats van te proberen elke enkele te classificeren, vermindert de methode de menselijke inspanning die nodig is drastisch. De studie suggereert dat deze aanpak geïntegreerd kan worden in bestaande workflows om de fouten die werkelijk equivalent zijn efficiënt te filteren, zodat menselijke experts zich alleen kunnen richten op het kleine aantal gevallen die onzeker blijven. Deze bevinding geeft aan dat een eenvoudige, geautomatiseerde vergelijking van programmeergedrag een probleem kan oplossen dat lang als te kostbaar en tijdrovend werd beschouwd voor brede industriële adoptie.
Verdrinkt u in papers in uw vakgebied?
Ontvang dagelijkse digests van de nieuwste papers die bij uw onderzoekswoorden passen — met technische samenvattingen, in uw taal.