根据 C23 的变更日志,提案 n2464 被投票并实施,使得
realloc(ptr, 0)
明确未定义行为,而它在以前的标准中应该是实现定义的。在草稿中(引自n3096),realloc
的规范已相应更改:(粗体强调我的)
7.24.3.7 realloc 函数
/--/
...或者如果为零,行为未定义size
但是,在C23草案中我们还可以看到:
7.24.3 内存管理函数
/--/
如果请求的空间大小为零,行为是 实现定义
附件 J.1 未明确的行为
(46) 成功调用 calloc、malloc、realloc 或 请求 0 字节时的aligned_alloc函数(7.24.3)。
附件 J.2 未定义的行为
(179) 通过调用 calloc、malloc、realloc 或aligned_alloc 返回的非空指针 请求大小为零的函数用于访问对象 (7.24.3)。
附件 J.3.12 实现定义的行为
(42) calloc、malloc、realloc 和aligned_alloc 函数是否返回空指针或 当请求的大小为零时指向已分配对象的指针 (7.24.3)。
现在,我确实尝试通过非正式渠道向 ISO C WG 指出这个缺陷,但显然是充耳不闻,因为这些缺陷仍然存在于草案n3220中。 7.24.3.7 和 7.24.3 都是规范性文本,而附录 J 则提供了信息(甚至在 C23 之前就已经充满了错误,永远不可信)。那么,哪一个相互矛盾的文本是“最规范的”?
是否可以将带有
realloc(ptr, 0)
的旧程序移植到 C23,并且相同的实现定义的行为可能仍然存在?或者这样的代码由于调用 UB 而无法移植到 C23?或者这在发布后仍然是一个缺陷,我们必须等待 TC 发布?