什么在C中定义strscpy?

时间:2019-02-08 22:39:42

标签: c linux linux-kernel strcpy strlcpy

在此video on youtube by Kees Cook from linux.conf.au 2019中,他提到strscpy是首选,但通常会执行用户想要的操作(较少进行NUL-填充)。但是,他没有说什么定义(规范或标题),

视频幻灯片

strscpy slide

我找不到strscpy()的{​​{1}}

man

2 个答案:

答案 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