Подробности

[В начало]

Проблема в стандарте № S0207

Краткое описание

Реализация функции basename() в libc.so противоречит LSB 3.1.

Подробное описание

Реализация basename() в glibc-2.3.5 не соответствует требованиям LSB 3.1.
Следующий код вызывает segmentation fault:

extern char *basename(const char *); int main() { char* path="err////"; basename(path); return 0; }
Кроме того, функция basename() неправильно возвращает пустую строку при следующих входных значениях:

ЗначениеДолжна возвращать
"er//""er"
"NULL ""."
"""."
"////""/"
"//""/" или "//"

В то же время, реализация basename() в glibc-2.3.5 соответствует требованиям POSIX, так как при включении заголовочного файла libgen.h идентификатор basename подменяется на идентификатор __xpg_basename, который соответствует функции __xpg_basename(), удовлетворяющей требованиям POSIX к функции basename().

Как обсуждалось на LSB Summit, эта ошибка является ошибкой в стандарте LSB 3.1, который должен требовать POSIX-совместимое поведение от бинарного символа __xpg_basename, а не от символа basename.

Раздел стандарта

Linux Standard Base Core Specification 3.1, Chapter 13. Base Libraries, 13.3. Interfaces for libc, 13.3.17. Standard Library, 13.3.17.1. Interfaces for Standard Library

Возможные последствия

Проблемы с переносимостью приложений.

Способы устранения

1. Добавить в стандарт LSB 3.1 функцию __xpg_basename(), указав что это binary standard, а не source standard. (См. __cxa_atexit).
2. Добавить

#define basename __xpg_basename
в заголовочные файлы LSB SDK.

Принято

LSB Bugzilla, 1430

Статус

Исправлена в LSB 3.1 Update 1

[В начало]