malloc вызывает повреждение кучи

Я изучаю, как общаться с USB-устройствами с помощью IOKit, и я написал этот фрагмент кода:

// Global variable
char *dataBuffer;

- (void)startPolling {
  if (!shouldPoll) { // Prevent polling twice
    shouldPoll = YES;
    timer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(poll) userInfo:nil repeats:NO];
    [self performSelectorInBackground:@selector(poll) withObject:nil];
  }
}

- (void)poll {
  dataBuffer = (char *)malloc(numBytes);
  numBytes = 64;

  returnCode = (*usbInterface)->ReadPipe(usbInterface, 2, dataBuffer, &numBytes);
  // Handle received data in dataBuffer

  free(dataBuffer);
  [timer fire];
}

Работает это так: другая часть кода, которая работает нормально, ищет устройство, открывает его, а затем открывает нужный интерфейс. После этого, когда пользователь нажимает кнопку, он вызывает startPolling, который устанавливает таймер, запускающий метод poll каждые 0,5 секунды (вроде как, таймер будет срабатывать снова и снова).

В методе poll программа будет считывать канал USB и сохранять данные на dataBuffer. Сначала я думал, что могу выделить его память один раз и повторно использовать указатель на каждой итерации, но по незнакомым мне причинам второй вызов ReadPipe завершится ошибкой. Всегда.

В отчаянии я придумал эту (ужасную?) идею: выделять и освобождать буферную память на каждой итерации. К моему удивлению, это сработало, и я смог успешно прочитать устройство.

Проблема в том, что время от времени программа вылетает с ошибкой:

malloc: *** error for object 0x610000005890: Heap corruption detected, free list canary is damaged
*** set a breakpoint in malloc_error_break to debug

Я действительно не знаю, что это значит, не говоря уже о том, как это решить. Я установил размер буфера равным 64, чтобы убедиться, что любые прочитанные данные поместятся в памяти. Фактические данные имеют длину 18 байт.

Любые подсказки?


person Guilherme    schedule 29.03.2014    source источник
comment
Блин, наверное ты прав (буду тестировать, чтобы убедиться). Было так поздно, я, должно быть, так хотел спать... до сих пор не могу поверить, что проглядел это.   -  person Guilherme    schedule 29.03.2014
comment
@MattMcNabb да, это так. Напишите это как ответ, чтобы я мог отметить как правильный.   -  person Guilherme    schedule 29.03.2014


Ответы (1)


Эти два утверждения должны быть наоборот:

dataBuffer = (char *)malloc(numBytes); 
numBytes = 64;
person M.M    schedule 30.03.2014