@@ -334,7 +334,7 @@ static void fillProgramMemoryFromConditions(ProgramMemory& pm, const Token* tok,
334334 fillProgramMemoryFromConditions (pm, tok->scope (), tok, settings);
335335}
336336
337- static void fillProgramMemoryFromAssignments (ProgramMemory& pm, const Token* tok, const ProgramMemory& state, const ProgramMemory::Map& vars)
337+ static void fillProgramMemoryFromAssignments (ProgramMemory& pm, const Token* tok, const Settings* settings, const ProgramMemory& state, const ProgramMemory::Map& vars)
338338{
339339 int indentlevel = 0 ;
340340 for (const Token *tok2 = tok; tok2; tok2 = tok2->previous ()) {
@@ -357,7 +357,7 @@ static void fillProgramMemoryFromAssignments(ProgramMemory& pm, const Token* tok
357357 }
358358 }
359359 } else if (tok2->exprId () > 0 && Token::Match (tok2, " .|(|[|*|%var%" ) && !pm.hasValue (tok2->exprId ()) &&
360- isVariableChanged (tok2, 0 , nullptr , true )) {
360+ isVariableChanged (tok2, 0 , settings , true )) {
361361 pm.setUnknown (tok2);
362362 }
363363
@@ -403,13 +403,14 @@ static void removeModifiedVars(ProgramMemory& pm, const Token* tok, const Token*
403403
404404static ProgramMemory getInitialProgramState (const Token* tok,
405405 const Token* origin,
406+ const Settings* settings,
406407 const ProgramMemory::Map& vars = ProgramMemory::Map {})
407408{
408409 ProgramMemory pm;
409410 if (origin) {
410411 fillProgramMemoryFromConditions (pm, origin, nullptr );
411412 const ProgramMemory state = pm;
412- fillProgramMemoryFromAssignments (pm, tok, state, vars);
413+ fillProgramMemoryFromAssignments (pm, tok, settings, state, vars);
413414 removeModifiedVars (pm, tok, origin);
414415 }
415416 return pm;
@@ -447,7 +448,7 @@ void ProgramMemoryState::addState(const Token* tok, const ProgramMemory::Map& va
447448 addVars (pm, vars);
448449 fillProgramMemoryFromConditions (pm, tok, settings);
449450 ProgramMemory local = pm;
450- fillProgramMemoryFromAssignments (pm, tok, local, vars);
451+ fillProgramMemoryFromAssignments (pm, tok, settings, local, vars);
451452 addVars (pm, vars);
452453 replace (pm, tok);
453454}
@@ -501,34 +502,15 @@ ProgramMemory ProgramMemoryState::get(const Token* tok, const Token* ctx, const
501502 return local.state ;
502503}
503504
504- ProgramMemory getProgramMemory (const Token *tok, const ProgramMemory::Map& vars)
505- {
506- ProgramMemory programMemory;
507- for (const auto & p:vars) {
508- const ValueFlow::Value &value = p.second ;
509- programMemory.replace (getInitialProgramState (tok, value.tokvalue ));
510- programMemory.replace (getInitialProgramState (tok, value.condition ));
511- }
512- fillProgramMemoryFromConditions (programMemory, tok, nullptr );
513- ProgramMemory state;
514- for (const auto & p:vars) {
515- const ValueFlow::Value &value = p.second ;
516- programMemory.setValue (p.first .tok , value);
517- }
518- state = programMemory;
519- fillProgramMemoryFromAssignments (programMemory, tok, state, vars);
520- return programMemory;
521- }
522-
523505ProgramMemory getProgramMemory (const Token* tok, const Token* expr, const ValueFlow::Value& value, const Settings* settings)
524506{
525507 ProgramMemory programMemory;
526- programMemory.replace (getInitialProgramState (tok, value.tokvalue ));
527- programMemory.replace (getInitialProgramState (tok, value.condition ));
508+ programMemory.replace (getInitialProgramState (tok, value.tokvalue , settings ));
509+ programMemory.replace (getInitialProgramState (tok, value.condition , settings ));
528510 fillProgramMemoryFromConditions (programMemory, tok, settings);
529511 programMemory.setValue (expr, value);
530512 const ProgramMemory state = programMemory;
531- fillProgramMemoryFromAssignments (programMemory, tok, state, {{expr, value}});
513+ fillProgramMemoryFromAssignments (programMemory, tok, settings, state, {{expr, value}});
532514 return programMemory;
533515}
534516
0 commit comments