Функция имеет неверное возвращаемое значение - PullRequest
0 голосов
/ 09 февраля 2010

У меня есть ситуация в Visual C ++ 2008, которую я не видел раньше. У меня есть класс с 4 объектами STL (точнее, списком и вектором) и целыми числами.

У него есть метод:

inline int id() { return m_id; }

Возвращаемое значение этого метода повреждено, и я понятия не имею, почему.

скриншот отладчика http://img687.imageshack.us/img687/6728/returnvalue.png

Я бы хотел верить, что это стек, но, насколько я знаю, у меня нет проблем с переполнением буфера или распределением.


Еще несколько замечаний Вот что меня отталкивает. Отладчик печатает правильные значения в указанном месте // неправильный идентификатор.

  m_header = new DnsHeader();
  assert(_CrtCheckMemory());

  if (m_header->init(bytes, size))
  {
    eprintf("0The header ID is %d\n", m_header->id()); // wrong ID!!!

внутри m_header-> init ()

 m_qdcount = ntohs(h->qdcount);
    m_ancount = ntohs(h->ancount);
    m_nscount = ntohs(h->nscount);
    m_arcount = ntohs(h->arcount);
    eprintf("The details are %d,%d,%d,%d\n", m_qdcount, m_ancount, m_nscount, m_arcount);

    // copy the flags
    // this doesn't work with a bitfield struct :(
    // memcpy(&m_flags, bytes + 2, sizeof(m_flags));
    //unpack_flags(bytes + 2); //TODO
    m_init = true;
  }
  eprintf("Assigning an id of %d\n", m_id); // Correct ID.
  return

m_header-> id () - встроенная функция в заголовочном файле

inline int id() { return m_id; }

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

Класс DnsHeader имеет объект m_header внутри DnsPacket.

Основной корпус:

DnsPacket *p ;
p = new DnsPacket(r);
assert (_CrtCheckMemory());
p->add_bytes(buf, r); // add bytes to a vector m_bytes inside DnsPacket
if (p->parse())
{
read_packet(sin, *p);
}

p-> синтаксического анализа:

size_t size = m_bytes.size(); // m_bytes is a vector
  unsigned char *bytes = new u_char[m_bytes.size()];
  copy(m_bytes.begin(), m_bytes.end(), bytes); 

m_header = new DnsHeader();
  eprintf("m_header allocated at %x\n", m_header);
  assert(_CrtCheckMemory());
  if (m_header->init(bytes, size)) // just set the ID and a bunch of other ints here.
{
    size_t pos = DnsHeader::SIZE; // const int
    if (pos != size)
      ; // XXX perhaps generate a warning about extraneous data?

    if (ok)
      m_parsed = true;

  }
  else
  {
    m_parsed = false;
  }

  if (!ok) {
    m_parsed = false;
  }
  return m_parsed;
}

read_packet:

  DnsHeader& h = p.header();
  eprintf("The header ID is %d\n", h.id()); // ID is wrong here
...

Конструктор DnsHeader:

m_id = -1;
  m_qdcount = m_ancount = m_nscount = m_arcount = 0;

  memset(&m_flags, 0, sizeof(m_flags)); // m_flags is a struct
  m_flags.rd = 1;

p.header ():

return *m_header;

m_header-> init: (u_char * байт, размер int)

header_fmt *h = (header_fmt *)bytes;
m_id = ntohs(h->id);
eprintf("Assigning an id of %d/%d\n", ntohs(h->id), m_id); // ID is correct here
m_qdcount = ntohs(h->qdcount);
m_ancount = ntohs(h->ancount);
m_nscount = ntohs(h->nscount);
m_arcount = ntohs(h->arcount);

Ответы [ 3 ]

4 голосов
/ 09 февраля 2010

Кажется, вы как-то используете указатель на недопустимый класс. Показанное возвращаемое значение - это значение, которое VS обычно использует для инициализации памяти:

2^32 - 842150451 = 0xCDCDCDCD
1 голос
/ 09 февраля 2010
  1. Возможно, вы не инициализировали класс, членом которого является эта функция.
  2. Не видя больше кода в контексте ... возможно, m_id находится вне области видимости, в которой вы его ожидаете.
0 голосов
/ 10 февраля 2010

Переустановил VC ++. Это все исправило.

Спасибо за ваше время и поддержку всем! :) Цени это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...