diff --git a/lib/exprengine.cpp b/lib/exprengine.cpp index 19ab93b57..0cfdb45ef 100644 --- a/lib/exprengine.cpp +++ b/lib/exprengine.cpp @@ -337,6 +337,7 @@ namespace { , tokenizer(tokenizer) , callbacks(callbacks) , recursion(0) + , startTime(std::time(nullptr)) , mTrackExecution(trackExecution) , mDataIndex(trackExecution->getNewDataIndex()) {} typedef std::map Memory; @@ -347,6 +348,7 @@ namespace { const std::vector &callbacks; std::vector constraints; int recursion; + std::time_t startTime; ExprEngine::ValuePtr executeContract(const Function *function, ExprEngine::ValuePtr(*executeExpression)(const Token*, Data&)) { const auto it = settings->functionContracts.find(function->fullName()); @@ -2253,9 +2255,15 @@ static std::string execute(const Token *start, const Token *end, Data &data) caseData.addConstraint(condValue, caseValue, true); defaultData.addConstraint(condValue, caseValue, false); exec(tok2->tokAt(2), end, caseData); + // After 1 minute processing a function.. only check first case.. + if (std::time(nullptr) > data.startTime + 60) + break; } else if (Token::Match(tok2, "case %name% :") && !Token::Match(tok2->tokAt(3), ";| case")) { Data caseData(data); exec(tok2->tokAt(2), end, caseData); + // After 1 minute processing a function.. only check first case.. + if (std::time(nullptr) > data.startTime + 60) + break; } else if (Token::simpleMatch(tok2, "default :")) defaultStart = tok2; }