<div dir="ltr">Thank you Artem! It seems StoreManager::getDefaultBinding() won't work if the struct variable is copied. As shown below, getDefaultBinding() returns an undefined SVal.<br><br>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?<br><br><font face="courier new, monospace">// checkBind: pos1 -> conj_$3{struct XY, LC1, S45418, #1}<br>struct XY pos1 = next_pos(10, 20);<br><br>// checkBind: pos2 -> lazyCompoundVal{0x5d4bb38,pos1}<br>struct XY pos2 = pos1;<br><br>move_to_pos(pos2);</font><br><br><font face="courier new, monospace">/** evalCall for move_to_pos():<br> SVal Pos = C.getSVal(CE->getArg(0));<br> ProgramStateRef State = C.getState();<br> StoreManager &StoreMgr = State->getStateManager().getStoreManager();<br> auto LCV = Pos.getAs<nonloc::LazyCompoundVal>();<br> SVal LCSVal = *StoreMgr.getDefaultBinding(*LCV);<br> LCSVal.dump() // <- Undefined<br> ...<br> const Store St = LCV->getCVData()->getStore();<br> const SVal FieldSVal = StoreMgr.getBinding(St, loc::MemRegionVal(FieldReg));<br> FieldSVal.dump(); // <- derived_$4{conj_$3{struct XY, LC1, S45418, #1},pos1->X}<br><br> const auto *SD = dyn_cast<SymbolDerived>(FieldSVal.getAsSymbol());<br> const auto ParentSym = SD->getParentSymbol();<br> ParentSym.dump(); // <- conj_$3{struct XY, LC1, S45418, #1}<br>**/</font><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 25 Jun 2019 at 14:06, Artem Dergachev <<a href="mailto:noqnoqneo@gmail.com">noqnoqneo@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF">
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.<br>
<br>
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).<br>
<br>
I guess at this point you might like the chapter 5 of my old
workbook
(<a class="gmail-m_-4861931114608865060moz-txt-link-freetext" href="https://github.com/haoNoQ/clang-analyzer-guide/releases/download/v0.1/clang-analyzer-guide-v0.1.pdf" target="_blank">https://github.com/haoNoQ/clang-analyzer-guide/releases/download/v0.1/clang-analyzer-guide-v0.1.pdf</a>),
as for now it seems to be the only place where different kinds of
values are explained.<br>
<br>
<br>
<div class="gmail-m_-4861931114608865060moz-cite-prefix">On 6/25/19 2:35 AM, Torry Chen via
cfe-dev wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">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.<br>
<br>
<font face="courier new, monospace">struct XY {<br>
uint64_t X;<br>
uint64_t Y;<br>
};<br>
<br>
...<br>
// checkBind: pos1 -> conj_$3{struct XY, LC1, S63346, #1}</font>
<div><span style="font-family:"courier new",monospace">struct
XY pos1 = next_pos(...);</span> <font face="courier new,
monospace"><br>
<br>
// checkPreCall: Arg0: lazyCompoundVal{0x4aa1c58,pos1}<br>
move_to_pos(pos1);</font><br>
</div>
</div>
<br>
<fieldset class="gmail-m_-4861931114608865060mimeAttachmentHeader"></fieldset>
<pre class="gmail-m_-4861931114608865060moz-quote-pre">_______________________________________________
cfe-dev mailing list
<a class="gmail-m_-4861931114608865060moz-txt-link-abbreviated" href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>
<a class="gmail-m_-4861931114608865060moz-txt-link-freetext" href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
</pre>
</blockquote>
<br>
</div>
</blockquote></div>