应用程序崩溃,同时在字符串上附加数据

时间:2014-07-23 20:16:57

标签: c++ string macos stdstring

我有一个跨平台控制台应用程序。它的目的是在两个对等体之间传输数据。有时收到的数据包不完整,所以我们在完整数据包到达时将数据附加到字符串中。但是在一段时间之后,它会在字符串中附加数据时崩溃。这是后面的目标 -

1 libsystem_c.dylib 0x93b77acf pthread_kill + 101
2 libsystem_c.dylib 0x93bae4f8 abort + 168
3 libc++abi.dylib 0x9698180c abort_message + 151
4 libc++abi.dylib 0x9697f275 default_terminate() + 34
5 libc++abi.dylib 0x9697f2b5 safe_handler_caller(void (*)()) + 13
6 libc++abi.dylib 0x9697f31d std::terminate() + 23
7 libc++abi.dylib 0x96980412 __cxa_throw + 110
8 libstdc++.6.dylib 0x90e23d6c std::__throw_length_error(char const*) + 104
9 libstdc++.6.dylib 0x90e4f3a9 std::string::append(char const*, unsigned long) + 175
10 libConnector.dylib 0x13905228 ConnectionSocket::AdjustPartialData(char const*, int) 
14 libConnector.dylib 0x1383e0b6 ConnectionChannel::ProcessData(int, void const*, int, char*, int) + 7886
15 libConnector.dylib 0x13861ecb ConnectionManager::BaseThreadImpl() + 1185
16 libConnector.dylib 0x13861a23 ConnectionManager::BaseThread(void*) + 17
17 libsystem_c.dylib 0x93b76557 _pthread_start + 344
18 libsystem_c.dylib 0x93b60cee thread_start + 34 

有人可以对此问题有所了解吗?

示例代码:

AdjustPartialData(char* const pData, int dataLen)
{
   if (true == packetIncomplete)
   {
      partialDataBuffer.append(pData, dataLen); // crash occurs in this line
   }

 }

2 个答案:

答案 0 :(得分:2)

如果partialDataBuffer.size()+ dataLen> partialDataBuffer。max_size()然后追加抛出一个length_error(http://en.cppreference.com/w/cpp/string/basic_string/append

partialDataBuffer或dataLen太大了。

答案 1 :(得分:0)

最后,我通过丢弃导致溢出的额外数据来解决问题。以前我认为这不是可行的解决方案,因为它可能导致数据丢失。但我发现TCP流大小不应该大于65535,即16位。但是在添加以下条件时发现了另一个问题 -

if(partialDataBuffer.size() + dataLen >= partialDataBuffer.max_size())
{
 // do not append data
}
else  partialDataBuffer.append(pData, dataLen);

问题是在Windows平台上,即使 partialDataBuffer 的大小远小于 partialDataBuffer.max_size(),它也总是崩溃。所以,为了解决这个问题,我做了以下几点 -

try{
 partialDataBuffer.append(pData, dataLen);
}
catch(...)
{
// got exception, return
}

它对我来说很好。

N.B:我已经发布了我的答案,因为这对面临类似问题的其他人有帮助。