Подробности
[В начало]
Проблема в стандарте № 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
[В начало]