microavia / messgen

MIT License
9 stars 11 forks source link

Привести в порядок возвращаемые из функций значения в C++ #11

Closed nameofuser1 closed 3 years ago

nameofuser1 commented 4 years ago

Когда-то вопрос уже поднимался, но благополучно забыли об этом.

  1. Метод serialize в случае успеха возвращает > 0, в случае фейла - 0. В то время, как parse и get message info возвращают -1 для ошибки и 0 для успеха. Сделать бы одинаково.
  2. Вроде как size_t и int не самый хороший способ возвращать значения. Я бы переделал на типы со строгим размером типа uint32_t, int32_t.
DrTon commented 4 years ago

Вроде как size_t и int

а почему? вроде size_t как раз и задуман как тип размера массива. A int традиционно используется в POSIX для возврата ошибок, например функции open, ioctl возвращают именно int.

Используя int32_t ты намекаешь на 32битность архитектуры (мол это родной тип), а messgen у нас кроссплатформенный.

nameofuser1 commented 3 years ago

Вроде как size_t и int

а почему? вроде size_t как раз и задуман как тип размера массива. A int традиционно используется в POSIX для возврата ошибок, например функции open, ioctl возвращают именно int.

Используя int32_t ты намекаешь на 32битность архитектуры (мол это родной тип), а messgen у нас кроссплатформенный.

А причем тут архитектура? Менее кроссплатформенным он не станет от того, что мы будем int32 возвращать. Просто строгая типизация имеет более предсказуемое поведение.

В свете #15 и https://github.com/microavia/messgen/tree/change-max-message-size-to-uint32, когда мы хотим возвращать отрицательные значения и иметь максимальный размер сообщений uint32, у нас варианты возврата есть только int или int64, тк ssize_t на винде вообще не определен. Почему между int и int64 я выберу int64 - uint32 кастисть к int опасно, тк uint32 может быть равен размеру int, тогда возможно переполнение. Понятно, что сообщения таких размеров маловероятны, но все же ничего не мешает строго описать тип.

Давай придем по этим вопросам к консенсусу и переделаем интерфейсы, тк #15 довольно неприятная штука (

DrTon commented 3 years ago

Есть еще три варианта:

  1. int32, тогда максимальный размер сообщения сократится до 2Гб, чтото мне подсказывает, что этого над на ближайшее время хватит
  2. Разделить код возврата (OK/ERROR) и количество обработаных байт (например класть его в аргумент ссылку).
  3. Вообще не возвращать количество обработаных байт, т.к. по факту оно не особо и нужно, есть метод get_size() который мы все равно должны вызвать ПЕРЕД парсингом или сериализацией, чтобы убедится что буфер который мы даем нужного размера.