Schreiben Bug-Free C-Code verstehen, warum Bugs Exist


Warum Bugs vorhanden sind und wo im Entwicklungszyklus haben sie einschleichen? Viel Zeit und Mühe auf das Problem der zu verstehen, warum Bugs existieren ist der erste Schritt fehlerfreien Code zu schreiben. Der zweite Schritt ist Politik Aktion und Institut zu ergreifen, um das Problem oder helfen erkennen, das Problem zu beseitigen. Am wichtigsten ist, stellen Sie sicher, dass die gesamte Programmierung Personal kennt und versteht die neuen Richtlinien.

Der erste Schritt fehlerfreien Code in schriftlicher Form zu verstehen, warum Fehler existieren. Der zweite Schritt ist, Maßnahmen zu ergreifen.

Dies ist ein extremes Beispiel, aber es zeigt, dass bei einem Projekt alle Beteiligten völlig neue Programmiermethoden in der Mitte eines Programmierprojekt eingeleitet verstehen müssen.

1.1 Klein im Vergleich zu Großprojekten

Was passiert, wenn Sie einen Hex-Dump-Dienstprogramm schreiben benötigt genannt DUMP werden? Das Programm nimmt als Argument auf den Befehl, um den Namen der Datei Zeile, die Sie wollen in hex angezeigt werden soll. Wäre es ohne einen einzigen Fehler geschrieben werden? Ja, wahrscheinlich so, aber warum? Da die Aufgabe klein ist, gut definiert und isoliert.

Also, was passiert, wenn Sie gefragt werden, auf Projekt ALPHA zu arbeiten, eine Auftragsprogrammierung Projekt Ihr Unternehmen für ein anderes Unternehmen arbeitet an? Das Projekt ist mehrere hunderttausend Zeilen lang und hat zehn Programmierer bereits an dem Projekt arbeiten. Die Fristen nähern und das Unternehmen braucht Ihre Programmierung Talent. Glauben Sie, dass Sie sich in und schreiben neue Code ohne Einführung von Bugs in das Projekt springen könnte? Ich konnte es nicht, zumindest nicht ohne die richtigen Programmiermethoden anstelle der Programmierfehler jeder Anfänger auf dem Projekt fangen gebunden ist, zu machen.

Denken Sie an das größte Projekt, das Sie gearbeitet haben. Wie viele Include-Dateien gab es und was haben die Include-Dateien enthalten? Wie viele Quelldateien waren und was haben sie enthalten? Sie hatte kein Problem auf der Kippe Dienstprogramm arbeiten, so was macht das große Projekt zu arbeiten, so schwierig? Warum ist das große Projekt nicht einfach wie die Arbeit auf zehn oder hundert kleine Projekte?

Programmierverfahren muss es einfach für neue Programmierer in ein Projekt zu springen, ohne eine ganze Reihe von neuen Bugs einzuführen.

Sie haben zu viele Informationen in den Include-Dateien zu verwalten und jetzt das Projekt hinter bekommt, so dass Sie mehr Leute in das Projekt, um es schneller abgeschlossen. Diese Verbindungen nur das Problem, weil Sie jetzt noch mehr Menschen an den Pool von Informationen Hinzufügen von Informationen haben, dass alle anderen lernen muss und wissen. Es ist ein Teufelskreis, der alle zu viele Projekte in den Herbst.

1.2 Zu viele Datenstrukturen in Include-Dateien

Wir können alle einig, dass ein großes Problem in großen Projekten ist, dass es zu viel Information ist mit vertraut zu werden in einer kurzen Zeit. Wenn Sie irgendwie einen Teil der Informationen beseitigen könnte, würde dies es einfacher machen, da gäbe es weniger Informationen sein, um sich mit.

Eine Technik, die Strukturen Daten hilft bei der Beseitigung von Dateien enthalten muss gefunden werden.

Die Klasse Methodik §4 diese Datenstruktur Problem löst.

1.3 Einsatz von Techniken, die nicht maßstabs Sie

Wie Sie gerade gesehen haben, haben große Projekte Probleme alle ihre eigenen. Aus diesem Grunde müssen Sie bei der Auswahl von Programmiermethoden vorsichtig sein, die gut in kleinen Projekten arbeiten sowie in großen Programmierprojekten. Mit anderen Worten muss ein Programmiermethodik skalieren oder mit jeder Projektgröße arbeiten.

