[PATCH] D40715: [analyser] different.LabelInsideSwitch checker implementation
Alexey Knyshev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 11 02:30:38 PST 2017
alexey.knyshev added inline comments.
================
Comment at: lib/StaticAnalyzer/Checkers/LabelInsideSwitchChecker.cpp:87
+ BugReporter &BR) const {
+ auto LabelStmt = stmt(hasDescendant(switchStmt(
+ eachOf(has(compoundStmt(forEach(labelStmt().bind("label")))),
----------------
a.sidorin wrote:
> alexey.knyshev wrote:
> > Looks like I have to use `forEachDescendant` instead of `hasDescendant`. Please, comment!
> 1. Yes, `hasDescendant()` will give you only single match. `forEachDescendant()` will continue matching after match found and that is what we should do here.
> 2. Maybe we can just use stmt(forEachDescendant(switchStmt(forEachDescendant(labelStmt()))))? We don't distinguish "label" and "label_in_case" anyway. Also, current matcher will ignore deeply-nested switches:
> ```
> switch (x) }
> case 1: {
> {{ label: }} // ignored
> }
> }
> ```
> Is that intentional?
1. Thanks, got it.
2. I've used `eachOf` for matching 2 different cases:
- Label under case stmt such as:
```
switch (x) {
case 1:
someCodeHere;
cas: // missprint
... // other cases
}
```
- And label under switch compound stmt:
```
switch (x) {
cas: blabla; // this label is not a child of any case stmt
case 3: ...
...
// etc
```
On the other hand I would like to avoid matching deeply-nested labels inside switch compound stmt for reducing false-positives probability. Actually I'm not sure in my assumption.
Repository:
rC Clang
https://reviews.llvm.org/D40715
More information about the cfe-commits
mailing list