I have been getting a really annoying error about an std::out_of_range when calling substr. The exact error is
terminate called after throwing an
instance of ‘std::out_of_range’
what(): basic_string::substr
I’m absolutely sure that tmp_request has a length greater then 1. No matter what I pass to substr—1, 2, or bodypos—it always throws that error. I’m using g++ on Unix.
Only interesting thing I can include is the string has multiple "\r\n", including one "\r\n\r\n".
In one cpp file:
std::string tmp_request, outRequest;
tmp_request = SS_Twitter->readData();
outRequest = SS_Twitter->parse(tmp_request);
In another:
std::string parse(const std::string &request)
{
std::map<std::string,std::string> keyval;
std::string outRequest;
if(request[0]=='P')
{
if(request.find("register")!=std::string::npos)
{ //we have a register request
size_t bodypos = request.find("username");
if(bodypos==std::string::npos)
{
HttpError(400,"Malformed HTTP POST request. Could not find key username.",request);
}
else
{
std::string body = request.substr(bodypos);
StringExplode(body,"&", "=",keyval);
outRequest = "doing stuff";
}
}
Update:
std::string request2("P\r\nregister\r\nusername=hello\r\n\r\n");
std::string body = request2.substr(4);
That throws the same error. Now I know this is perfectly valid and correct code, but it’s still throwing the error.
//removed source link
I modified your sample slightly to decrease amount of indentation used.
There are 5 “test cases” and none causes any problem. Could you please provide a sample request to reproduce the problem you’re having.
EDIT: Forgot to mention: if this sample as it is (with commented-out bits) doesn’t produce that error, your best bet is that you have a bug in your
StringExplodefunction. You could post its source, to get a more helpful advice.EDIT2:
In your
StringExplode, changeresults[tmpKey] = tmpKey.substr(found+1);toresults[tmpKey] = tmpResult[i].substr(found+1);. Changeint foundtosize_t found, and remove all ofif (found > 0), that will fix your mysterious out_of_range. You weresubstr-ing a wrong string. Just in case, here’s the code with a fix:Initial test code:
This outputs, predictably: