2015-01-09 5 views
0

나는 synergy-project.org의 오래된 버전 (1.3.4)을 Solaris Studio 12.4에 설치했다. 이 프로그램에는 인수를위한 포인터로 함수가 호출되는 곳이 두 곳 있으며, 포인터가 길에 맹 글링됩니다. -m64에서 컴파일 및 링크. 내가 깃발을 만들 때 무엇을 볼 수 있습니까? 또는 다른 이유가 이것이 왜곡입니다. 아래 로그에서 프로그램이 잘못된 포인터를 보는 함수 안에서 중단됩니다.C++은 LP64에서 나와 포인터 값을 변경하는 참조로 전달합니다. 내가 뭘 봐야하니?

(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; 
} 
} 

.. comm 프로토콜이 이동할 때 m_parser가 어떻게 다시로드되는지 주목하십시오.

함수로 들어가는 것에 대한 대답은 함수에 입력 할 때 깨지므로 이며 곧 함수가 중단됩니다. "parseHandshakeMessage()를 handleData()에 하드 코딩하면 올바르게 작동하지만,이 함수는 포인터가 올바르게 작동하는 데 의존하는 다른 예제가 있습니다. 컴파일 플래그를 게시 할 수 있습니다. 중복되고 광범위합니다.

+2

을 수 해당하는 C++ 코드 조각도 게시 하시겠습니까? 또한 인수가 실제로 초기화 된 시점에서 프로그램을 중지 했습니까? 아마도 호출 수신자 또는 첫 번째 줄을 넘어야 할 수도 있습니다. –

+0

[MCVE] (http://stackoverflow.com/help/mcve)를 만드는 것이 최선의 방법입니다. 버그를 만들 수 없다면 (즉, 코드를 제거 할 때 버그가 사라집니다) 버그가 어디에서 왔는지에 대한 단서가됩니다. –

답변

0

"+ W2의 -xport64"에 모든 것을 컴파일하십시오. 오류/경고를 많이 생성 할 수 있습니다

을. 이상적으로 코드가 "-xport64"에서 생성 특히, 모든 경고의 깨끗해야한다.