2

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

从视频中滑出,

strscpy 幻灯片

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
4

2 回答 2

4

它在linux 源代码中,而不是在标准库中。 在线手册页

于 2019-02-08T22:49:34.973 回答
0

鉴于没有任何库提供此功能(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数组大小,但您可以像 linux 版本一样使用size_t/ 。ssize_t

于 2019-08-25T13:23:13.403 回答