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

Продолжаем цикл рассказов о 64\-битных ошибках, обнаруживаемых в реальных приложениях\. Время идет, потребности в потребляемой памяти растут и пришел момент, когда кто\-то решил отсортировать массив, состоящий более чем из 2^31 элементов\. Для этого он решил воспользоваться функцией qsort, реализованной OpenBSD 4\.5\. Результатом стало обнаружение новой 64\-битной ошибки\. 

Рассмотрим данную ошибку более подробно\. На момент написания этой заметки последняя ревизия файла "lib/libc/stdlib/qsort\.c", входящего в состав OpenBSD 4\.6\. относится к августу 2005 года\. В ней функция qsort использует вспомогательные переменные "d" и "r", имеющие тип int:

```cpp
void
qsort(void *aa, size_t n, size_t es,
 int (*cmp)(const void *, const void *))
{
  char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
  int d, r, swaptype, swap_cnt;
  char *a = aa;
  . . . .
```

Эти переменные используется для хранения различных размеров, что приводит к ошибкам при обработке большого количества элементов\. Исправление заключается в определении этих переменных как size\_t:

```cpp
size_t d, r;
```

Данная ошибка показательна тем, что она была обнаружена только в 2010 году\! Видимо большое количество ошибок в 64\-битных программах начнут проявляться в тот момент, когда стандартная пользовательская машина будет иметь более 16 гигабайт памяти и программы начнут ее активное использование\.