C++ передаётся по ссылке, меняя значения указателя на меня в LP64. На что мне смотреть?

Я глубоко в старой версии (1.3.4) synergy-project.org, построив ее на Solaris Studio 12.4 В этой программе есть 2 места, где функция вызывается с указателем на аргумент, и указатель искажается на путь в. Компилирование и компоновка в -m64. Что я могу посмотреть в флагах сборки или других, чтобы выяснить, почему это Haywire? В журнале ниже программа остановлена ​​внутри функции, которая видит неправильный указатель. Его родитель ("вверх" в стеке) имеет правильные данные:

(dbx) print &event
&event = 0x948d30
(dbx) up          
Current function is TMethodEventJob<CXWindowsScreen>::run
 66                   (m_object->*m_method)(event, m_arg);
(dbx) print &event
&event = 0xffff80f8be958a60

(dbx) down
(dbx) print event
event = {
m_type   = 7354752U
m_target = 0x7091a0
m_data   = 0x7036a0
m_flags  = 6257120U
}
(dbx) up        
Current function is TMethodEventJob<CXWindowsScreen>::run
   66                   (m_object->*m_method)(event, m_arg);
(dbx) print event
event = {
m_type   = 2U
m_target = 0x94ee80
m_data   = 0xc838b0d68
m_flags  = 0
}

Код:

void
CClientProxy1_0::handleData(const CEvent&, void*)
{
    // handle messages until there are no more.  first read message code.
    UInt8 code[4];
    UInt32 n = getStream()->read(code, 4);
    while (n != 0) {
            // verify we got an entire code
            if (n != 4) {
                    LOG((CLOG_ERR "incomplete message from \"%s\": %d bytes", getName().c_str(), n));
                    disconnect();
                    return;
            }

            // parse message
            LOG((CLOG_DEBUG2 "msg from \"%s\": %c%c%c%c", getName().c_str(), code[0], code[1], code[2], code[3]));
          if (!(this->*m_parser)(code)) {

... где m_parser разрешает:

bool
CClientProxy1_0::parseHandshakeMessage(const UInt8* code)
{
    if (memcmp(code, kMsgCNoop, 4) == 0) {
            // discard no-ops
            LOG((CLOG_DEBUG2 "no-op from", getName().c_str()));
            return true;
    }
    else if (memcmp(code, kMsgDInfo, 4) == 0) {
            // future messages get parsed by parseMessage
            m_parser = &CClientProxy1_0::parseMessage;
            if (recvInfo()) {
                    EVENTQUEUE->addEvent(CEvent(getReadyEvent(), getEventTarget()));
                    addHeartbeatTimer();
                    return true;
            }
    }
    return false;
}
}

... Обратите внимание, как m_parser перезагружается по мере продвижения протокола связи.

В ответ на вопрос о входе в функцию: он прерывается при входе в функцию и вскоре вызывает сбой функции. Если я жестко закодирую parseHandshakeMessage() в handleData(), он будет работать правильно. Однако у меня есть другие примеры в этой системе, которые полагаются на указатели функций для правильной работы. Я могу опубликовать флаги компиляции, они избыточны и обширны.

1 ответ

Попробуйте скомпилировать все с помощью "+W2 -xport64".

Это может генерировать много ошибок / предупреждений. В идеале ваш код должен быть чист от всех предупреждений, особенно тех, которые генерируются из "-xport64".

Другие вопросы по тегам