【问题标题】:What defines strscpy in C?什么定义了 C 中的 strscpy?
【发布时间】:2019-07-03 05:09:29
【问题描述】:

video on youtube by Kees Cook from linux.conf.au 2019 中,他提到strscpy 是首选,但通常会做用户想要的(较少NUL-padding)。但是,他没有说是什么定义了这个(规范或标题),

从视频中幻灯片,

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

【问题讨论】:

  • strscpy() 它不是 C 的一部分,也不是 POSIX 的一部分。它是一个扩展。使用它会使代码不可移植。
  • strscpy 安全地做它的事情,但我不认为静默截断是用户通常想要的。无论如何,它是nit标准。执行相同操作的标准(但可选且不受 glibc 支持)函数是 strcpy_s。

标签: c linux linux-kernel strcpy strlcpy


【解决方案1】:

它在linux source 中,而不是在标准库中。 Online man page

【讨论】:

  • 我们是否应该将它添加到 GLibc 中?
  • @SomeName:并非 Linux 内核中提供的所有函数都是用户空间程序真正需要的。而且,在我看来,strscpy 就是其中之一:它非常关心可能来自用户空间的不受信任的字符串(无论如何都不应该让内核崩溃),但这个特性不是对于用户空间程序非常重要。另请参阅this reasoning,了解一些添加到 Linux 内核的功能。
【解决方案2】:

鉴于没有任何库提供此功能(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

【讨论】:

    猜你喜欢
    • 2017-03-05
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2011-10-06
    • 2010-11-01
    • 2018-01-10
    相关资源
    最近更新 更多