Definition

Bug

Was ist ein Bug?

In der Computertechnik ist ein Bug ein Kodierungsfehler in einem Computerprogramm. Und dazu zählt auch Microcode, wie er etwa in einem Prozessor zum Einsatz kommt. Der Prozess des Auffindens von Fehlern - bevor die Benutzer sie finden - wird Debugging genannt. Die Fehlersuche beginnt, nachdem der Code geschrieben wurde, und setzt sich stufenweise fort, wenn der Code mit anderen Programmiereinheiten kombiniert wird, um ein Softwareprodukt zu bilden, beispielsweise ein Betriebssystem oder eine Anwendung.

Bugs werden oft erst nach der Veröffentlichung eines Produkts oder während öffentlicher Betatests entdeckt. In diesem Fall müssen die Benutzer einen Weg finden, die Verwendung des fehlerhaften Codes zu vermeiden oder einen Patch von den Softwareentwicklern zu erhalten.

Ein Bug ist nur eine Art von Problem, das ein Programm haben kann. Programme können fehlerfrei laufen und trotzdem schwer zu benutzen sein oder bei einer wichtigen Funktion versagen. Diese Art von Problemen ist schwieriger zu testen. Ein gut konzipiertes Programm, das in einem gut kontrollierten Prozess entwickelt wurde, weist weniger Fehler pro Tausenden von Codezeilen auf. Aus diesem Grund ist es wichtig, die Benutzerfreundlichkeit in die Tests einzubeziehen.

Die verschiedenen Arten von Bugs

Bugs können für unterschiedliche Fehlfunktionen bei Systemen führen. Hier einige der häufigsten Arten von Fehlern:

  • Arithmetik. Arithmetische Fehler werden manchmal auch als Rechenfehler bezeichnet und sind mathematische Fehler im Code, die dazu führen, dass er nicht funktioniert.
  • Schnittstelle. Ein Schnittstellenfehler tritt auf, wenn inkompatible Systeme an den Computer angeschlossen sind. Das Problem kann von einem Teil der Hardware oder der Software herrühren. Eine Programmierschnittstelle (API) könnte ein Beispiel für einen Schnittstellenfehler sein.
  • Logik. Diese Fehler treten auf, wenn die Logik des Skripts dazu führt, dass das Programm die falschen Informationen ausgibt oder stecken bleibt und keine Ausgabe liefert. Ein Beispiel für einen Logikfehler ist eine Endlosschleife, in der eine Codesequenz kontinuierlich ausgeführt wird.
  • Syntax. Diese Fehler entstehen durch Code, der falsch geschrieben wurde. Verschiedene Programmiersprachen haben unterschiedliche Syntaxen, so dass die Verwendung einer Syntax in einer Sprache einen Fehler in einer anderen verursachen kann.
  • Teamarbeit. Dieser Fehler tritt auf, wenn die Kommunikation zwischen den Programmierern nicht stimmt. Ein Beispiel ist, wenn es Unterschiede zwischen der Produktdokumentation und dem Produkt gibt. Ein anderes Beispiel ist, wenn Kommentare den Programmcode falsch beschreiben.
Fehlertypen können je nach Kontext und Auswirkung auf den Benutzer auf verschiedene Weise kategorisiert werden.
Abbildung 1: Fehlertypen können je nach Kontext und Auswirkung auf den Benutzer auf verschiedene Weise kategorisiert werden.

Eine weitere einfache Möglichkeit, Fehler zu kategorisieren, ist aus der Sicht des Benutzers. Zu diesen Fehlertypen gehören die folgenden:

  • Visuell. Ein Benutzer kann die gewählte Funktion ausführen, aber irgendetwas sieht mit der Anwendung falsch aus. Dies kann ein Problem mit dem responsiven Design der Anwendung sein.
  • Funktional. Ein funktionaler Fehler bedeutet, dass das Programm nicht wie vorgesehen funktioniert. Zum Beispiel klickt ein Benutzer auf die Schaltfläche Speichern, aber die Daten werden nicht gespeichert.

Bugs können auch nach dem Schwierigkeitsgrad klassifiziert werden, den sie für den Benutzer verursachen:

  • Fehler mit geringer Auswirkung haben nur minimale Folgen für die Benutzerfreundlichkeit (UX, User Experience)
  • Starke Beeinträchtigungen beeinflussen einen Teil der Funktionalität, aber die Anwendung ist weiterhin nutzbar.
  • Kritische Fehler beeinträchtigen die Hauptfunktionen der Anwendung.

