Проблемы 64-битного кода в реальных программах: а что же Linux?

Рассказывая про 64-битные ошибки, поджидающие программистов при миграции их программ, я часто слышу упреки: "Ну да, этот ваш Windows, он такой... Хорошо, что в Linux с 64-битным кодом проблем да-а-а-авно уже нет".

"А вот и нет, мой любознательный читатель". Сегодняшний пост про 64-битную ошибку в ядре Linux. Чудесный сайт с системой отслеживания ошибок (bug tracking system) разработчиков ядра содержит описание bug 16603 (send of data > 4 GB fails on 64 bit systems). Суть проблемы проста: "Отправка данных с использованием 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, что, конечно же, никуда не годится. То есть отправка с помощью send() блока в 5 гигабайт приведет к отправке только 1 гигабайта, а отправка блока в 4 гигабайта не даст ничего (из-за "округления" до нуля).

Конечно, workaround понятен - указывать длину не более 0x8000000, но это ошибка и конечно же ее надо править.

Да, и это не из девяностых пример. Баг открыт в августе 2010 года, относится к ядру версии 2.5. И пока (11 октября 2010) не закрыт. А вы говорите в Linux 64-битных проблем нет...

Категории:
Теги:
Пожалуйста, обратитесь к странице Уведомление об оптимизации для более подробной информации относительно производительности и оптимизации в программных продуктах компании Intel.

Комментарии

Аватар пользователя Dmitry Oganezov (Intel)

Кто это говорит? :)

Кстати, поздравляю с очень успешным постом на Хабре! (Для тех, кто не следит за нашим блогом на Хабре вот ссылка http://habrahabr.ru/company/intel/blog/106082/). 111 человек (сто одиннадцать, а не семь) добавили данный пост в избранное и по-моему это рекорд. Круто.

Аватар пользователя Evgeniy Ryzhkov

>> Кто это говорит? :)

Говорят-говорят... На том же Хабре :-).

>> 111 человек (сто одиннадцать, а не семь) добавили данный пост в избранное и по-моему это рекорд.

Теперь надо продолжать работать над тем, чтобы и на ISN было столько же :-).

General Director (CEO) OOO "Program Verification Systems" (Co Ltd)
Аватар пользователя Ilnar

В реальных приложениях почти 100% никто такие размеры на send не дает.
А вот если такое найдется для sendfile, то это уже точно серьезнаяя проблема.

____________________ Борханов Ильнар
Аватар пользователя aleks13

Кончено меня сейчас могут приписать к розжигателям холиваров, но данный пост чем-то напоминает поговорку про песчинку и бревно в глазах. Сам я постоянно сталкиваюсь с обоими семействами систем по работе, но по большей части в области администрирования. Так хочу сказать, что никто и не говорит о тотальной идеальности и безглючности линукса, но в то же время смогли бы вы подобную ошибку так найти и понять в виндовс? По мне так главная разница не в количестве глюков, а в разном к ним отношению и разных возможностях по их устранению ;) :)

Аватар пользователя Vitaly Petrov

не знаю, как вы, а мне пока не очень хочется ставить 64-битный Linux на офисный компьютер. И дело не в багах ядра, а в возможности установить то или иное приложение. Обычно читаешь инструкцию по установке и видишь примерно следующее:

установка <program_name> на Linux:
1. wget ...
2. dpkg -i ...

установка <program_name> на Linux 64 бита:
1. wget ...
2. dpkg -i ...
3. ...
4. ...
5. ...
6. ...
7. если не сработает, то ..., открыть файл ..., после ... добавить ......., выполнить команду ... и если вылетит сообщение ..., то ...
и т. д.

Последний раз так развлекался, устанавливая scratchbox на ubuntu 64bit, больше года прошло, а повторять пока не хочется

Откуда эти проблемы в таком количестве? Или я ошибаюсь и проблема не настолько распространена?

Аватар пользователя aleks13

Не знаю где вы нашли такие программы (может я их просто не использую?). Но эти строчки сейчас я пишу из-под Ubuntu x64, которая уже год как является основной системой на домашнем компьютере, что в моем случае означает, что используется она во всех возможных ипостасях, кроме, пока что HPC, но опять же пока что :) В том числе подрабатывает периодически сервером, когда тестирую различные настройки перед установкой на сами серверы. И за все это время самая сложная установка (без учета, естественно, воскуривания манов при правке конфигов) была у LPT-контроллера, для которого пришлось писать скрипт, объясняющий ядру при загрузке, что это не 2 COM-порта, а один LPT. А о том что система у меня х64 я вспоминаю только когда вижу 8Гб доступной оперативы. :)

З.Ы. Ради интереса сейчас поставил scratchbox2 из репозиториев, все что мне понадобилось: "sudo aptitude install scratchbox2". Или между этой версией и версией без циферки есть существенная разница?

Аватар пользователя Ilnar

2 vit.petrov "Откуда эти проблемы в таком количестве?"
В привычке писать программы как для 32-битного ОС, и в не особом желании портировать имеющееся.
И как верно заметил aleks13, в кривых ручках тоже)))
Конечно, серьезные программы все постепенно портируются и поддерживаются.
И требуется хоть какой админ для продакшен серверов, или хотя бы таковые навыки домашнего пользователя

____________________ Борханов Ильнар