В чем смысл не включать strdup в стандарт C?

Большинство программистов C знакомы с функцией strdup. Многие из них будут считать это само собой разумеющимся, но это не является частью стандарта C (ни C89, C99, ни C11). Он является частью POSIX и может быть недоступен во всех средах. Действительно, Microsoft настояла на том, чтобы переименовать его _strdup, добавив в замешательство.

Легко определить его таким образом (в C):

#include <string.h>

char *strdup(const char *s) {
    size_t size = strlen(s) + 1;
    char *p = malloc(size);
    if (p) {
        memcpy(p, s, size);
    }
    return p;
}

Но даже опытные программисты могут легко ошибиться.

Кроме того, переопределение функции только в системах, которые ее не имеют, оказывается несколько сложным, как описано здесь: функция strdup()

Почему бы не включить такие полезные широко поддерживаемые функции в пересмотренные версии стандарта C? В стандартной библиотеке C в C99 было добавлено много новых функций, что является обоснованием того, что не включает strdup?

Ответ 1

В цитируемой ссылке в комментариях (http://open-std.org/JTC1/SC22/WG14/www/docs/n718.htm) дается объяснение о том, что "неправильно" о том, что strdup в стандартной библиотеке:

Основная проблема заключалась в желательности добавления функции в стандартную библиотеку, которая автоматически выделяет кучную память для пользователя.

В принципе, язык C и его стандартная библиотека стараются не делать предположений о том, как пользователь выделяет и использует память.
Это дает несколько возможностей, среди которых стек и куча.

В то время как malloc/free стандартизированы для динамического распределения памяти, они отнюдь не единственный способ сделать это, потому что управление динамической памятью является очень сложной темой, и стратегия распределения по умолчанию может оказаться нежелательной для всех видов приложений.

Существуют, например, несколько независимых библиотек, таких как jemalloc, что подчеркивает низкую фрагментацию и concurrency, или даже полноценные сборщики мусора, такие как Консервативный сборщик мусора Boehm-Demers-Weiser. Эти библиотеки предлагают malloc/free реализаций, которые предназначены для использования исключительно в замене стандартным * alloc и бесплатным функциям от <stdlib.h> без нарушения совместимости с остальной частью стандартной библиотеки C.

Итак, если strdup был стандартным, его было бы фактически дисквалифицировано от использования кода с использованием сторонних функций управления памятью (необходимо отметить, что вышеупомянутая библиотека jemalloc обеспечивает реализацию strdup, чтобы избежать этой проблемы).

В более общем плане, хотя strdup, безусловно, является практической функцией, он страдает от недостатка ясности в своей семантике. Это функция, объявленная в заголовке <string.h>, но для ее вызова требуется, следовательно, освободить возвращенный буфер, вызвав функцию free из заголовка <stdlib.h>. Итак, это строковая функция или функция памяти?
Оставляя его в стандарте POSIX, кажется, является наиболее разумным решением, чтобы избежать меньшей ясности стандартной библиотеки C.