Рассказывая людям про проблемы и трудности разработки 64-битных приложений, я часто слышу в ответ: "Надо просто программы писать хорошо и тогда никаких проблем не будет". Что мы только ни делали, чтобы убедить людей в абсурдности такой позиции! Писали статьи, приводили примеры, но всегда находились те, кто оставался при своем мнении.
Недавно занимаясь исследованием интернета на предмет обсуждений 64-битных проблем, я наткнулся на форуме на описание странного поведения программы для чтения файлов. Эта программа никак не могла считать файл более двух гигабайт, хотя код был корректным:
size_t size;
size = fread(...);
Исследование показало, что ошибка была... внутри функции fread операционной системы FreeBSD!
В это трудно поверить, поэтому привожу доказательства своих слов. В репозитории исходного кода FreeBSD можно посмотреть код функции fread (https://svnweb.freebsd.org/):
size_t
fread(void * __restrict buf, size_t size,
size_t count, FILE * __restrict fp)
{
int ret;
FLOCKFILE(fp);
ret = __fread(buf, size, count, fp);
FUNLOCKFILE(fp);
return (ret);
}
О ужас, разве можно было объявлять переменную ret как int? Конечно же, нет. Эта ошибка была исправлена... только в декабре 2008 года!
size_t
fread(void * __restrict buf, size_t size,
size_t count, FILE * __restrict fp)
{
size_t ret;
FLOCKFILE(fp);
ret = __fread(buf, size, count, fp);
FUNLOCKFILE(fp);
return (ret);
}
Удивительно, что ошибка в операционной системе FreeBSD была исправлена лишь в конце 2008 года. Видимо, 64-битные системы еще не востребованы в мире?
0