================
@@ -3106,70 +3103,83 @@ void
ExprEngine::processEndOfFunction(NodeBuilderContext& BC,
/// nodes by processing the 'effects' of a switch statement.
void ExprEngine::processSwitch(NodeBuilderContext &BC, const SwitchStmt
*Switch,
ExplodedNode *Pred, ExplodedNodeSet &Dst) {
+ currBldrCtx = &BC;
const Expr *Condition = Switch->getCond();
SwitchNodeBuilder Builder(Dst, BC);
+ ExplodedNodeSet CheckersOutSet;
- ProgramStateRef State = Pred->getState();
- SVal CondV = State->getSVal(Condition, Pred->getLocationContext());
-
- if (CondV.isUndef()) {
- // FIXME: Emit warnings when the switch condition is undefined.
- return;
- }
+ getCheckerManager().runCheckersForBranchCondition(
+ Condition->IgnoreParens(), CheckersOutSet, Pred, *this);
- std::optional<NonLoc> CondNL = CondV.getAs<NonLoc>();
+ for (ExplodedNode *Node : CheckersOutSet) {
+ ProgramStateRef State = Node->getState();
- for (const CFGBlock *Block : Builder) {
- // Successor may be pruned out during CFG construction.
- if (!Block)
+ SVal CondV = State->getSVal(Condition, Node->getLocationContext());
+ if (CondV.isUndef()) {
+ // This can only happen if core.uninitialized.Branch is disabled.
continue;
+ }
- const CaseStmt *Case = cast<CaseStmt>(Block->getLabel());
+ std::optional<NonLoc> CondNL = CondV.getAs<NonLoc>();
- // Evaluate the LHS of the case value.
- llvm::APSInt V1 = Case->getLHS()->EvaluateKnownConstInt(getContext());
- assert(V1.getBitWidth() == getContext().getIntWidth(Condition->getType()));
+ for (const CFGBlock *Block : Builder) {
+ // Successor may be pruned out during CFG construction.
+ if (!Block)
+ continue;
- // Get the RHS of the case, if it exists.
- llvm::APSInt V2;
- if (const Expr *E = Case->getRHS())
- V2 = E->EvaluateKnownConstInt(getContext());
- else
- V2 = V1;
+ const CaseStmt *Case = cast<CaseStmt>(Block->getLabel());
- ProgramStateRef StateMatching;
- if (CondNL) {
- // Split the state: this "case:" matches / does not match.
- std::tie(StateMatching, State) =
- State->assumeInclusiveRange(*CondNL, V1, V2);
- } else {
- // The switch condition is UnknownVal, so we enter each "case:" without
- // any state update.
- StateMatching = State;
- }
+ // Evaluate the LHS of the case value.
+ llvm::APSInt V1 = Case->getLHS()->EvaluateKnownConstInt(getContext());
+ assert(V1.getBitWidth() ==
+ getContext().getIntWidth(Condition->getType()));
- if (StateMatching)
- Builder.generateCaseStmtNode(Block, StateMatching, Pred);
+ // Get the RHS of the case, if it exists.
+ llvm::APSInt V2;
+ if (const Expr *E = Case->getRHS())
+ V2 = E->EvaluateKnownConstInt(getContext());
+ else
+ V2 = V1;
- // If _not_ entering the current case is infeasible, we are done with
- // processing this branch.
+ ProgramStateRef StateMatching;
+ if (CondNL) {
+ // Split the state: this "case:" matches / does not match.
+ std::tie(StateMatching, State) =
+ State->assumeInclusiveRange(*CondNL, V1, V2);
+ } else {
+ // The switch condition is UnknownVal, so we enter each "case:" without
+ // any state update.
+ StateMatching = State;
+ }
+
+ if (StateMatching)
+ Builder.generateCaseStmtNode(Block, StateMatching, Node);
+
+ // If _not_ entering the current case is infeasible, we are done with
+ // processing the paths through the current Node.
----------------
NagyDonat wrote:
Done in
https://github.com/llvm/llvm-project/pull/182058/commits/4530ebb5a3b97c96b2d382268fd639ff7b1c1917
https://github.com/llvm/llvm-project/pull/182058
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits