Может ли эта функция быть совместимой с двумя версиями POSIX? - PullRequest
4 голосов
/ 28 июня 2019

Это краткий обзор для strspn:

#include <string.h>

size_t strspn(const char *s1, const char *s2);

Это описание и возвращаемое значение для POSIX.1-2001:

Функция strspn () должна вычислять длину (в байтах) максимального начального сегмента строки, на которую указывает s1, которая полностью состоит из байтов строки, на которую указывает s2.

Функция strspn () должна вернуть длину s1 ; возвращаемое значение не зарезервировано для указания ошибки.

Это (почти) то же самое из POSIX.1-2017:

Функция strspn () должна вычислять длину (в байтах) максимального начального сегмента строки, на которую указывает s1, которая полностью состоит из байтов строки, на которую указывает s2.

Функция strspn () возвращает вычисленную длину ; возвращаемое значение не зарезервировано для указания ошибки.

Возможно ли, чтобы реализация strspn была совместима как с POSIX.1-2001, так и с POSIX.1-2017? Как?

Ответы [ 2 ]

9 голосов
/ 28 июня 2019

Это ошибка в POSIX.1-2001.

Как описание POSIX strspn говорит :

Функциональностьописание на этой справочной странице приведено в соответствие со стандартом ISO C.Любой конфликт между требованиями, описанными здесь, и стандартом ISO C является непреднамеренным.Этот том IEEE Std 1003.1-2001 соответствует стандарту ISO C.

И стандарту C (ISO 9899: 1999, 7.21.5.6 Функция strspn ) ясно говорит:

Функция strspn возвращает длину сегмента.

В более новых выпусках POSIX исправлена ​​формулировка, чтобы она говорила то же самое, что истандарт С, который всегда был задуман.(По-видимому, это было замечено и изменено в 2006 году; см. https://www.opengroup.org/austin/docs/austin_330.txt. * Текущая версия strspn *1027* в POSIX именует это (довольно загадочно) как " SD5-XSH-ERN-182 применяется"в разделе ИЗМЕНЕНИЯ ИСТОРИИ.)

Поскольку POSIX говорит, что это" соответствует стандарту ISO C ", я считаю, что совместимые реализации должны следовать стандарту C, когда возникает конфликт, такой какв этом случае.

4 голосов
/ 28 июня 2019

Да, вычисленная длина и длина s1 часто будут отличаться, то есть функция должна нарушать одно из этих описаний.

Но первое, очевидно, является ошибкой в формулировке , так как последнее должно было иметь в виду, поэтому это не имеет значения .

Мало кто мог бы утверждать, что strspn() имел в виду громоздкую дешевую подделку strlen() с прямым лицом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...