realloc(ptr, 0) - 现在怎么办?

问题描述 投票:0回答:1

根据 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 发布?

c language-lawyer realloc c23
1个回答
0
投票

我不是100%确定,但一个相当合理的类比来自法律。在法律中,有一种称为“特别法”的学说,这意味着特定规则优先于一般规则,前提是假设其中一个规则的制定者了解另一个规则。 遵循这一原则,行为应该是未定义的,因为专门处理

realloc

函数的规则比“内存管理函数”更具体

    

© www.soinside.com 2019 - 2024. All rights reserved.