Проблемы 64-Битного Кода В Реальных Программах: А Как Насчет Linux?

Говоря о 64-битных ошибках, которые подстерегают программистов при миграции своих программ, я часто слышу упреки: «Ну да, эта ваша Windows такая… Хорошо, что в Linux с 64-битным кодом проблем больше нет» " — Ан нет, мой пытливый читатель.

Сегодняшний пост посвящен 64-битной ошибке в ядре Linux. Замечательный сайт с системой отслеживания ошибок для разработчиков ядра содержит описание ошибка 16603 (отправка данных > 4 ГБ невозможна в 64-битных системах).

Проблема проста: «Отправка данных с помощью функции Linux send() приводит к ошибке, если размер данных слишком велик.

Функция glibc выглядит следующим образом:

 ssize_t send(int sockfd, const void *buf, size_t len, int flags);
Все правильно, размер передается как memsize тип size_t .

Однако этот аргумент сохраняется в структуре msgheader, после чего внутри функции tcp_sendmsg появляются следующие строки:

 while (--iovlen >= 0) {
                 int seglen = iov->iov_len;
                 unsigned char __user *from = iov->iov_base;
Здесь длина уже хранится в int, что, конечно, нехорошо.

То есть отправка блока в 5 гигабайт с помощью send() приведет к отправке только 1 гигабайта, а отправка блока в 4 гигабайта ничего не даст (из-за «округления» до нуля).

Конечно, обходной путь ясен — указать длину не более 0x8000000, но это ошибка и ее конечно надо исправлять.

Да и это не пример из девяностых.

Ошибка была обнаружена в августе 2010 года и относится к версии ядра 2.5. И он еще не закрыт (11 октября 2010 г.

).

А вы говорите, что в Linux нет проблем с 64-битной системой.

Теги: #64-бит #linux #C++

Вместе с данным постом часто просматривают: