Сообщение 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 пока как-то невозможно.
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 пока как-то невозможно.
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 пока как-то невозможно.