Информация об изменениях

Сообщение Re[2]: Коды ошибок и отрицательные числа от 30.01.2022 9:58

Изменено 30.01.2022 10:06 netch80

Re[2]: Коды ошибок и отрицательные числа
Здравствуйте, AeroSun, Вы писали:

AS>Подведу итог:


Много берёте на себя, и местами наверно.

AS>3) всегда сравнение было с нулём, причем 0 — это всё ок, -1 — это невалидное значение, 1+ — это коды ошибок


НЕТ.

Если говорить в контексте типового Unix API, то есть минимум 4 разных случая:

1. Нет ошибки — 0, ошибка — -1 и в errno сохранён код ошибки (>0).
Выполняется для функций, у которых только признак успех/неудача (как close(), ioctl(), setuid()...), или результат идёт другим каналом (указатель в аргументах, например: pipe() — массив на 2 дескриптора).

2. Нет ошибки — >=0, ошибка — -1 и в errno сохранён код ошибки (>0). Это open(), read(), write(), fcntl() и десятки других.

3. Нет ошибки — 0, ошибка — код ошибки больше 0, обычно из errno. Результат всегда идёт другим каналом (по указателю в аргументах). Это вся группа pthread_*, это getaddrinfo(), getnameinfo() и некоторые другие.

(Кстати, если ошибки нет, варианты 1-3 могут менять errno, а могут и не менять.)

4. Индикации ошибки в возвращаемом значении нет вообще (или слишком много вариантов). Для проверки на ошибку надо смотреть на errno (предварительно обнулив его) и на другие признаки.
Пример: strtol(): если значение вышло за пределы — она пишет ERANGE в errno. Если после числа в строке мусор — надо смотреть на *endptr != 0. Если на входе пустая строка — ответ 0, errno == 0, но факт пустой строки определяется по endptr == beginptr.

А вот варианта, что вы описали, именно в этой комбинации, просто не существует.

AS>1) в стартовом посте написан сумбур


Топикстартер хотел разобраться. Как известно, чтобы получить ответ, надо в вопросе сформулировать его половину. Сумбур — не страшно, главное — ключевые слова.

AS>2) никто ничего не сохранял в unsigned


Тут единственное что верно, с поправкой на то, что на уровне ассемблера могли вообще не смотреть на знак.

AS>4) уже давно вместо этого используют typed enum — чего и вам советую


Перевести на него существующее API пока как-то невозможно.
Re[2]: Коды ошибок и отрицательные числа
Здравствуйте, AeroSun, Вы писали:

AS>Подведу итог:


Много берёте на себя, и в принципиальных моментах неверно.

AS>3) всегда сравнение было с нулём, причем 0 — это всё ок, -1 — это невалидное значение, 1+ — это коды ошибок


НЕТ.

Если говорить в контексте типового Unix API, то есть минимум 4 разных случая:

1. Нет ошибки — 0, ошибка — -1 и в errno сохранён код ошибки (>0).
Выполняется для функций, у которых только признак успех/неудача (как close(), ioctl(), setuid()...), или результат идёт другим каналом (указатель в аргументах, например: pipe() — массив на 2 дескриптора).

2. Нет ошибки — >=0, ошибка — -1 и в errno сохранён код ошибки (>0). Это open(), read(), write(), fcntl() и десятки других.

3. Нет ошибки — 0, ошибка — код ошибки больше 0, обычно из errno. Результат всегда идёт другим каналом (по указателю в аргументах). Это вся группа pthread_*, это getaddrinfo(), getnameinfo() и некоторые другие.

(Кстати, если ошибки нет, варианты 1-3 могут менять errno, а могут и не менять.)

4. Индикации ошибки в возвращаемом значении нет вообще (или слишком много вариантов). Для проверки на ошибку надо смотреть на errno (предварительно обнулив его) и на другие признаки.
Пример: strtol(): если значение вышло за пределы — она пишет ERANGE в errno. Если после числа в строке мусор — надо смотреть на *endptr != 0. Если на входе пустая строка — ответ 0, errno == 0, но факт пустой строки определяется по endptr == beginptr.

А вот варианта, что вы описали, именно в этой комбинации, просто не существует.

AS>1) в стартовом посте написан сумбур


Топикстартер хотел разобраться. Как известно, чтобы получить ответ, надо в вопросе сформулировать его половину. Сумбур — не страшно, главное — ключевые слова.

AS>2) никто ничего не сохранял в unsigned


Тут единственное что верно, с поправкой на то, что на уровне ассемблера могли вообще не смотреть на знак.

AS>4) уже давно вместо этого используют typed enum — чего и вам советую


Перевести на него существующее API пока как-то невозможно.