[cfe-dev] Static Checker: getting svals for a struct field value

McDowell, Raymond C. via cfe-dev cfe-dev at lists.llvm.org
Mon May 9 11:55:09 PDT 2016


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!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160509/d3655ac5/attachment.html>


More information about the cfe-dev mailing list