UNIXwork

Tags

c unix dav shell linux xattr solaris links x11 java rant fun webdav sync gnome apple benchmark network ldap oracle wtf analytics xnedit macos windows graalvm bsd curl mac apache virtualbox rhel zfs sparc tomcat microsoft freebsd arm

WTF C Teil 4

02. Dezember 2025

Aus der beliebten Serie WTF C:

#include <stdio.h>

int main(void)
{
    https://susam.net/
    printf("hello, world\n");
    return 0;
}

Gefunden habe ich das Beispiel hier.

Was passiert hier? Nun, https: ist ein Label und // danach ist nur ein Kommentar. Sieht trotzdem erstmal merkwürdig aus (vermutlich weniger merkwürdig, wenn man Syntax Highlighting hat).

Kleine Lib für Extended Attributes

29. November 2024

Wer eine plattformunabhängige Lösung für den Zugriff auf Extended Attributes benötigt, für den habe ich hier eine kleine "Bibliothek", bestehend aus einer .c und einer .h Datei. Lizenz ist 0BSD, daher kann jeder den Code verwenden wie er will.

Aktuell werden Linux, FreeBSD, Solaris und macOS unterstützt. Eine Implementierung, die unter Windows Alternate Data Streams verwendet, kommt vermutlich noch.

C: optionale Parameter / benannte Parameter

03. Oktober 2022

Im Gegensatz zu C++ oder vielen anderen Sprachen unterstützt C keine Default Values für Funktionsparameter. Auch ein Sprachkonstrukt wie Named Parameters, welches es z.B. in Python gibt, kennt C nicht.

Häufig wird als Workaround dafür Variadic Parameters verwendet, z.B. laut Linux-Manpage gibt es den open-Syscall in zwei Varianten:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

In Wahrheit sieht die Signatur allerdings so aus:

int open(const char *pathname, int flags, ...);

Das funktioniert grundsätzlich, hat jedoch den Nachteil, dass für alle zusätzlichen optionalen Parameter keine Typüberprüfung stattfindet.

Es gibt jedoch eine Alternative die sich Compound Literale für structs bemächtigt. Die Idee ist, dass alle Parameter an die Funktion per struct übergeben werden. Damit es wie ein normaler Funktionsaufruf aussieht, wird das ganze als Makro hübsch verpackt, welches die Makro-Parameter zu einem Compound Literal macht.

#include <stdio.h>

typedef struct {
	int a;
	int b;
	int c;
} TestFuncArgs;

#define testfunc(...) testfunc_f((TestFuncArgs){ __VA_ARGS__})

void testfunc_f(TestFuncArgs args) {
	printf("a: %d   b: %d   c: %d\n", args.a, args.b, args.c);
}

int main(int argc, char** argv) {
	testfunc(1, 2, 3);
	testfunc(4, 5);
	testfunc(.a = 10, .c = 20);

	//testfunc("hello"); //warning

	return 0;
}

Hier findet für alle Parameter eine Typüberprüfung statt und zusätzlich gibt es auch die Option, Designated Initializers zu verwenden, daher anstatt die struct-Werte als einfache Liste in richtiger Reihenfolge anzugeben, kann auch einfach der Feldname angegeben werden.

C Syntax Error

10. Mai 2021

Finde den Syntax-Fehler in folgendem C-Code:

#include <stdio.h>

int main(int argc, char **argv) {
	int a = 3;
	switch(a) {
		case 1:
			printf("1\n");
			break;
		case 2:
			printf("2\n");
			int c2 = 0;
			break;
		case 3:
			int c3 = 3;
			printf("%d\n", c3);
			break;
	}
	return 0;
}

Ein ähnlicher Fall wie hier im Beispiel hatte sich bei mir zugetragen. Der Compiler bemängelte die Variablendeklaration nach dem Case. Das heißt, hier im Beispiel ist die fehlerhafte Zeile die Variablendeklaration im Case 3.

Ich gebe zu, dass mich dies erstmal verwirrt hat und ich dachte, ich hätte versehentlich im C90-Modus kompiliert. Der Grund, wieso dies einen Fehler wirft, ist, dass ein Case nichts anderes als ein Label ist und Variablendeklarationen in C nicht mit einem Label versehen werden können.

WTF C Teil 3

16. Januar 2020

Aus der beliebten Serie WTF C:

bool trigraphs_are_available() {
	// Are trigraphs available??/
	return false;
	return true;
}

Was passiert hier? Zwei return-Statements hintereinander ergeben doch keinen Sinn! Kann die Funktion jemals true zurückgeben?

Auch dieses mal handelt es sich um standardkonformes C und es gibt auch Fälle, in denen die Funktion true liefert. Der Trick ist hier, dass im Kommentar etwas versteckt ist, nämlich am Ende ein Trigraph. Es ist nämlich in C möglich, manche Sonderzeichen durch alternative Zeichenketten auszudrücken. Am Ende des Kommentars steht der Trigraph ??/, der zu einem Backslash aufgelöst wird und ein Backslash am Ende eines einzeiligen Kommentars erweitert diesen auf die nächste Zeile. Wenn also der Compiler Trigraphen unterstützt, sind die ersten beiden Zeilen der Funktion ein Kommentar und übrig bleibt nur return true.

Gefunden habe ich das Beispiel hier.

Weiter