Programmierverfahren müssen ebenso gut für kleine und große Projekte.

Stellen Sie sicher, dass die Programmierung Methoden, die Sie zur Arbeit genauso gut für kleine und große Projekte entwickeln.

1.4 Zu viel Global Information

Globale Variablen (Variablen bekannt für mehr als eine Quelldatei) sollte vermieden werden. Ihre Verwendung skaliert nicht gut für große Anwendungen. Man denke nur, was schließlich in einer großen Anwendung geschieht, wenn die Anzahl der globalen Variablen größer und größer wird. Bevor Sie es kennen, gibt es so viele von ihnen, dass die Variablen nicht mehr meistern.

Jedes Mal, wenn Sie dabei sind, eine globale Variable zu verwenden, fragen Sie sich, warum Sie direkten Zugriff auf die Variable benötigen. Würde eine Funktion in dem Modul aufrufen, wo der Variable funktioniert genauso gut definiert ist? ja die meiste Zeit ist die Antwort. Wenn die globale Variable geändert wird (gelesen und geschrieben), dann sollten Sie sich fragen, wie die globale Variable eingewirkt wird, und wenn es besser sein, zu bestimmen, was durch einen Funktionsaufruf zu tun, die, wie man die Funktion zu verlassen.

Variablen auf mehr als eine Quelldatei bekannt, sollten vermieden werden.

Einige globalen Variablen sind in Ordnung, aber meine Erfahrung ist, dass nur eine Handvoll jemals benötigt werden, ganz gleich, wie groß ein Projekt erhält.

1.5 Unter Berufung auf Debuggers

Debuggers sind großartige Werkzeuge, aber sie sind kein Ersatz für gute Programmiermethoden, die in erster Linie zu beseitigen Bugs helfen.

Debuggers macht sicherlich Fehler leichter, aber zu welchem ​​Preis zu finden? Hat wohl wissend, dass es dort einen leistungsfähigen Debugger ist es, Ihnen zu helfen, wenn Sie in Schwierigkeiten führen, dass Sie Code schneller zu entwerfen und schreiben und testen Sie es früher, als Sie haben sollte, einen Fehler verursachen, dass Sie den Debugger verwenden zwingt? Ein Fehler, der nicht da sein würde, wenn Sie die Zeit, in der Gestaltung und Codierung Phasen des Projektes ausgegeben.

Ich persönlich finde, dass Programmierer, deren erste Maßnahme gegen einen Bug ist ein Debugger zu verwenden, beginnen mehr und mehr auf einem Debugger im Laufe der Zeit zu verlassen. Programmierer, die einen Debugger verwenden nur, wenn alle anderen Optionen ausgeübt wurden, beginnen immer weniger auf einem Debugger im Laufe der Zeit zu verlassen.

Statt einem Debuggers, schaut, warum nicht auf dem Code und einen schnellen Code-Review tun, verfügbare Beweise aus dem Programmabsturz oder Fehlern? Oft plus die Beweise Blick auf dem Code lokalisiert das Problem schneller als die Zeit es braucht, um das Programm in dem Debugger zu starten.

Verwenden Sie einen Debugger nur als letztes Mittel. Mit an einen Debugger greifen bedeutet, dass Ihre Programmiermethoden versagt haben.

Inzwischen sind Sie wahrscheinlich fragen, wie oft ich den Debugger in meiner Programmierumgebung verwenden. Wegen all der Programmierung Methoden, die ich in meiner Tasche von Techniken haben, nicht sehr oft.

Ihr Ziel sollte sein, Programmiertechniken zu entwickeln und zu nutzen, die für Sie Ihre Fehler zu fangen. Nicht auf einem Debugger verlassen Ihre Fehler zu fangen.

1.6 Befestigung des Symptom und nicht das Problem

Angenommen, Sie haben in Ihrem Code ein Fehler auftreten. Wie gehen Sie über das Problem zu lösen? Bevor Sie antworten, was ist das Problem? Ist das Problem der Fehler selbst, oder ist es, was der Fehler verursacht auftreten?

