diff options
author | Neil <nyamatongwe@gmail.com> | 2014-05-14 11:29:10 +1000 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2014-05-14 11:29:10 +1000 |
commit | dba0764a6759c3ba067aa124906ef3bfed5b87a3 (patch) | |
tree | 800b62fa09a68a24baaca6cf63b3162533ae0500 /lexers/LexCPP.cxx | |
parent | dc78daffd7e13ad219a0a0102869ebe6cdccbf87 (diff) | |
download | scintilla-mirror-dba0764a6759c3ba067aa124906ef3bfed5b87a3.tar.gz |
Limit iterations when expanding macros in case a macro is recursive such as
#define MAC(x) MAC(x+1)
Also fixes macros that are co-recursive with other macros.
Diffstat (limited to 'lexers/LexCPP.cxx')
-rw-r--r-- | lexers/LexCPP.cxx | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/lexers/LexCPP.cxx b/lexers/LexCPP.cxx index d884c212f..9e99b5ce8 100644 --- a/lexers/LexCPP.cxx +++ b/lexers/LexCPP.cxx @@ -1412,7 +1412,10 @@ void LexerCPP::EvaluateTokens(std::vector<std::string> &tokens, const SymbolTabl } // Evaluate identifiers - for (size_t i=0; i<tokens.size();) { + const size_t maxIterations = 100; + size_t iterations = 0; // Limit number of iterations in case there is a recursive macro. + for (size_t i = 0; (i<tokens.size()) && (iterations < maxIterations);) { + iterations++; if (setWordStart.Contains(static_cast<unsigned char>(tokens[i][0]))) { SymbolTable::const_iterator it = preprocessorDefinitions.find(tokens[i]); if (it != preprocessorDefinitions.end()) { |