>
>
>
Проблемы 64-битного кода в реальных про…

Андрей Карпов
Статей: 673

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

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

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

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:

size_t d, r;

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