在此video on youtube by Kees Cook from
linux.conf.au 2019中,他提到strscpy
是首选,但通常会执行用户想要的操作(较少进行NUL
-填充)。但是,他没有说什么定义(规范或标题),
视频幻灯片
我找不到strscpy()
的{{1}}
man
答案 0 :(得分:2)
它在linux source中,而不在标准库中。 Online man page
答案 1 :(得分: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
。