什么定义了 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
。
来自 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
。