Hi all,
I am new to Clang Static Code analyzer internals.
Currently, I am trying to get all the branch conditions in a function using ‘check::BranchCondition’ call back function.
I am successful in detecting all the branch conditions like if, while, do…while, for and ternary operator condition except switch condition.
I have checked this with already existing checks (e.g.- DumpTraversal) which uses ‘check::BranchCondition’ call back function, these checks
also do not detect ‘switch’ statements.
Kindly help me in getting switch statements using ‘check::BranchCondition’ call back function.
Thanks,
Prashant S. Purohit
Hi, Prashant. check::BranchCondition is only intended to be used for boolean branches, since the first argument is the conditional expression used for branching.* With a switch statement, that no longer makes sense. That said, you're right that there's currently no callback for a switch statement. The right thing to do here is probably to run pre-statement checks on the terminator statement in the CFG when it's not a logical expression or conditional expression, so that the nomal check::PreStmt<SwitchStmt> would work.
Please file a bug at llvm.org/bugs/, or alternately submit a patch to cfe-commits@cs.uiuc.edu for review (and CC me or Anna).
Sorry for the trouble,
Jordan
* Implementation detail: it's a Stmt, not an Expr, because we stash the branch info for an Objective-C for-in loop on the loop statement itself. But it's still a boolean value.
Hi Jordan,
Thanks for the reply.
As suggested by you, I tried getting the switch statement using check::PreStmt
But it is still failing, please find the below code which I added to get switch statement:
void SimpleChecker::checkPreStmt(const SwitchStmt *SW, CheckerContext &C ) const {
// Print when a switch statement is found.
llvm::errs() << “Switch Statement found.\n”;
}
The above implementation is failing for a simple ‘C’ code mentioned below:
int main() {
int var1 = 1, var2 = 2;
switch(var1) {
case 1:
var1 = var2 + var1;
break;
default:
break;
}
return 0;
}
It is not printing “Switch Statement found” on the console for above code.
Kindly suggest if I am missing something.
Thanks,
Prashant S. Purohit
Right; what I meant was that we'd prefer to make this work rather than adding switch statements to checkBranchCondition, but right now neither one works. Sorry for the inconvenience.
Jordan