﻿# Проблемы 64\-битного кода в реальных программах: FreeBSD

Рассказывая людям про проблемы и трудности разработки 64\-битных приложений, я часто слышу в ответ: "Надо просто программы писать хорошо и тогда никаких проблем не будет"\. Что мы только ни делали, чтобы убедить людей в абсурдности такой позиции\! Писали статьи, приводили примеры, но всегда находились те, кто оставался при своем мнении\.

Недавно занимаясь исследованием интернета на предмет обсуждений 64\-битных проблем, я наткнулся на форуме на описание странного поведения программы для чтения файлов\. Эта программа никак не могла считать файл более двух гигабайт, хотя код был корректным:

```cpp
size_t size;
size = fread(...);
```

Исследование показало, что ошибка была\.\.\. внутри функции fread операционной системы FreeBSD\!

В это трудно поверить, поэтому привожу доказательства своих слов\. В репозитории исходного кода FreeBSD можно посмотреть код функции fread \([https://svnweb\.freebsd\.org/](https://svnweb.freebsd.org/)\):

```cpp
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 года\!

```cpp
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\-битные системы еще не востребованы в мире?