@@ -1198,18 +1198,40 @@ struct SingleValueFlowAnalyzer : ValueFlowAnalyzer {
11981198
11991199 bool stopOnCondition (const Token* condTok) const override
12001200 {
1201- if (value.isNonValue ())
1202- return false ;
12031201 if (value.isImpossible ())
12041202 return false ;
1205- if (isConditional () && !value.isKnown ())
1203+ // lifetime values must keep flowing to properly track aliases
1204+ if (value.isLifetimeValue ())
1205+ return false ;
1206+ // 'conditional' flag (uninit, or lowered after a modifying branch): may depend on a
1207+ // condition that doesn't mention the variable -> stop
1208+ if (value.conditional && !value.isKnown ())
12061209 return true ;
1207- if (value.isSymbolicValue ())
1210+ if (value.isNonValue ())
12081211 return false ;
1212+ if (value.isSymbolicValue ())
1213+ return isConditional () && !value.isKnown ();
1214+ // conditional via the originating 'condition' (e.g. possible null after 'if (p && ...)'): only flow
1215+ // if the condition references the value, else a correlation we can't follow (e.g.
1216+ // 'bool ok = (p != nullptr); if (!ok)') could make a later deref safe -> stop
1217+ if (value.condition && !value.isKnown () && !conditionReferencesValue (condTok))
1218+ return true ;
12091219 ConditionState cs = analyzeCondition (condTok);
12101220 return cs.isUnknownDependent ();
12111221 }
12121222
1223+ // Does the condition mention the tracked value, either directly or through a symbolic alias?
1224+ bool conditionReferencesValue (const Token* condTok) const
1225+ {
1226+ return findAstNode (condTok, [&](const Token* tok) {
1227+ if (match (tok))
1228+ return true ;
1229+ return std::any_of (tok->values ().cbegin (), tok->values ().cend (), [&](const ValueFlow::Value& v) {
1230+ return v.isSymbolicValue () && !v.isImpossible () && v.tokvalue && match (v.tokvalue );
1231+ });
1232+ }) != nullptr ;
1233+ }
1234+
12131235 bool updateScope (const Token* endBlock, bool /* modified*/ ) const override {
12141236 const Scope* scope = endBlock->scope ();
12151237 if (!scope)
0 commit comments