Korrekturhinweise
(Stand: 2025-04-03)
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. Tritt derselbe Fehler mehr
als zweimal auf, so gibt es ab dem dritten Auftreten keinen
Punktabzug mehr und er wird als Folgefehler gewertet.
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 |
|
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.
-
strtol(3)
:
Nötige Fehlerbehandlung |
Punktabzug |
errno passend setzen sowie nach Aufruf prüfen |
0,5 |
endptr prüfen (Eingabe nicht leer und wurde vollständig gelesen) |
0,5 |
Ausgabe und Behandlung wie oben (*) und (**) |
1 |
-
fgets(3)
:
Nötige Fehlerbehandlung |
Punktabzug |
Rückgabewert prüfen |
0,5 |
Mit feof(3) bzw. ferror(3) auf Fehler prüfen |
0,5 |
Ausgabe und Behandlung wie oben (*) und (**) |
1 |
-
fgetc(3)
:
Nötige Fehlerbehandlung |
Punktabzug |
Rückgabewerte EOF und 0xFF können unterschieden werden |
1 |
Prüfen des Rückgabewerts auf EOF |
0,5 |
Mit feof(3) bzw. ferror(3) auf Fehler prüfen |
0,5 |
Ausgabe und Behandlung wie oben (*) und (**) |
1 |
-
sysconf(3)
:
Nötige Fehlerbehandlung |
Punktabzug |
Rückgabewert prüfen |
0,5 |
Falls die angeforderte Information ein (Min-/Max-)Limit ist, passend errno setzen und prüfen |
0,5 |
Ausgabe und Behandlung wie oben (*) und (**) |
1 |
-
readdir(3)
:
Nötige Fehlerbehandlung |
Punktabzug |
Rückgabewert prüfen |
0,5 |
errno passend vor jedem Aufruf setzen sowie nach Aufruf im Fehlerfall prüfen |
0,5 |
Ausgabe und Behandlung wie oben (*) und (**) |
1 |
-
getcwd(3)
:
Nötige Fehlerbehandlung |
Punktabzug |
Rückgabewert prüfen |
0,5 |
errno im Fehlerfall prüfen |
0,5 |
Falls errno gleich ERANGE , ohne Abbruch Fehlergrund beseitigen und erneut aufrufen |
1 |
Ausgabe und Behandlung bei Fehler wie oben (*) und (**) |
1 |
-
getaddrinfo(3)
:
Nötige Fehlerbehandlung |
Punktabzug |
Rückgabewert prüfen |
0,5 |
Ausgabe des Fehlergrunds mit perror(3) (bei Rückgabe von EAI_SYSTEM ) oder gai_strerror(3) (sonst) |
1 |
Behandlung bei Fehler wie oben (**) |
0,5 |
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. Falls sich das Programm bei einem Schreibfehler sowieso mit einem
Fehlercode beenden würde (bspw. SIGPIPE
) so ist keine
Fehlerbehandlung nötig.
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 |
static fehlt |
0,5 |
Unnötige globale Variable |
0,5 |
free(3) fehlt |
1 |
close(2) oder fclose(3) fehlt |
1 |
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 |
errno wird vor perror(3) überschrieben (z.B. durch Funktionsaufruf) |
0,5 |
sonstige Programmierfehler (Folgefehler nur für dieselben 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 (von Folgefehlern ausgenommen) |
1 |
Programmierstil (Hinweise)
Fehlerbild |
Verbesserte Lösung |
if (var) { free(var); } |
free(var); |
if (ptr == 0) { ... } |
if (ptr == NULL) { ... } |
(*ptr).member |
ptr->member |