Systemprogrammierung 1
Meine Übungen:
- Meine Tafelübung: T04, Dienstags 14:15 bis 15:45 im Aquarium
- Meine Rechnerübung: R10, Dienstags 16:15 bis 17:45 im CIP1
Abgabecheckliste
- Angabe gelesen
- Hinweise gelesen
- Makefile
- …hat Pseudotargets
all
undclean
- …kann mit
-r
,-R
und-B
gebaut werden - …benutzt die
CC
undCFLAGS
Makros
- …hat Pseudotargets
- Korrekturhinweise gelesen
- Abgabe kompiliert und ist getestet
- Vorgeschriebene Compiler-Flags:
-std=c11
-pedantic
-Wall
-Werror
-D_XOPEN_SOURCE=700
- Hilfreiche Compiler-Flags:
-Wconversion
-Wuninitialized
- Vorgeschriebene Compiler-Flags:
- vor Abgabgefrist mit
git push
abgegeben
Tipps
Die Programme für den Übungsbetrieb liegen im CIP unter /proj/i4sp1/bin/
. Dort findet ihr unter anderem das get-deadline
Skript, das euch das nächste Abgabedatum sagt.
Als Editor empfehle ich für den Anfang micro, ihr seid in SP aber nicht an einen Editor/eine IDE gebunden. Nehmt das womit ihr am besten klar kommt. Eine Liste mit den voreingestellten Tastenbelegungen von micro
findet ihr hier.
Fehler frühzeitig finden
Es kann sehr schwer sein Fehler in C frühzeitig zu erkennen. Über die Jahre wurden jedoch einige Werkzeuge entwickelt, die euch das Leben etwas leichter machen.
Valgrind analysiert zur Laufzeit die Anwendung auf fehlerhafte Speicherzugriffe und Memory-Leaks. Beim kompilieren/linken ist nichts weiter zu beachten. Es kann jedoch hilfreich sein mit Debuginformationen (
-g
) zu übersetzen.# Empfohlene Flags:
Der Undefined Behavior Sanitizer kann zur Laufzeit Undefined Behavior im Programm erkennen. Undefiniertes Verhalten ist eine häufige Fehlerquelle da, wie der Name nahelegt, nicht definiert ist was der Compiler mit dem Code anstellt. Code der beim ersten Mal (scheinbar) funktioniert hat kann dadurch zu einem beliebigen Zeitpunkt an einer beliebigen Stelle Bugs hervorrufen. Beispiele sind Array-Zugriffe mit ungültigem Index, Nullpointer-Dereferencierung und Überläufe von Ganzzahlen mit Vorzeichen.
Der UBSan wird beim kompilieren durch den Compiler eingefügt:
# beim kompilieren: # beim linken:
In einem
Makefile
kann die Flag auch unterCFLAGS
übergeben werden.
In jedem Fall gilt zu beachten: Das Referenzsystem ist der CIP mit seinem Compiler und Tools. Eure Abgabe muss dort übersetzbar und ausführbar sein.
Weitere hilfreiche Tools
- micro: Guter Editor für das Terminal. Er ist gut für Einsteiger geeignet und erfordert kaum Vorkenntnisse. Eine Liste mit den voreingestellten Tastenbelegungen findet ihr hier.
- GDB: Der GNU Debugger ist hilfreich um sich die Ausführung des Codes im Detail anzuschauen.
- Hier gibt es eine sehr gute Einführung von Philip.
- Mit dem Befehl
layout src
wird einem auch der Quellcode angezeigt.
- fman ist ein kleines Skript um Manpages mittels fzf durchsuchen zu können. Das Skript kann zum Beispiel als
~/.local/bin/fman
abgelegt werden. Gegebenenfalls müsst ihr den Pfad noch zu eurer.bashrc
hinzufügen:
Dann könnt ihr das Skript einfach als Befehl in der Konsole verwenden:# ~/.bashrc PATH=" : /.local/bin/"
Übungen
- Übung 1: Dynamische Speicherverwaltung
- Übung 2: Fehlerbehandlung, generisches Sortieren
- Übung 3: Speicherlayout, UNIX-Prozesse
- Besprechung 1+: Besprechung Aufgabe 1 + 2 (lilo + wsort)
- Übung 4: POSIX-Threads, Koordinierung mit Semaphoren
- Besprechung 3: Besprechung Aufgabe 3 (clash)
- Übung 5: Zeigerarithmetik, Untypisierter und typisierter Speicher, make(1)
- Besprechung 4: Besprechung Aufgabe 4 (mach)
- Übung 6: Dateisystem, Dateiattribute, Dateisystem-API
- Bexprechung 5: Besprechung Aufgabe 5 (halde)