- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
发现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 typesize_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 defineRSIZE_MAX
asSIZE_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/
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我知道 C11 标准在可选的附件 K 中将 rsize_t 定义为 size_t,但是在什么头文件中? C 标准在哪里说应该定义这种类型? 最佳答案 K.3.3 通用定义 The header d
发现strncpy_s()在VS2013下定义为 errno_t __cdecl strncpy_s ( _Out_writes_z_(_SizeInBytes) char * _Dst, _
我是一名优秀的程序员,十分优秀!