Что определяет strscpy в C? - PullRequest
       25

Что определяет strscpy в C?

0 голосов
/ 09 февраля 2019

Из этого видео на youtube Kees Cook из linux.conf.au 2019 он упоминает strscpy как предпочтительный, но обычно делает то, что хотят пользователи (минус NUL -пэдинг).Однако он не говорит, что определяет это (спецификация или заголовок),

Слайд из видео,

strscpy slide

Я могуне найти 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

Ответы [ 2 ]

0 голосов
/ 25 августа 2019

Учитывая, что нет библиотеки, обеспечивающей эту функцию (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.

0 голосов
/ 09 февраля 2019

Он находится в источнике Linux , а не в стандартной библиотеке. Справочная онлайн-страница

...