[cfe-dev] How to extract a symbol stored in LazyCompoundVal?
Artem Dergachev via cfe-dev
cfe-dev at lists.llvm.org
Thu Jun 27 14:32:51 PDT 2019
(in my case it's None because of small struct optimization; you see the
value as lazyCompoundVal{0x5d4bb38,pos1} in checkBind but during the
actual bind it gets unwrapped into two symbols)
On 6/27/19 2:22 PM, Artem Dergachev wrote:
> Mmm, weird. I tried and for me it crashes unwrapping an empty
> optional. My only guess is - do you build your clang with assertions
> enabled? Otherwise your checker would behave in undefined manner in
> this scenario. Could you check if the optional actually does contain a
> value?
>
> On 6/25/19 9:10 PM, Torry Chen wrote:
>> Thank you Artem! It seems StoreManager::getDefaultBinding() won't
>> work if the struct variable is copied. As shown below,
>> getDefaultBinding() returns an undefined SVal.
>>
>> I could go down into fields to get the derived symbols for X and Y
>> respectively, and then use getParentSymbol() to get the symbol for
>> the whole struct. This looks cumbersome though. Is there a more
>> convenient way to get the symbol for the whole struct in this case?
>>
>> // checkBind: pos1 -> conj_$3{struct XY, LC1, S45418, #1}
>> struct XY pos1 = next_pos(10, 20);
>>
>> // checkBind: pos2 -> lazyCompoundVal{0x5d4bb38,pos1}
>> struct XY pos2 = pos1;
>>
>> move_to_pos(pos2);
>>
>> /** evalCall for move_to_pos():
>> SVal Pos = C.getSVal(CE->getArg(0));
>> ProgramStateRef State = C.getState();
>> StoreManager &StoreMgr = State->getStateManager().getStoreManager();
>> auto LCV = Pos.getAs<nonloc::LazyCompoundVal>();
>> SVal LCSVal = *StoreMgr.getDefaultBinding(*LCV);
>> LCSVal.dump() // <- Undefined
>> ...
>> const Store St = LCV->getCVData()->getStore();
>> const SVal FieldSVal = StoreMgr.getBinding(St,
>> loc::MemRegionVal(FieldReg));
>> FieldSVal.dump(); // <- derived_$4{conj_$3{struct XY, LC1, S45418,
>> #1},pos1->X}
>>
>> const auto *SD = dyn_cast<SymbolDerived>(FieldSVal.getAsSymbol());
>> const auto ParentSym = SD->getParentSymbol();
>> ParentSym.dump(); // <- conj_$3{struct XY, LC1, S45418, #1}
>> **/
>>
>> On Tue, 25 Jun 2019 at 14:06, Artem Dergachev <noqnoqneo at gmail.com
>> <mailto:noqnoqneo at gmail.com>> wrote:
>>
>> The "0x4aa1c58" part of "lazyCompoundVal{0x4aa1c58,pos1}" is a
>> Store object. You can access it with getStore() and then read it
>> with the help of a StoreManager.
>>
>> Hmm, we seem to already have a convenient API for that, you can
>> do StoreManager::getDefaultBinding(nonloc::LazyCompoundVal)
>> directly if all you need is a default-bound conjured symbol. But
>> if you want to lookup, say, specific fields in the structure (X
>> and Y separately), you'll need to do getBinding() on manually
>> constructed FieldRegions (in your case it doesn't look very
>> useful because the whole structure is conjured anyway).
>>
>> I guess at this point you might like the chapter 5 of my old
>> workbook
>> (https://github.com/haoNoQ/clang-analyzer-guide/releases/download/v0.1/clang-analyzer-guide-v0.1.pdf),
>> as for now it seems to be the only place where different kinds of
>> values are explained.
>>
>>
>> On 6/25/19 2:35 AM, Torry Chen via cfe-dev wrote:
>>> My project has a struct type as follows and I'm writing a
>>> checker for some functions that take the struct value as an
>>> argument. In the checkPreCall function I see the argument is an
>>> LazyCompoundVal, not a symbol as it would be for a primitive
>>> type. I tried a few ways to extract the symbol from the
>>> LazyCompountVal with no luck. Hope to get some help here.
>>>
>>> struct XY {
>>> uint64_t X;
>>> uint64_t Y;
>>> };
>>>
>>> ...
>>> // checkBind: pos1 -> conj_$3{struct XY, LC1, S63346, #1}
>>> struct XY pos1 = next_pos(...);
>>>
>>> // checkPreCall: Arg0: lazyCompoundVal{0x4aa1c58,pos1}
>>> move_to_pos(pos1);
>>>
>>> _______________________________________________
>>> cfe-dev mailing list
>>> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20190627/23d0a82c/attachment.html>
More information about the cfe-dev
mailing list