Почему нет проверок работоспособности в устаревшей strcpy ()

Ниже приводится наиболее популярная реализация strcpy в традиционных системах. Почему dest и src не проверяются на NULL при запуске? Однажды я слышал, что в старые времена память была ограничена, поэтому всегда предпочитался короткий код. Будете ли вы реализовывать strcpy и другие подобные функции с проверкой указателя NULL в самом начале? Почему бы и нет?

char *strcpy(char *dest, const char *src)
{
   char *save = dest;
   while(*dest++ = *src++);
   return save;
}
10
задан user436748 1 September 2010 в 08:44
поделиться

4 ответа

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

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

15
ответ дан 3 December 2019 в 13:18
поделиться

Весь язык C написан под девизом "Мы будем вести себя правильно, если программист знает, что он делает". делает." Ожидается, что программист знает, как сделать все необходимые проверки. Это не просто проверка на NULL, это проверка того, что dest указывает на достаточное количество выделенной памяти для хранения src, это проверка возвращаемого значения fopen, чтобы убедиться, что файл действительно удачно открылся, зная, когда memcpy безопасен, а когда требуется memmove, и так далее.

Получение strcpy для проверки на NULL не изменит языковую парадигму. Вам все равно нужно убедиться, что dest указывает на достаточное пространство — и это то, что strcpy не может проверить без изменения интерфейса. Вам также необходимо убедиться, что src завершен '\0', что снова strcpy невозможно проверить.

Существуют некоторые функции стандартной библиотеки C, которые делают проверку на NULL: например, free(NULL) всегда безопасна. Но в целом C предполагает, что вы знаете, что делаете.

[C++ обычно избегает библиотеки в пользу std::string и других.]

11
ответ дан 3 December 2019 в 13:18
поделиться

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

0
ответ дан 3 December 2019 в 13:18
поделиться

Для него просто не определена семантика ошибок. В частности, strcpy не может вернуть значение ошибки. C99 просто указывает:

Функция strcpy возвращает значение из s1.

Таким образом, для соответствующей реализации не было бы даже возможности вернуть информацию о том, что что-то пошло не так. Так зачем с этим заморачиваться.

Все это, я думаю, добровольно, так как strcpy заменяется большинством компиляторов непосредственно очень эффективным ассемблером. Проверка ошибок зависит от вызывающей стороны.

0
ответ дан 3 December 2019 в 13:18
поделиться