在 C 标准的 Annex K(边界检查接口)中不断出现一句话:
....复制不应发生在重叠的对象之间。
例如,考虑 ,strcpy_s( char * restrict s1, rsize_t s1max, char const * restrict s2 )
其中指定启用边界检查s1max
的最大容量。s1
此时的“对象”究竟是什么s1
,不能与“对象”重叠s2
?
会不会是...
- s1[0]..s1[s1max](到缓冲区的末尾,即内存对象),
或者
- s1[0]..s1[strnlen(s1, s1max)](到字符串的末尾,即字符串对象)?
如果是前者,我想知道缺乏一致性,因为我不知道s2缓冲区的大小,并且必须对“对象”应用不同的定义。
如果是后者,我想知道它是否不会破坏给出的“承诺”,因为可以想象,如果源字符串比原始字符串长,源字符串和最终(复制后)目标字符串可能会重叠。
这里“对象”的意图/预期定义是什么?