Allzu oft wird der Bug oder Symptom fest ist und nicht das eigentliche Problem, das den Fehler in erster Linie verursacht. Ein einfacher Test ist, zu denken, wie oft man im wesentlichen den gleichen Fehler aufgetreten ist. Wenn nicht, dann groß, sind Befestigungs Sie schon das Problem und nicht das Symptom. Andernfalls gibt einige reifliche Überlegung zu dem, was Sie befestigen. Sie wollen wahrscheinlich mit einem neuen Programmiermethode zu entwickeln, die das Problem ein für alle Mal zu beheben hilft.

Wenn ein Fehler behebt, behebt das zugrunde liegende Problem oder die Ursache des Fehlers und nicht nur den Fehler selbst.

Ein herausragendes Beispiel ist Speicherlecks. Ein Speicherleck wird als Speicherobjekt definiert die zugewiesen, aber nie von Ihrem Programm befreit. In den meisten Fällen ist das Speicherleck nicht direkt zu Problemen führen, aber was ist, wenn es auf ein Objekt geschieht, das und zugeordnet wird (nicht) befreite viel? Sie führen zu einem bestimmten Zeitpunkt aus dem Speicher.

Running Out of Memory ist das, was verursacht sie das Problem der Suche zu beginnen. Sie finden schließlich die fehlende Codezeile, die das Speicherobjekt hat ausgeplant sollte und die Speicherfreigabe in das Programm hinzufügen. Fehler behoben, nicht wahr?

Falsch! Das zugrunde liegende Problem der Speicherlecks unentdeckt gehen ist immer noch im Programm. In der Tat hatte den Heap-Manager Ihnen gesagt, wo es ein Speicherleck in Ihrem Programm war, würden Sie nicht Ihre Zeit, um das Speicherleck aufzuspüren verschwendet haben. Um das Problem zu beheben einmal und für alle, muss der Heap-Manager Ihnen sagen, dass es ein Speicherleck. Diese Programmiermethodik wird in Kapitel 5 diskutiert.

1.7 wartbaren-Code

Wir alle die Erfahrung des modifizierenden Code gehabt haben, dass jemand anderes geschrieben hat, entweder eine neue Funktion hinzuzufügen, oder ein Problem in einem Modul zu beheben. Ich weiß nicht, über Sie, aber für mich ist es in der Regel nicht zu einem angenehmen Erlebnis, da der Code oft so schwer zu verstehen, dass ich die meisten meiner Zeit am Ende Ausgaben nur herauszufinden, was los ist.

Strive Code zu schreiben, die von anderen Programmierern verständlich ist.

Guter Code ausgeführt wird. Großer Code ausgeführt und ist auch leicht wartbar. In Ihrem Code-Reviews, sollten Sie für Code suchen, die nicht nur funktionieren, sondern auch für Code, der in einfach ist, wie es funktioniert. Was nützt eine Codierungstechnik, wenn es nicht verstanden werden kann? Folgendes berücksichtigen.


Ist das Codefragment schwer für Sie zu verstehen? Wenn nicht, dann wissen Sie, die Technik verwendet wird. Wenn Sie nicht die Technik kennen, dann ist es sicher frustrierend, um herauszufinden. Dieser Code ist eine Möglichkeit, die ceil Funktion auf dem nTotal / nX Wert zu implementieren.

1.8 verwendet, nicht den Windows-Debug-Kernel

Verwenden Sie den Debug-Kernel Ihrer Entwicklungsumgebung.

Das Windows SDK bietet D2N.BAT (debug zu nicht-debug) und N2D.BAT (non-debug zu debuggen) Batch-Dateien im Verzeichnis IST zwischen Debug- und Nicht-Debug-Fenstern zu wechseln. Es ist leicht versehentlich Ihre Windows-Version in dem nicht-Debug-Modus zu verlassen. Es ist mir ein paar Mal passiert ist. Um diese Situation zu erkennen, ich gedruckt schließlich ein spezielles Symbol in meiner Anwendung Statuszeile, um anzuzeigen, dass es unter Debug-Windows ausgeführt wird. Ich schlage vor, dass Sie etwas ähnliches in einem Ort zu tun, das einfach in Ihrer Windows-Anwendung zu erkennen. Um festzustellen, ob Sie unter Debug-Windows ausgeführt wird, verwenden Sie die GetSystemMetrics (SM_DEBUG) -Aufruf. Es gibt Null unter Einzelhandel Fenster und einen Nicht-Null-Wert unter Debug Sie Windows.

In Verbindung stehende Artikel