“memcpy 必须给出有效的指针”:我在标准中哪里可以找到这个?

Vul*_*rao 3 c++ memcpy language-lawyer

cppref上指出

如果 或destsrc无效指针或空指针,则行为未定义,即使count为零

memset和也有同样的规定memmove

我的问题是:标准中哪里有规定?我需要向我的客户证明这是一个 UB,但是指向 cppref 文章的链接不行,我需要标准中的参考。

标准的公开草案

S.M*_*.M. 7

C++标准引用了C标准,这些函数都是在C标准中定义的。

7.24 字符串处理<string.h>

7.24.1 字符串函数约定

  1. <...> 除非在本子条款中特定函数的描述中另有明确说明,否则此类调用中的指针参数仍应具有有效值,如 7.1.4 中所述。<...>

7.1.4 库函数的使用

  1. <...> 如果函数的参数具有无效值(例如函数域之外的值、程序地址空间之外的指针、空指针或指向不可修改的指针)当相应的参数不是 const 限定的存储时)或具有可变数量参数的函数不期望的类型(提升后)时,行为未定义 <...>

C17 ISO/IEC 9899:2018 N2310

  • [cstring.syn#1](https://timsong-cpp.github.io/cppwp/cstring.syn#1) 头文件 &lt;cstring&gt; 的内容和含义与 C 标准库头文件 &lt;string.syn&gt; 相同。 h&gt;. [support.c.headers.general#1](https://timsong-cpp.github.io/cppwp/support.c.headers.general#1) C++ 源文件可能需要包含这些标头之一为了成为有效的 ISO C。不打算成为有效 ISO C 的源文件不应使用任何 C 标头。 (4认同)
  • @MarkRansom C++ 标准确实引用了 C 标准(以及其他一些标准)。特别是,C++20 指的是 ISO/IEC 9899:2018 (C17)。我相信在 C++ 中声明 C 子部分的相关部分是 https://isocpp.org/files/papers/N4860.pdf#subsubsection.16.5.1.2 (2认同)