Тип возвращаемого значения функции без знака, в то время как он возвращает -1 для ошибки - PullRequest
0 голосов
/ 29 декабря 2018

Я уже некоторое время использую libnet и заметил, что есть некоторые функции, которые возвращают значение uint32_t, которое, на мой взгляд, относится к типу без знака.Тем не менее, в документации говорится, что необходимо вернуть -1, если произошла ошибка (типа со знаком). См., Например, libnet_get_ipaddr4, libnet_get_prand.

Однако яБез проблем перебираю такие функции:

if ((src_ip_addr = libnet_get_ipaddr4(l)) == -1) { /* treat the failure*/ }

Я полагаю, что имеет место сравнение между -1, интерпретируемым как unsigned int, с возвращаемым значением, которое принимает то же значение;Сравнение верно.

Несмотря на то, что это, очевидно, работает, мой вопрос: Имеет ли это смысл?Почему? Как программист, как мне проверить возвращаемое значение, чтобы узнать, произошла ли ошибка?Правильно ли показан приведенный выше фрагмент кода?

1 Ответ

0 голосов
/ 29 декабря 2018

цитирование стандартного черновика C99, 6.2.5.9:

Вычисления с использованием беззнаковых операндов никогда не могут переполниться, поскольку результат, который не может быть представлен результирующим целочисленным типом без знака, уменьшается по модулю на число, являющеесяна единицу больше наибольшего значения, которое может быть представлено результирующим типом.

Таким образом, -1 автоматически преобразуется в UINT32_MAX.

Предупреждение: Работа со значениями вне допустимого диапазона не так хороша для типов со знаком .См. здесь и здесь для различных сложностей.

6.5.9 говорит, что для операторов равенства

Если оба операнда имеютарифметического типа, обычные арифметические преобразования выполняются.

6.3.1.8 описывает эти преобразования:

[...] В противном случае, если операнд с целочисленным типом без знака имеет ранг, больший или равный рангутип другого операнда, затем операнд с целым типом со знаком преобразуется в тип операнда с целым типом без знака.[...]

(Вы можете использовать стандарт для аналогичного обоснования возврата -1 для функции, возвращающей подписанный тип, но это в основном тот же аргумент, поэтому я не буду беспокоиться.)

Другими словами, да, это совершенно правильно.

...