I am new to building Clang static checkers and need some help. I am implementing a PreCall callback function that checks calls to a certain family of functions (from a local library) that takes a struct as an argument. I see how to get the SVal and Expr for the argument using CallEvent::getArgSVal() and CallEvent::getArgExpr(). What I’m struggling with is how to go from the SVal for the struct to an SVal for one of its fields. In particular, how do I get the memory region associated with the struct value? Once I have that, I think I know how to go from there, e.g.:

RecordType *structTy = structReg->getValueType()->getAsStructureType();

assert(structTy && “Value is not a structure”);

RecordDecl *structRD = structTy ->getDecl()->getDefinition();

assert(structRD && “structure has no definition”);

for (const auto *F : structRD->fields()) {

FieldRegion *FR = MRMgr.getFieldRegion(F, structReg);

if (FR->getDec()->getName() == “fieldName”)

size = StoreMgr.getBinding(store, loc::MemRegionVal(FR));

}

But how do I get the memory region structReg? And how do I get the Store store?

Thanks!