Ein weiterer Ansatz zur Klassifizierung von Fehlern ist die Betrachtung des Ortes, an dem sie auftreten:

  • Unit-Level-Bugs sind einfache Software-Fehler, die in einer Code-Einheit enthalten sind. Sie sind in der Regel auf Berechnungs- oder Logikfehler zurückzuführen und betreffen einen Teil der Software. Sie sind in der Regel leicht zu beheben.
  • Bei Fehlern auf Systemebene handelt es sich um komplexere Fehler, die durch das Zusammenspiel mehrerer Softwarekomponenten entstehen werden und so Probleme verursachen.
  • Out-of-bound-Bugs entstehen, wenn der Benutzer auf unerwartete Weise mit dem Programm interagiert. Dies geschieht zum Beispiel, wenn ein Benutzer einen Parameter in ein Formularfeld eingibt, für den das Programm nicht ausgelegt ist. Ungebundene Fehler können zum Ausnutzen von Software verwendet werden. Beispielsweise nutzen Bedrohungsakteure die Infra:Halt-Schwachstelle, um Cache-Poisoning-Angriffe auf die Betriebstechnologie des Domain Name Systems (DNS) durchzuführen.

Dem Auftreten von Bugs entgegenwirken

Es gibt mehrere Möglichkeiten, Bugs zu beheben, je nach Art des Fehlers und je nachdem, wo und wann er gefunden wird.

Der Entwicklungsprozess

Der beste Weg, Programmierfehler zu vermeiden, ist die Prävention. Die Verwendung eines soliden Softwareentwicklungsprozesses, wie beispielsweise der Agile- und DevOps-Methodik, kann Fehler verhindern. Die Qualitätsprüfung ist in diese Entwicklungsmethoden integriert.

Eine dieser Entwicklungspraktiken ist die testgestützte Entwicklung. Tests sollten erstellt werden, bevor eine Funktion kodiert wird, um einen Standard zu schaffen, anhand dessen sie kodiert werden kann.

Eine weitere bewährte Methode ist die verhaltensorientierte Entwicklung, bei der die Entwickler dazu angehalten werden, eine Anwendung so zu programmieren und zu dokumentieren, dass die erwartete Interaktion des Benutzers mit der Anwendung berücksichtigt wird.

Softwaretests

Testen ist ein Weg, um Fehler in Software zu entdecken. Die drei gängigen Arten von Softwaretests sind die folgenden:

Beim funktionalen Testen werden die funktionalen Kernbestandteile eines Programms auf Softwarefehler geprüft, bevor die nächste Testphase eingeleitet wird. Dieser Teil des Testprozesses bestätigt, dass alle Teile funktionieren. Funktionstests werden auch als Smoke-Tests bezeichnet.

Beim explorativen Testen werden Techniken eingesetzt, die weniger verbreitete Softwarepfade testen oder solche, die bei einem normalen Funktionstest möglicherweise übersehen werden. Eine Art von explorativem Test ist zum Beispiel ein Abdeckungstest, der überprüft, ob eine Anwendung auf verschiedenen Geräten, Browsern oder Betriebssystemen funktioniert.

Regressionstests dienen dazu, festzustellen, ob frühere Änderungen am Code ein unbeabsichtigtes Problem verursacht haben. Regressionstests bestehen aus den folgenden Arten:

Entwickler können durch frühzeitiges und häufiges Testen verhindern, dass Fehler die Benutzer erreichen. Neben Softwaretests kann auch eine gegenseitige Codeüberprüfung mit anderen Entwicklern, einem leitenden Entwickler oder einem Qualitätssicherungsteam (QS) nützlich sein.

Benchmarking

Durch Benchmarking oder Benchmark-Tests werden die grundlegenden Leistungserwartungen für Software unter verschiedenen Arten von Arbeitslasten ermittelt. Benchmark-Tests können die Stabilität, Reaktionsfähigkeit, Geschwindigkeit und Effektivität von Software bewerten.

Fehler, die unter einer Reihe von Bedingungen schlummern, können unter anderen Bedingungen ein ernsthaftes Problem verursachen. Benchmark-Tests können helfen, solche Fehler zu identifizieren. Einige Arten des Benchmarking sind die folgenden:

  • Beim Last-Benchmarking werden Softwaresysteme unter einer bestimmten Last bewertet, die oft dem üblichen Verkehrsaufkommen entspricht, das für eine Anwendung erwartet wird.
  • Beim Spike-Benchmarking wird die Leistung von Software bei einem plötzlichen Anstieg der Arbeitslast bewertet.
  • Beim Breakpoint-Benchmarking wird eine Software getestet, um zu sehen, wie viel Stress sie aushalten kann, bevor sie abstürzt.

