Fix crash on infinite macro expansion
This commit is contained in:
parent
1931f25475
commit
8161ff88a8
|
@ -35,7 +35,7 @@ void Errors::Error(const Location& loc, ErrorID eid, const char* msg, const char
|
||||||
else
|
else
|
||||||
fprintf(stderr, "%s(%d, %d) : %s %d: %s\n", loc.mFileName, loc.mLine, loc.mColumn, level, eid, msg);
|
fprintf(stderr, "%s(%d, %d) : %s %d: %s\n", loc.mFileName, loc.mLine, loc.mColumn, level, eid, msg);
|
||||||
|
|
||||||
if (mErrorCount > 10)
|
if (mErrorCount > 10 || eid >= EFATAL_GENERIC)
|
||||||
exit(20);
|
exit(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,6 @@ enum ErrorID
|
||||||
EERR_RUNTIME_CODE,
|
EERR_RUNTIME_CODE,
|
||||||
EERR_UNIMPLEMENTED,
|
EERR_UNIMPLEMENTED,
|
||||||
EERR_COMMAND_LINE,
|
EERR_COMMAND_LINE,
|
||||||
EERR_OUT_OF_MEMORY,
|
|
||||||
EERR_OBJECT_NOT_FOUND,
|
EERR_OBJECT_NOT_FOUND,
|
||||||
EERR_SYNTAX,
|
EERR_SYNTAX,
|
||||||
EERR_EXECUTION_FAILED,
|
EERR_EXECUTION_FAILED,
|
||||||
|
@ -86,6 +85,10 @@ enum ErrorID
|
||||||
ERRR_INVALID_NUMBER,
|
ERRR_INVALID_NUMBER,
|
||||||
|
|
||||||
EERR_INVALID_PREPROCESSOR,
|
EERR_INVALID_PREPROCESSOR,
|
||||||
|
|
||||||
|
EFATAL_GENERIC = 4000,
|
||||||
|
EFATAL_OUT_OF_MEMORY,
|
||||||
|
EFATAL_MACRO_EXPANSION_DEPTH,
|
||||||
};
|
};
|
||||||
|
|
||||||
class Errors
|
class Errors
|
||||||
|
|
|
@ -318,6 +318,7 @@ Scanner::Scanner(Errors* errors, Preprocessor* preprocessor)
|
||||||
mAssemblerMode = false;
|
mAssemblerMode = false;
|
||||||
mPreprocessorMode = false;
|
mPreprocessorMode = false;
|
||||||
mMacroExpansion = nullptr;
|
mMacroExpansion = nullptr;
|
||||||
|
mMacroExpansionDepth = 0;
|
||||||
|
|
||||||
mDefines = new MacroDict();
|
mDefines = new MacroDict();
|
||||||
mDefineArguments = nullptr;
|
mDefineArguments = nullptr;
|
||||||
|
@ -817,6 +818,9 @@ void Scanner::NextToken(void)
|
||||||
ex->mChar = mTokenChar;
|
ex->mChar = mTokenChar;
|
||||||
|
|
||||||
mMacroExpansion = ex;
|
mMacroExpansion = ex;
|
||||||
|
mMacroExpansionDepth++;
|
||||||
|
if (mMacroExpansionDepth > 1024)
|
||||||
|
mErrors->Error(mLocation, EFATAL_MACRO_EXPANSION_DEPTH, "Maximum macro expansion depth exceeded", mTokenIdent);
|
||||||
mLine = def->mString;
|
mLine = def->mString;
|
||||||
mOffset = 0;
|
mOffset = 0;
|
||||||
NextChar();
|
NextChar();
|
||||||
|
@ -1812,6 +1816,8 @@ bool Scanner::NextChar(void)
|
||||||
|
|
||||||
delete mMacroExpansion;
|
delete mMacroExpansion;
|
||||||
mMacroExpansion = mac;
|
mMacroExpansion = mac;
|
||||||
|
mMacroExpansionDepth--;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (mPreprocessor->NextLine())
|
else if (mPreprocessor->NextLine())
|
||||||
|
|
|
@ -259,6 +259,8 @@ protected:
|
||||||
MacroDict* mDefinedArguments;
|
MacroDict* mDefinedArguments;
|
||||||
} * mMacroExpansion;
|
} * mMacroExpansion;
|
||||||
|
|
||||||
|
int mMacroExpansionDepth;
|
||||||
|
|
||||||
MacroDict* mDefines, * mDefineArguments;
|
MacroDict* mDefines, * mDefineArguments;
|
||||||
|
|
||||||
Token mUngetToken;
|
Token mUngetToken;
|
||||||
|
|
Loading…
Reference in New Issue