Sign in to follow this  

Runtime assert failure using boost::regex

This topic is 3869 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm trying to use boost::regex to extract strings (#include directive to be exact) that is being used in my scripting language. Yet, when I trying running it, I get a runtime assert failure
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: ...
File: .\xstring
Line: 85

Expression: ("_Pstring == NULL || _Ptr != NULL && ((_Mystring *)_Pstring)->_Myptr() <= _Ptr && _Ptr <= (((_Mystring *)_Pstring)->_Myptr() + ((_Mystring *)_Pstring)->_Mysize)", 0)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
Abort   Retry   Ignore   
---------------------------




Which kinda sucks...<BG> it happens on this line: boost::regex_search(start, end, what, expression,flags), which is being used like thus: Calling function
void TScript::AddScript(std::string scriptPath)
{
	
	int r = 0; //return value from AS
	size_t len = 0; //length of script
	std::string script; //holds script
	std::string sname; //name used to reference script
	
	const char* re = "#include[\t[:space:]]*\"\\w*\\.[tT][Ss][Cc][Rr][Ii][Pp][Tt]" ;
							

	std::string::const_iterator start, end;
	boost::regex expression(re);
	boost::match_results<std::string::const_iterator> what;
	boost::match_flag_type flags = boost::match_default;

	//load script from file on disk
	try
	{
		 m_script.readFile(scriptPath.c_str());
		 script = m_script.lookup("Script.script");
		 sname = m_script.lookup("Script.scriptName");
		 len = script.length();
	}
	catch (libconfig::ParseException& e) 
	{
		throw TFatalException("Script: Error on line: " +  boost::lexical_cast<std::string>(e.getLine()) + 
			". Error: " + boost::lexical_cast<std::string>(e.getError()) + " In file: " + scriptPath 
			+ "  \n\n Stack:\nTScript::CompileScript()");
	}
	catch (libconfig::FileIOException& e) 
	{
		throw TFatalException("Failed to load script file. \n\nReason: Failed to open file " + scriptPath 
			+ ".\n  Stack:\n TScript::CompileScript()");
	}
	catch(libconfig::SettingNotFoundException &e)
	{
		throw TFatalException("A required setting in " + scriptPath + "was not found. \n\n Stack: TScript::CompileScript()\n");
	}
	catch (...)
	{
		throw TFatalException("Unknown error parsing " + scriptPath + " \n in TScript::CompileScript()" );
	}

	//init iterators
	start = script.begin();
	end = script.end();

	while(boost::regex_search(start, end, what, expression,flags))   //<- this line here
	{
		//what[0] will hold the entire include directive, ie: #include "myScript.tscript"
		std::string newScript = boost::lexical_cast<std::string>(what[0]);
		
		// update search position:
		start = what[0].second;      

	}

	// Add the script sections that will be compiled into executable code.
	// If we want to combine more than one file into the same script, then 
	// we can call AddScriptSection() several times for the same module and
	// the script engine will treat them all as if they were one. The script
	// section name, will allow us to localize any errors in the script code.
	r = m_engine->AddScriptSection(0, sname.c_str(), &script[0], len, 0, true);

	if( r < 0 ) 
	{
		TLog::GetInstance().LogMessage("TScript::CompileScript","AddScriptSection() failed on" + scriptPath,MSG_ERROR);

		throw TFatalException("AddScriptSection() failed on " + scriptPath + "\n\nIn:\nTScript::CompileScript() ");
	}	
}


The usage of boost::regex has more or less been copied from here. On a side note, I'm pretty sure std::string newScript = boost::lexical_cast<std::string>(what[0]); is not valid either. How do I cast from the string iterator to a string? (I suck with the STL!) Many thanks, //edit: If I take out the offending lines, boost::regex expression(re); triggers the same error as well. [Edited by - _Sigma on June 13, 2007 6:44:45 PM]

Share this post


Link to post
Share on other sites
Backslashes in regular expression strings are subject to two levels of escaping: once by the compiler, and once by the regular expression engine. (Perl gets around this by building the regex engine directly into the language.) You should therefore have *four* backslashes in a row to encode a literal backslash in your pattern, or *two* followed by a t to match a literal tab, for example. Otherwise you feed an actual tab or single backslash to the regex engine, and mayhem ensues. I don't know anything about the Boost regexes in particular, though, so there might be another problem triggering the assertion.

Also, you should maybe check the documentation for a way to do case-insensitive matching :)

Share this post


Link to post
Share on other sites
Didn't seem to make a difference :(. Either way, thanks for pointing out the missing '\' in front of the t.

Quote:
Also, you should maybe check the documentation for a way to do case-insensitive matching :)
How do you do that in RegEx?

Share this post


Link to post
Share on other sites
I've been playing around with this, and there is a new error:

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: ...
File: C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE\xstring
Line: 111

Expression: string iterator not dereferencable

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
Abort Retry Ignore
---------------------------


For this code:

const char* expression = "#include[\\t[:space:]]*\"\\w*\\.[tT][Ss][Cc][Rr][Ii][Pp][Tt]" ;


//std::string::const_iterator start, end;
boost::regex re;
// Set up the regular expression for case-insensitivity
try
{
//this line here
re.assign(expression,boost::regex_constants::icase );
}
catch (boost::regex_error e)
{
throw TFatalException("not a valid regular expression\n.");
}




anyone have any idea?

Share this post


Link to post
Share on other sites
Does it work in isolation (i.e. in a separate program with just that work being done in main())?

Share this post


Link to post
Share on other sites
yeah...bummer.

what should I start looking for in my main app?

//edit
Intersting...I had this error, and didn't think much of it (whoops!). I rebuild a library to use debug runtimes, and it is a go.

[Edited by - _Sigma on June 15, 2007 5:23:06 PM]

Share this post


Link to post
Share on other sites
Sign in to follow this