Устаревшие проблемы переносимости realpath ()? - PullRequest
1 голос
/ 22 марта 2020

Традиционный способ вызова функции Unix realpath() - realpath(pathname, buf), где buf - предоставленный пользователем буфер с местом для PATH_MAX байтов. Это проблематично c, поскольку PATH_MAX неоправданно велико для большинства имен файлов и все же может быть меньше, чем фактический предел длины имени пути ОС.

Возможность передавать указатель NULL вместо buf позже был добавлен. В этом случае realpath() будет динамически выделять буфер нужного размера, используя malloc(). Это облегчает безопасное использование функции. Поскольку поддержка NULL была более поздним дополнением, она не была реализована повсеместно, и поэтому переносимые программы не могли полагаться на нее.

POSIX, выпуск 7, выпуск 2018 года теперь гарантирует поддержку NULL. Одобрение POSIX может показаться, что проблемы с переносимостью практически исчезли. Существуют ли какие-либо Unix системы в активном использовании (например, с прошлого десятилетия), где realpath() не поддерживает предоставление буфера NULL?

1 Ответ

0 голосов
/ 01 апреля 2020

realpath(path, NULL) работает на последних выпусках по крайней мере следующих систем:

  • Darwin
  • DragonFly BSD
  • FreeBSD
  • Haiku
  • Linux / glib c
  • Linux / musl
  • Minix
  • NetBSD
  • OpenBSD
  • Solaris (Omn iOS)
...