Wie sich Bugs und Fehler beheben lassen

Debugging

Wenn ein Fehler in einer Software gefunden wird, muss er behoben werden. Die Fehlersuche umfasst die folgenden drei Schritte:

  • Isolierung des Fehlers
  • Bestimmung der Grundursache
  • Behebung des Problems

Für die Programmierer, die einen Code geschrieben haben, kann es schwierig sein, ihre Schritte zurückzuverfolgen und sich durch komplexe und dichte Codezeilen zu arbeiten. Ein Bug-Bounty-Programm ist eine Möglichkeit, die Fehlersuche durch die Allgemeinheit durchführen zu lassen. Beim Crowdsourcing werden Software-Sicherheitsforscher und ethische Hacker für das Auffinden von Problemen und das Bereitstellen von Fehlerberichten, die die Schwachstelle reproduzieren oder entschärfen, belohnt.

Kontinuierliche Verbesserung

Unternehmen, die Softwarefehler minimieren wollen, sollten die Anzahl der Rollouts und Rollbacks von Software-Releases ausbalancieren, die sie durchführen. Auf diese Weise stellen sie sicher, dass der Fehlerbehebungsprozess einem konsistenten Zeitplan für die Softwarefreigabe nicht im Wege steht. Dies ist im Allgemeinen das, was Unternehmen tun, die in einer agilen Entwicklungsumgebung arbeiten.

Dennoch schaffen es immer einige Fehler in das freigegebene Produkt. Entwicklungsteams können eine Veröffentlichung als Teil des Debugging-Prozesses betrachten, Feedback dazu einholen, schnell scheitern und Verbesserungen vornehmen.

Fehler werden am besten in der Produktion gestoppt, bevor sie die Chance haben, den Endbenutzer zu erreichen. Dies kann durch solide Prozesse erreicht werden.
Abbildung 2: Fehler werden am besten in der Produktion gestoppt, bevor sie die Chance haben, den Endbenutzer zu erreichen. Dies kann durch solide Prozesse erreicht werden.

Ein Team oder eine Person im Team kann jeden Tag eine feste Zeit für die Behebung von Softwarefehlern einplanen. Auf diese Weise werden das Sammeln von Daten zu Fehlern und der Fehlerbehebungsprozess selbst Teil des Tagesplans. Anhand der Daten über den Fehlerbehebungsprozess kann ein Team abschätzen, wie lange eine bestimmte Fehlerbehebung dauern wird, und seine Bemühungen entsprechend organisieren.

Es ist unmöglich, alle Fehler auf einmal zu beheben, und es braucht Zeit, um die Daten zu sammeln, die für eine genaue Fehlerschätzung erforderlich sind. Programmierer unterscheiden sich in ihren Fähigkeiten und Fertigkeiten. Und die Schätzungen für Fehlerbehebungen können auch zwischen Programmierern, die in verschiedenen Ländern arbeiten, variieren. Mit der Zeit kann ein Team Richtwerte dafür entwickeln, wie viele Bugs es in einem Monat beheben kann.

Die Fehlersuche ist nie perfekt oder vollständig. Es tauchen immer wieder neue Fehler auf. Entwicklungsteams sollten bestrebt sein, Fehler effizient zu beheben und den Beteiligten mit jeder Softwareversion eine Verbesserung zu liefern.

Die Geschichte des Bugs

Warum heißt der Bug eigentlich Bug? Das Wort Bug stammt ursprünglich aus der Technik. Die Verwendung des Begriffs in der Informatik wird der Programmierpionierin Grace Hopper zugeschrieben. Im Jahr 1944 war Hopper eine junge Offizierin der Marinereserve, die in Harvard am Mark-I-Computer arbeitete. Später beschrieb Hopper einen Vorfall, bei dem ein Techniker einen echten Käfer - tatsächlich eine Motte - zwischen zwei elektrischen Relais in einem Mark-II-Computer hervorgezogen haben soll. Die Marine hatte die Motte viele Jahre lang ausgestellt. Inzwischen soll sie sich in den Beständen der Smithsonian Institution befinden.

Diese Definition wurde zuletzt im November 2024 aktualisiert

Erfahren Sie mehr über Anwendungs- und Plattformsicherheit