什么定义了 C 中的 strscpy?

What defines strscpy in C?

来自 Kees Cook 在 youtube 上的这个 视频 linux.conf.au 2019 他提到 strscpy 是首选,但通常做用户想要的(更少 NUL-padding)。但是,他没有说这是什么定义(规范或header),

来自视频的幻灯片,

我找不到 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

它在 linux source, not in the standard library. Online man page

鉴于没有任何库提供此功能(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] = '[=11=]';

        return  len;
}

注意:对于数组大小,我更喜欢 ptrdiff_t,但您可以像 linux 版本那样使用 size_t/ssize_t