gpt4 book ai didi

c++ - 为什么要定义 rsize_t?

转载 作者:IT老高 更新时间:2023-10-28 21:45:00 29 4
gpt4 key购买 nike

发现strncpy_s()VS2013下定义为

errno_t __cdecl strncpy_s
(
_Out_writes_z_(_SizeInBytes) char * _Dst,
_In_ rsize_t _SizeInBytes,
_In_reads_or_z_(_MaxCount) const char * _Src,
_In_ rsize_t _MaxCount
);

rsize_t 是:

typedef size_t rsize_t;

我认为这是 Visual Studio 的伎俩。但是,我发现这个函数在这个 page 上定义如下

errno_t strncpy_s
(
char *restrict dest,
rsize_t destsz,
const char *restrict src,
rsize_t count
);

为什么在这里定义rsize_t

如果这里使用了 size_t 会怎样?

有什么特殊情况可以使用这个rsize_t

最佳答案

您在 Microsoft 的 C++ 标准库中遇到过它,但它实际上来自 C.C 11,准确地说,这意味着它在技术上不是 C++ 的一部分。

C 11 标准,Annex K 介绍了所有 _s 函数和相应的 typedef,包括 rsize_t。还有一个“最大值”宏RSIZE_MAX,对于典型应用来说足够大,但小于类型的实际最大值。当 rsize_t 类型的值超过 RSIZE_MAX 时,安全函数不执行任何操作并报告错误。

这个想法是为了避免缓冲区溢出崩溃和由无效大小引起的类似错误,通常是由于使用负值的大小造成的。在 2 的补码有符号值表示(最常见的一种)中,当被视为无符号时,负数对应于 非常 大的数。 RSIZE_MAX 应该能捕捉到这种不正确的使用。

引用 C11 (N1570), K.3.2 的“基本原理”部分:

3 Extremely large object sizes are frequently a sign that an object’s size was calculated incorrectly. For example, negative numbers appear as very large positive numbers when converted to an unsigned type like size_t. Also, some implementations do not support objects as large as the maximum value that can be represented by type size_t.

4 For those reasons, it is sometimes beneficial to restrict the range of object sizes to detect programming errors. For implementations targeting machines with large address spaces, it is recommended that RSIZE_MAX be defined as the smaller of the size of the largest object supported or (SIZE_MAX >> 1), even if this limit is smaller than the size of some legitimate, but very large, objects. Implementations targeting machines with small address spaces may wish to define RSIZE_MAX as SIZE_MAX, which means that there is no object size that is considered a runtime-constraint violation.


值得注意的是,附件 K 的实现很少,并且有一个提议 (N1967) 弃用和/或从标准中删除它。

关于c++ - 为什么要定义 rsize_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33604857/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com