Что определяет 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.

Другие вопросы по тегам