017. malloc(0) & realloc(…,0) ≠ 0 — blognote — nabijaczleweli

主要观点:

  • 介绍了多种 UNIX 相关系统的程序员手册、用户手册及相关规范中关于mallocrealloc的实现及变化。
  • 涵盖了不同版本的 UNIX(如第五版、第六版、第七版等)、BSD 系列(如 4.2bsd、4.3bsd、4.4bsd 等)、SunOS 系列(如 3.4、4.1.3 等)、Solaris 以及 System V 等系统的相关内容。
  • 探讨了realloc(…, 0)的行为及其在不同标准和实现中的差异。

关键信息:

  • 不同版本的 UNIX 系统在mallocrealloc的实现上有所不同,如第五版和第六版没有malloc,第七版有mallocrealloc等。
  • BSD 系列系统在不同版本中对malloc的实现进行了调整,如 4.2bsd 有新的分配器。
  • System V 系列在不同版本中对分配器的修改相对较小,SysVr2 和 SysVr3 新增了malloc(3X)
  • realloc(…, 0)的行为在不同标准和实现中存在差异,C89 规定其行为与不允许零大小对象的策略一致,但与现存实现不一致,C23 将其定义为未定义行为。

重要细节:

  • 各版本系统中mallocrealloc的具体实现代码路径,如不同版本的usr/man/man3/malloc.3usr/src/libc/gen/malloc.c等文件。
  • System V 系列中关于malloc(3X)的相关内容,包括其功能、警告等。
  • 不同系统中realloc(0)的行为,如某些系统中返回NULL,某些系统中会释放指针等。

结论:

  • 在所调查的范围内,每个realloc(…, 0)的行为与malloc一致,每个默认的malloc(0)行为类似于malloc(n); n > 0,且这是有文档记录的,但并非像今天这样明确。
  • SysVr2 的-lmalloc实现破坏了这一行为,且该差异未被文档记录,但作者需明确选择该实现,这在一定程度上是可以接受的。
  • AT&T 发布的 SVID 将malloc(3X)扩展呈现为通用基线接口,与其他实现的隐含文档相矛盾。
  • XPG 未能正确处理这一差异,后来的标准进行了修正。
阅读 7
0 条评论