[PATCH] D74735: [analyzer] Add support for CXXInheritedCtorInitExpr.

Richard Smith - zygoloid via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 4 17:59:13 PST 2020


rsmith added a comment.

> There are also no argument expressions, even though the inherited constructor for `A` takes one argument `x`. The current patch takes argument expressions from the topmost `CXXConstructExpr`, which also requires a different location context to access. As far as i can see, the result of such substitution is always correct, i.e., the resulting argument `SVal` obtained from the `Environment` this way will always be `evalBinOp`-equal to the correct argument value.

Just in case this isn't clear: the reason why `CXXInheritedCtorInitExpr` doesn't take arguments and doesn't model parameter initialization is because there is none: the arguments in the outer `CXXConstructExpr` directly initialize the parameters of the base class constructor, and no copies are made. (Making a copy of the parameter is incorrect, at least if it's done in an observable way.) The derived class constructor doesn't even exist in the formal model.

Eg, in:

  struct X { X *p = this; ~X() {} };
  struct A { A(X x) : b(x.p == &x) {} bool b; };
  struct B : A { using A::A; };
  B b = X{};

... `b.b` is initialized to `true`.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74735/new/

https://reviews.llvm.org/D74735





More information about the cfe-commits mailing list