Ниже приводится наиболее популярная реализация strcpy в традиционных системах. Почему dest и src не проверяются на NULL при запуске? Однажды я слышал, что в старые времена память была ограничена, поэтому всегда предпочитался короткий код. Будете ли вы реализовывать strcpy и другие подобные функции с проверкой указателя NULL в самом начале? Почему бы и нет?
char *strcpy(char *dest, const char *src)
{
char *save = dest;
while(*dest++ = *src++);
return save;
}
Проверки работоспособности отсутствуют, потому что одна из наиболее важных основополагающих идеологий C заключается в том, что разработчик обеспечивает работоспособность.Когда вы предполагаете, что разработчик в здравом уме, вы получаете язык, который можно использовать для чего угодно и где угодно.
Это не заявленная цель — вполне возможно, что кто-то придумает реализацию, которая действительно проверяет это и многое другое. Может быть, они есть. Но я сомневаюсь, что многие люди, привыкшие к C, будут настаивать на его использовании, поскольку им все равно пришлось бы ставить галочки, если бы был хоть какой-то шанс, что их код будет перенесен на более обычную реализацию.
Весь язык C написан под девизом "Мы будем вести себя правильно, если программист знает, что он делает". делает." Ожидается, что программист знает, как сделать все необходимые проверки. Это не просто проверка на NULL, это проверка того, что dest
указывает на достаточное количество выделенной памяти для хранения src
, это проверка возвращаемого значения fopen
, чтобы убедиться, что файл действительно удачно открылся, зная, когда memcpy
безопасен, а когда требуется memmove
, и так далее.
Получение strcpy
для проверки на NULL не изменит языковую парадигму. Вам все равно нужно убедиться, что dest
указывает на достаточное пространство — и это то, что strcpy
не может проверить без изменения интерфейса. Вам также необходимо убедиться, что src
завершен '\0'
, что снова strcpy
невозможно проверить.
Существуют некоторые функции стандартной библиотеки C, которые делают проверку на NULL: например, free(NULL)
всегда безопасна. Но в целом C предполагает, что вы знаете, что делаете.
[C++ обычно избегает библиотеки
в пользу std::string
и других.]
Вы должны думать о функциях стандартной библиотеки C как о наименьшем возможном дополнительном слое абстракции над ассемблерным кодом, который вы не хотите штамповать, чтобы получить свои вещи через дверь. Все остальное, например проверка ошибок, ваша ответственность.
Для него просто не определена семантика ошибок. В частности, strcpy
не может вернуть значение ошибки. C99 просто указывает:
Функция
strcpy
возвращает значение изs1
.
Таким образом, для соответствующей реализации не было бы даже возможности вернуть информацию о том, что что-то пошло не так. Так зачем с этим заморачиваться.
Все это, я думаю, добровольно, так как strcpy
заменяется большинством компиляторов непосредственно очень эффективным ассемблером. Проверка ошибок зависит от вызывающей стороны.