[PATCH] D92039: [-Wcalled-once-parameter] Introduce 'called_once' attribute
Valeriy Savchenko via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 23 06:19:30 PST 2020
vsavchenko added inline comments.
================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:163
+ }
+ static bool canBeCalled(Kind K) {
+ return (K & DefinitelyCalled) == DefinitelyCalled && K != Reported;
----------------
NoQ wrote:
> "Can be called" sounds like "Someone's allowed to call it". I was completely confused when i saw a call site for that function.
>
> I too am at loss because the concept of "is definitely potentially called" is hard to explain especially when the concept of "maybe called" is already defined and means something different.
>
> Maybe `seenAnyCalls()` or something like that?
>
> Maybe also rename `DefinitelyCalled` and `MaybeCalled` to `CalledOnAllPaths` and `CalledOnSomePathsOnly`? That could eliminate a bit more confusion.
`DefinitelyCalled` is already a mouthful, so I prefer to keep it together with `MaybeCalled`. Also I agree about `canBeCalled` and I like your alternative!
================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:304-307
+ // Function pointer/references can be dereferenced before a call.
+ // That doesn't make it, however, any different from a regular call.
+ // For this reason, dereference operation is a "no-op".
+ case UO_Deref:
----------------
NoQ wrote:
> Technically the same applies to operator `&`, eg. `(&*foo)()` is your normal call. Obviously, `(&foo)()` doesn't compile. That said, `if (&foo)` compiles and is not your normal null check (but `if (&*foo)` and `if (*foo)` are).
I mean, we can add `case UO_AddrOf:`, but I don't think that we need more complex logic (in terms of `*` and `&`) here.
================
Comment at: clang/lib/Analysis/CalledOnceCheck.cpp:321-322
+ case BO_NE: {
+ const DeclRefExpr *LHS = Visit(BO->getLHS());
+ return LHS ? LHS : Visit(BO->getRHS());
+ }
----------------
NoQ wrote:
> You're potentially dropping some `DeclRefExpr`s. Also the ones that you find aren't necessarily the function pointer variables you're looking for (as you don't actually have any checks in `VisitDeclRefExpr`). Combined, i suspect that there may be some exotic counterexamples like
> ```lang=c
> if (!foo) {
> // "foo" is found
> if (foo == completion_handler) {
> // ...
> }
> }
> ```
> (which is probably ok anyway)
Yep, I thought about it and, honestly, decided to ignore 😊
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D92039/new/
https://reviews.llvm.org/D92039
More information about the cfe-commits
mailing list