буст-тест и асинхронный ввод-вывод: нарушение доступа к памяти по адресу: сопоставление по адресу ошибки

я пытаюсь настроить буст-тест для асинхронного ввода-вывода для tcpip.

моя функция отправлять tcp msg:

    int TcpClient::sendMsgToServer(string msg) {
if (isConnected == true) {
Logger::debug("Asynch send request for msg: " + msg, __LINE__,
__FILE__);
sendSequence++;
msg.append("\r\n");
int length = msg.length() + 2; //+2 is for \r\n
char* buffer = (char*) msg.c_str();
Logger::debug(buffer, __LINE__, __FILE__);
m_Socket.async_send(boost::asio::buffer(buffer, length),
boost::bind(&fingigcc::TcpClient::sendMsgToServerErrorHandler,
this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
std::string sentMsg = "Sent Msg: " + msg;
Logger::debug(sentMsg, __LINE__, __FILE__);return 0;
} else {
return -1;
}

}

void TcpClient::sendMsgToServerErrorHandler(
const boost::system::error_code& error, std::size_t bytes_transferred) {
Logger::debug("Sending complete: ", __LINE__, __FILE__);
sendResponseSequence++;
int i = error.value();
std::stringstream ss;
ss.clear();
ss << i;
Logger::debug("RESULTCODE: " + ss.str(), __LINE__, __FILE__);
if (i == 0) {
Logger::debug("RESULT: " + error.message(), __LINE__, __FILE__);

} else {
Logger::crit(error.message(), __LINE__, __FILE__);
m_Socket.close();
isConnected = false;
connectionStateChanged(isConnected);
}

}

теперь эта функция работает нормально, если я просто запускаю ее в главном потоке (не работает, выполняя буст-тест)

моя функция буст-теста выглядит так:

BOOST_AUTO_TEST_CASE( CommunicationCore_sendTcpIpMsg_test ) {

CommunicationCoreFixture f;
int compare = f.c->initializeTcpIpConnection(serverAddress, serverPort); // i initialize the connection here. runs fine with any issue
sleep(2);
compare = f.c->sendMsgToServer("IDENTIFY console-2");
BOOST_MESSAGE("Sending returned value : " << compare);
BOOST_CHECK(compare == 0);
}

и это терпит неудачу со следующей ошибкой:

    Entering test case "CommunicationCore_sendTcpIpMsg_test"unknown location(0): fatal error in "CommunicationCore_sendTcpIpMsg_test": memory access violation at address: 0x01003255: no mapping at fault address
*****************Test is aborted

Что я должен знать при тестировании таких асинхронных функций?

моя информация о сборке:

Platform: linux
Compiler: GNU C++ version 4.7.2
STL     : GNU libstdc++ version 20120920
Boost   : 1.49.0

РЕДАКТИРОВАТЬ:

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

int TcpClient::sendMsgToServer(string msg) {
if (isConnected == true) {
Logger::debug("Asynch send request for msg: " + msg, __LINE__,
__FILE__);
sendSequence++;
msg.append("\r\n");
char *buffer = new char[msg.size() + 1];
buffer[msg.size()] = 0;
memcpy(buffer, msg.c_str(), msg.size());
Logger::debug(buffer, __LINE__, __FILE__);

m_Socket.async_send(boost::asio::buffer(buffer, (msg.size() + 1)),
boost::bind(&fingigcc::TcpClient::sendMsgToServerErrorHandler,
this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
std::string sentMsg = "Sent Msg: " + msg;
Logger::debug(sentMsg, __LINE__, __FILE__);return 0;
} else {
return -1;
}

}

1

Решение

m_Socket.async_send(boost::asio::buffer(buffer, length) — но msg объект является локальным, и его c_str() результат становится недействительным после msg выходит за рамки! Таким образом, вы на самом деле передать временный буфер асинхронной операции. Буфер не переживает эту операцию, поэтому segfault неизбежен.

3

Другие решения

Других решений пока нет …