Skip to main content
GameDev.net gamedev.net
🔒 Locked

Runtime assert failure using boost::regex

Started by _Sigma Jun 13, 2007 at 5:08 PM 4 replies 3.5k views
Original Post
_Sigma
_Sigma
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... 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*\\.[Ss][Cc][Rr][Ii][Pp]" ;
							

	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(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]
Zahlman
Zahlman
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 :)
_Sigma
_Sigma
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?
_Sigma
_Sigma
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\xstringLine: 111Expression: string iterator not dereferencableFor information on how your program can cause an assertionfailure, 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*\\.[Ss][Cc][Rr][Ii][Pp]" ;								//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?
Zahlman
Zahlman
Does it work in isolation (i.e. in a separate program with just that work being done in main())?
_Sigma
_Sigma
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]

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.