Korrekturhinweise (Stand: 2024-04-19)

Jede Datei (C-Datei oder Makefile) gilt als eigenes Modul. Punkte werden in dem Modul abgezogen, wo laut Aufgabenstellung die Funktionalität zu erwarten ist. Jedes Modul wird mit mindestens Null Punkten bewertet. Die maximalen Punkte pro Modul stehen in der Aufgabenstellung. Falls nicht weiter spezifiziert wird für jedes Auftreten eines Fehlers die genannten Punkte abgezogen, auch mehrfach für denselben Fehler an unterschiedlichen Stellen im Programm.

Makefile

Fehlerbild Punktabzug Anmerkung
.PHONY fehlt oder unvollständig 0,5 Ausnahme: halde, dort optional da noch nicht eingeführt
all (oder Entsprechung) ist nicht erstes Target 0,5 Ausnahme: halde, dort optional da noch nicht eingeführt
Abhängigkeit(en) fehlen 0,5 pro Target
Auf der Webseite geforderte Compilerflags fehlen 0,5 pro Compileraufruf
CFLAGS oder CC werden nicht genutzt, obwohl in der Aufgabenstellung gefordert 0,5 pro Variable

Übersetzerfehler

Fehlerbild Punktabzug
Auslöser eines Übersetzerfehlers 3

Falsche oder unzureichende Fehlerbehandlung

Nötige Fehlerbehandlung Punktabzug
Prüfen auf Fehler 0,5
falls errno zur Fehlerprüfung genutzt wird, obwohl laut Man-Page nicht vorgesehen 0,5
Ausgabe des Fehlergrunds mit perror(3) (Funktion setzt errno) oder fprintf(3) (sonst) (*);
  keine Fehlerausgabe bei selbst geschriebenen Bibliotheksfunktionen (z.B. der halde)!
0,5
Behandlung des Fehlers: exit(3) oder return (**);
  kein exit bei selbst geschriebenen Bibliotheksfunktionen!
0,5

Insgesamt wird für eine normale Fehlerbehandlung (Ausnahmen siehe unten) maximal 1 Punkt abgezogen, dies gilt auch wenn die Fehlerbehandlung komplett fehlt.

Falls die Fehlerbehandlung das Programm beendet, müssen keine Ressourcen (angeforderter Speicher, offene Dateien, etc.) freigegeben werden.

Ausnahmen und Ergänzungen

Fehlerbild Punktabzug Anmerkung
Fehlerbehandlung zu malloc(3) fehlt 0,5 pro Abgabe maximal -3
Fehlerausgabe auf stdout 0,5 einmalig pro Abgabe

Der maximale Punktabzug pro Funktion ergibt sich aus der Summe der hier aufgezählten möglichen Fehler. Dieser wird auch verwendet, wenn die Fehlerbehandlung komplett fehlt.

Fehlerbehandlung bei Ein-/Ausgabe

Fehlerbehandlung ist für alle Funktionen nötig, die Ein-/Ausgabe durchführen die zur Grundfunktionalität des Programms gehören (geht aus der Aufgabe hervor). Das beinhaltet beispielsweise printf(3), fclose(3) oder close(2). Ausgenommen davon sind dabei die Fehlermeldungen selbst sowie unwichtige Ausgaben.

Damit auch Schreibfehler auf stdout erkannt werden (wichtig falls in eine Datei umgeleitet wird), muss vor Beendigung des Programms stdout mit fflush(3) geflushed werden. Dies ist nur nötig, falls das Programm Ausgaben auf stdout nutzt.

Verbotene Funktionen

Verbotene Funktion Alternative Punktabzug
atoi(3) strtol(3) siehe oben bei strtol(3)

Programmierfehler

Fehlerbild Punktabzug Anmerkung
static fehlt 0,5 pro Abgabe maximal -2
Unnötige globale Variable 0,5 pro Abgabe maximal -1
free(3) fehlt 1 pro Abgabe maximal -3
close(2) oder fclose(3) fehlt 1 pro Abgabe maximal -3
printf(variable), kein Format-String und variable vom Nutzer 1
zu kleiner Puffer 1
Verlust von benötigter Information durch Casten von Datentypen 1
falsche Funktionsparameter 0,5 pro Funktionsaufruf maximal -1
errno wird vor perror(3) überschrieben (z.B. durch Funktionsaufruf) 0,5 pro Abgabe maximal -2
sonstige Programmierfehler 1

Programmierstil (Fehler)

Fehlerbild Punktabzug
Unnötig (deutlich zu) große Puffer 0,5
goto, falls offensichtlich unnötig oder um Schleifen nachzubauen (Sprung nach oben) 1
Ausgabe in Bibliotheksfunktionen (z.B. bei der halde) 0,5
exit(3) in Bibliotheksfunktionen (z.B. bei der halde); abort(3) ist erlaubt wenn es die Angabe vorsieht 1
offensichtlich schlechter Code 1

Programmierstil (Hinweise)

Fehlerbild Verbesserte Lösung
if (var) { free(var); } free(var);
if (ptr == 0) { ... } if (ptr == NULL) { ... }
(*ptr).member ptr->member