Почему я получаю нарушение доступа к памяти здесь? - PullRequest
0 голосов
/ 25 января 2011

Этот файл является частью GoAhead WebServer , который реализует очень быструю схему размещения блоков.

В строке 284 случайным образом происходит сбой процесса веб-серверараз.

 } else if ((bp = bQhead[q]) != NULL) {
/*
 *  Take first block off the relevant q if non-empty
 */
  bQhead[q] = bp->u.next; //MEMORY ACCESS VIOLATION HERE

Каковы возможные причины этого?

EDIT
bp - указатель на эту структуру и объединение в этого заголовкафайл

typedef struct {
    union {
        void    *next;                          /* Pointer to next in q */
        int     size;                           /* Actual requested size */
    } u;
    int         flags;                          /* Per block allocation flags */
} bType;

Спасибо.

Ответы [ 3 ]

5 голосов
/ 25 января 2011

Вот возможные причины.

  • Вы что-то напортачили и испортили некоторые из ваших структур данных или стека.

  • bQhead является пустым или недействительным указателем

  • q находится за пределами bQhead

  • bp является пустым или недействительным указателем

Пройдите по коду с помощью отладчика или используйте отладку printf и посмотрите, являются ли значения, если bQhead, q, bp, такими, какими они должны быть.

1 голос
/ 25 января 2011

Не работая под отладчиком, я бы предположил, что q выходит за пределы диапазона от 0 до B_MAXCLASS-1. Функция, которая устанавливает q, ballocGetSize(), не выполняет проверку границ, чтобы убедиться, что класс блока остается в границах.

Простое утверждение, проверяющее, что q находится в пределах границ, до того, как определение будет исключено, исключило бы такую ​​возможность.

1 голос
/ 25 января 2011

Дайте нам больше подсказок ...

Возможно повреждение памяти другим потоком, если оно случайное ...

my2c

...