[PATCH] D52200: Thread safety analysis: Handle ObjCIvarRefExpr in SExprBuilder::translate

Aaron Puchert via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 18 16:52:29 PDT 2018


aaronpuchert added a comment.

I found something that would theoretically work:

  P->setArrow((isa<CXXThisExpr>(ME->getBase()) && Ctx && Ctx->SelfArg) ? Ctx->SelfArrow : ME->isArrow());

So if we have `this` and a context that tells us we have to replace `this` by something else, then we check `Ctx->SelfArrow`, otherwise we take `ME->isArrow()`.

But that doesn't work. When translating into the TIL (typed intermediate language), referencing and dereferencing operators are completely ignored.

  struct Foo {
    Mutex mu_;
    void foo1(Foo *f_declared) EXCLUSIVE_LOCKS_REQUIRED(f_declared->mu_);
  };
  
  void test() {
    Foo myfoo;
    myfoo.foo1(&myfoo);  // \
      // expected-warning {{calling function 'foo1' requires holding mutex 'myfoo.mu_' exclusively}}
  }

With the above change we warn that `calling function 'foo1' requires holding mutex 'myfoo->mu_' exclusively`. It should be `(&myfoo)->mu_`, but the `&` is lost. So we can't derive the information that we want from `isArrow` alone.

Now there is a reason why these operators are ignored — the TIL tries to "canonicalize" expressions, so that it detects that `(&myfoo)->mu_` and `myfoo.mu_` are the same thing. Changing that is probably possible, but beyond the scope of this change.

Short of that, we must be able to detect pointers. I think we could use `Type::isAnyPointerType` instead of `Type::isPointerType` in `hasCppPointerType` (and probably rename that).

For later I think we should consider a different canonicalization that doesn't just ignore `&` and `*`.


Repository:
  rC Clang

https://reviews.llvm.org/D52200





More information about the cfe-commits mailing list