|
| 1 | +# Codebeispiel "AllesFalsch" – Bugs und überarbeitete Lösung |
| 2 | + |
| 3 | +Dieser Ordner begleitet den Abschnitt *Qualitätsmängel erkennen* aus [01_Software.md](../../01_Software.md). |
| 4 | + |
| 5 | +Die Lösung hat Nico Seidler (SoSe 2026) beigesteuert. Die überarbeitete Version korrigiert die beiden echten Bugs der Ursprungsfassung, beseitigt einige Qualitätsmängel (z. B. fehlende Fehlerprüfungen, ungenutzte Header) und verbessert die Wartbarkeit durch bessere Strukturierung und sprechende Bezeichner. Dennoch bleiben einige Schwächen (z. B. algorithmische Komplexität, Endlosschleife bei Fehleingaben) bestehen, um Diskussionsanlässe zu bieten. |
| 6 | + |
| 7 | +| Datei | Inhalt | |
| 8 | +| ---------------------------- | ---------------------------------------------------------------------- | |
| 9 | +| [withBugs.c](withBugs.c) | Ursprungsfassung mit zahlreichen Qualitätsmängeln und zwei echten Bugs | |
| 10 | +| [improved.c](improved.c) | Überarbeitete Lösung (studentischer Beitrag, SoSe 2026) | |
| 11 | +| [numbers.txt](numbers.txt) | Beispiel-Eingabedatei | |
| 12 | + |
| 13 | +## Übersetzen und Ausführen |
| 14 | + |
| 15 | +```bash |
| 16 | +gcc -Wall -Wextra -O2 improved.c -o improved |
| 17 | +./improved |
| 18 | +# Eingabe des Pfads, z. B.: numbers.txt |
| 19 | +``` |
| 20 | + |
| 21 | +## Stärken der überarbeiteten Lösung |
| 22 | + |
| 23 | +Die Lösung adressiert systematisch die in der ISO-25010-Tabelle aufgelisteten Qualitätsmerkmale: |
| 24 | + |
| 25 | +- **Funktionale Eignung** — Beide Bugs des Originals sind korrigiert: |
| 26 | + - äußere Sortierschleife startet bei `i = 0` (vorher fälschlich `i = 2` → Element 0 und 1 wurden nicht einbezogen), |
| 27 | + - innere Schleife läuft bis `j < n - i - 1` (vorher `j = l` → Zugriff hinter das Array-Ende). |
| 28 | +- **Zuverlässigkeit** — `fopen` wird auf `NULL` geprüft, `fclose` und `free` werden konsequent aufgerufen, auch auf den Fehlerpfaden (z. B. `realloc`-Fail). |
| 29 | +- **Leistungseffizienz (partiell)** — Sortierung *in-place* über Zeigerübergabe, keine Array-Kopie. |
| 30 | +- **Wartbarkeit** — BubbleSort ist in eine eigene Funktion mit Doxygen-Kopf ausgelagert; sprechende Bezeichner (`pfad`, `daten`, `kapazitaet`, `anzahl`). |
| 31 | +- **Sicherheit** — `scanf("%255s", …)` mit expliziter Längenbegrenzung → kein Buffer Overflow beim Einlesen des Pfads. |
| 32 | +- **Flexibilität** — Dateipfad wird zur Laufzeit abgefragt, Datenarray wächst dynamisch über `realloc`. |
| 33 | +- **Robuster `realloc`-Umgang** — Rückgabewert wird in einem Zwischenpointer (`optimiert`) aufgefangen, damit `daten` bei Allokationsfehler nicht verloren geht. |
| 34 | + |
| 35 | +## Offene Punkte / Diskussionsanlässe |
| 36 | + |
| 37 | +Nicht alle Schwächen des Originals sind vollständig behoben. Die folgenden Punkte eignen sich gut für die Plenumsdiskussion: |
| 38 | + |
| 39 | +1. **Endlosschleife bei wiederholter Fehleingabe** |
| 40 | + Die `while (datei == NULL)`-Schleife besitzt kein Abbruchkriterium. Bei permanent falschen Eingaben läuft das Programm unbegrenzt. |
| 41 | + *Verbesserung:* Maximale Anzahl Versuche oder Abbruch bei `EOF`. |
| 42 | + |
| 43 | +2. **Algorithmische Komplexität weiterhin O(n²)** |
| 44 | + Der Mangel "quadratischer Aufwand der Sortierung" aus der Qualitätstabelle wird nicht behoben. |
| 45 | + *Verbesserung:* `swapped`-Flag für Early-Exit bei sortierten Eingaben, oder Verwendung von `qsort` aus `<stdlib.h>`. |
| 46 | + |
| 47 | +3. **Magic Numbers** |
| 48 | + Die Werte `256` (Pfadlänge) und `10` (Startkapazität) stehen im Code ohne Benennung. |
| 49 | + *Verbesserung:* `#define` bzw. `PATH_MAX` aus `<limits.h>`. |
| 50 | + |
| 51 | +4. **Keine Validierung der Datei-Inhalte** |
| 52 | + `fscanf` bricht beim ersten Nicht-Integer still ab; nachfolgende gültige Zahlen werden ignoriert, ohne Warnung. |
| 53 | + *Verbesserung:* Ursache des Abbruchs prüfen (`feof` vs. Parse-Fehler) und melden. |
| 54 | + |
| 55 | +5. **Sonderfall leere Datei** |
| 56 | + Bei `anzahl == 0` wird trotzdem "Sortierte Ergebnisse:" ausgegeben. |
| 57 | + *Verbesserung:* explizite Meldung "Keine Daten eingelesen". |
| 58 | + |
| 59 | +6. **Pfade mit Leerzeichen** |
| 60 | + `scanf("%255s", …)` liest nur bis zum ersten Whitespace. |
| 61 | + *Verbesserung:* `fgets` + Newline-Trimming. |
| 62 | + |
| 63 | +## Bezug zur Vorlesung |
| 64 | + |
| 65 | +Die Lösung zeigt exemplarisch, dass *Bug-Fix* und *Qualitätsverbesserung* zwei unterschiedliche Dimensionen sind: Die funktionalen Fehler sind behoben, einige nicht-funktionale Mängel (insbesondere Leistungseffizienz und vollständige Eingabevalidierung) bleiben jedoch bestehen. Genau diese Trennung ist ein zentrales Motiv des Abschnitts. |
0 commit comments