Ошибка времени выполнения при назначении значения целому числу без знака - PullRequest
1 голос
/ 28 января 2011

Я только что столкнулся с очень специфической проблемой. Когда я пытаюсь присвоить значение определенной переменной unsigned int (без проблем с другими переменными unsigned int), либо с помощью memcpy, либо с помощью оператора =, программа завершается с ошибкой во время выполнения. Это не всегда происходит с одной запущенной программой, но всегда происходит, когда я запускаю второй экземпляр. Я тщательно проверил код, комментируя разные вещи, так что я почти уверен, что проблема заключается в присвоении значений.

Большое спасибо заранее.

DWORD WINAPI RecvFunc(void* lpParameter)
{
  BYTE header[5];
  short size, datasize; // must be unsigned, changed to signed for testing
  int num;
  BYTE* data;
  BYTE opcode;

  while(true)
  {
    size = 0;

    while(size < 5)
    {
      num = recv(sock, (char*)(header + size), 5 - size, 0);

      if(num <= 0)
      {
        size = 0;
        break;
      }

      //MessageBox(g_hwnd, "Header piece ok", "", MB_OK);
      size += num;
    }

    if(size == 0)
    {
      //MessageBox(g_hwnd, "Header error", "", MB_OK);
      continue;
    }

    opcode = header[0];
    memcpy(&datasize, header + 1, sizeof(datasize));

    if(datasize > 5)
    {
      data = new BYTE[datasize - 5];
    }else{
      data = NULL;
    }

    while(size < datasize)
    {
      num = recv(sock, (char*)(data + size - 5), datasize - size, 0);

      //MessageBox(g_hwnd, "Packet post-recv", "", MB_OK);

      if(num <= 0)
      {
        size = 0;
        break;
      }

      size += num;
    }

    if(size == 0)
    {
      //MessageBox(g_hwnd, "Packet error", "", MB_OK);
      delete[] data;
      continue;
    }

    size -= 5;

    //MessageBox(g_hwnd, "Received a command", "New cmd", MB_OK);

    switch(opcode)
    {
       ...
    }

    if(data != NULL)
    {
      delete[] data;
    }
  }
}

1 Ответ

0 голосов
/ 28 января 2011

Присвоение переменной unsigned int не является реальной причиной вашей проблемы, я вас уверяю :) Скорее всего, у вас переполнение буфера где-то еще в вашей программе.

...