Что определяет strscpy в C?
Из этого видео на YouTube на Kees Cook из linux.conf.au 2019 он упоминает strscpy
как предпочтительный, но обычно делает то, что хотят пользователи (меньше NUL
-padding). Тем не менее, он не говорит, что определяет это (спецификация или заголовок),
Слайд с видео,
Я не могу найти strscpy()
с man
$ for i in strcpy strlcpy strscpy; do man -w $i; done;
/usr/share/man/man3/strcpy.3.gz
/usr/share/man/man3/strlcpy.3bsd.gz
No manual entry for strscpy
1 ответ
Это в источнике Linux, а не в стандартной библиотеке. Справочная страница онлайн
Учитывая, что нет какой-либо библиотеки, которая обеспечивает эту функцию (AFAIK), вы можете написать ее самостоятельно. Я уверен, что это может быть оптимизировано, но очень простое определение, использующее GNU C11 для него, это то, которое я использую:
#pragma once /* libalx/base/string/strcpy/strscpy.h */
#include <stddef.h>
__attribute__((nonnull))
ptrdiff_t strscpy (char dest[restrict /*size*/],
const char src[restrict /*size*/],
ptrdiff_t size);
#include "libalx/base/string/strcpy/strscpy.h"
#include <errno.h>
#include <stddef.h>
#include <string.h>
ptrdiff_t strscpy (char dest[restrict /*size*/],
const char src[restrict /*size*/],
ptrdiff_t size)
{
ptrdiff_t len;
if (size <= 0)
return -E2BIG;
len = strnlen(src, size - 1);
memcpy(dest, src, len);
dest[len] = '\0';
return len;
}
Примечание: я предпочитаю ptrdiff_t
для размеров массива, но вы можете использовать size_t
/ssize_t
как версия для Linux.