<div dir="ltr">Hi All,<div><br></div><div>I'm analyzing something like the following code:</div><div><br></div><div>struct S {</div><div>  int a;</div><div>  char b;</div><div>  int c;</div><div>}</div><div><br></div><div>void foo() {</div><div>  struct S x;</div><div>  bar((uint8_t *)&x);</div><div>}</div><div><br></div><div>When I reach the CallEvent corresponding to the call to bar(), I would like to extract the MemRegion corresponding to x, i.e. by ignoring the (uint8_t *) cast. My code looks something like this:</div><div><br></div><div>const Expr *arg = Call.getArgExpr(0);</div><div><div>SVal addrVal = State->getSVal(arg, LCtx);</div><div>Optional<Loc> l = addrVal.getAs<Loc>();</div><div>if (!l) // must be a null pointer</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return nullptr;</div><div><br></div><div>QualType T = getPointedToType(E);</div><div>return State->getSVal(*l, T).getAsRegion();</div></div><div><br></div><div>where getPointedToType() is defined as</div><div><br></div><div><div>getPointedToType(const Expr *E) {</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>assert(E);</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>if (!isPointer(E))</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>return QualType();</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>if (const CastExpr *cast = dyn_cast<CastExpr>(E))</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>return getPointedToType(cast->getSubExpr());</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>const PointerType *Ty =</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>dyn_cast<PointerType>(E->getType().getCanonicalType().getTypePtr());</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (Ty)</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>return Ty->getPointeeType();</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>return QualType();</div><div>}</div></div><div><br></div><div>Everything seems to work just fine, until the call to State->getSVal(*l, T), which returns a NonLoc. If I instead call State->getSVal(*l) without the pointed-to type, then I do get a MemRegion, but it's an element region of type uint_8, NOT what I want.</div><div><br></div><div>Am I doing something wrong? Is there a much easier way to do this?</div><div><br></div><div>~Scott Constable</div></div>