[PATCH] D100839: [analyzer] Adjust the reported variable name in retain count checker
Artem Dergachev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sun Apr 25 23:24:37 PDT 2021
NoQ added inline comments.
================
Comment at: clang/lib/StaticAnalyzer/Checkers/RetainCountChecker/RetainCountDiagnostics.cpp:967-968
+
+ // While looking for the last var bindings, we can still find
+ // `AllocFirstBinding` to be one of them. In situations like this,
+ // it would still be the easiest case to explain to our users.
----------------
vsavchenko wrote:
> NoQ wrote:
> > Given that the current state doesn't satisfy the requirement on line 945, this can happen for two reasons:
> > 1. The symbol was there when the variable died so we simply tracked it back to the last moment of time the variable was alive.
> > 2. The symbol was there but was overwritten later (and then the variable may have also, but haven't necessarily, died).
> >
> > Case 2 is bad because we're back in business for reporting the wrong variable; it's still more rare than before the patch but i think the problem remains. Something like this should probably demonstrate it:
> >
> > ```lang=c++
> > void foo() {
> > Object *Original = allocate(...);
> > Original = allocate();
> > Original->release();
> > }
> > ```
> >
> > A potential solution may be to add a check in `getAllVarBindingsForSymbol` that the first node in which we find our symbol corresponds to a `*PurgeDeadSymbols` program point. It's a straightforward way to find out whether we're in case 1 or in case 2.
> In this situation, we will report on line `Original = allocate();`, which should probably be a good enough indicator of what analyzer tries to say.
> In your example, we have a choice of either not report variable name at all or report `Original`
I had a look and it looks like all of our UIs are acting up quite a bit on this example. The user ends up completely convinced that it's the current value of `Original` that's getting leaked, not the original value.
Let's at least add a test and/or a comment? This definitely isn't a regression and the patch is still really good.
================
Comment at: clang/test/Analysis/Inputs/expected-plists/retain-release-path-notes.m.plist:5993
+ <key>message</key>
+ <string>Object leaked: object allocated and stored into 'New' is not referenced later in this execution path and has a retain count of +1</string>
+ </dict>
----------------
vsavchenko wrote:
> NoQ wrote:
> > This patch seems to add 3 entirely new warnings here. Why do they suddenly start showing up? Are they good?
> Because I added 3 more test cases? 😅
Uh-oh ok fair enough :D
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D100839/new/
https://reviews.llvm.org/D100839
More information about the cfe-commits
mailing list