Programmier Fehler: void new* = malloc(len)

Neulich bin ich bei der Integration einer Open Source Bibliothek in eine Anwendung auf ein Codefragment gestoßen, wo ich dachte, "das darf doch nicht Wahr sein". Aber seht selbst:


#if !HAVE_STRDUP
#undef strdup
char *strdup(const char *s)
{
	size_t len = strlen(s) + 1;
	void *new = malloc(len);
	if(new == NULL) return NULL;
	return (char *)memcpy(new, s, len);
}
#endif

Na, entdeckt? Kleiner Tipp: versuchen Sie mal den Code mit einem C++ Compiler zu übersetzen.

Sowas dämliches dürfte einem Softwareentwickler eigentlich nicht passieren. Aber es kommt vor wie man sieht. Der Code hat durchaus seine Berechtigung: wenn er in einer reinen C Umgebung verwendet wird! new ist ein reiner C++ Bezeichner. Jedoch findet sich in der Header Datei dann wieder so etwas:

#if defined(__cplusplus)
extern "C" {
#endif

Also kann davon ausgegangen werden, dass dieser Code tatsächlich für die Kompilierung mit einem C++ Compiler vorgesehen war. Wieso diese grandiose Fehlleistung dem Programmierer nicht aufgefallen ist, könnte an folgendem Grund liegen: Der Code hat es nie aus einer (Linux) Umgebung herausgeschaft, wo strdup() zu der Standardbibliothek gehört und der oben angegebene Code ja gerade auf Systemen verwendet werden soll wo strdup() nicht zu der Standardbibliothek dazugehört. Mit ./configure wird dieses ausgetestet und dann die config.h erzeugt worin dann HAVE_STRDUP definiert wird wenn strdup() existiert. Und hier ist auch der Haken: Wenn strdup() nun existiert, wird HAVE_STRDUP definiert. Und dann fliegt der obige Code schon beim Preprozessor raus und der Compiler sieht null davon. Fazit: grandiose Programmierer Fehlleistung mit vorprogrammiertem Selbstschutz.