<div dir="ltr">Thank you, Jordan. I'm doing a checker to analyze C programs. Maybe I have to transform the <span style="font-family:arial,sans-serif;font-size:13px">CompoundAssignOperator to AssignOperator manually before analysis. </span></div>
<div class="gmail_extra"><br><br><div class="gmail_quote">2014/1/23 Jordan Rose <span dir="ltr"><<a href="mailto:jordan_rose@apple.com" target="_blank">jordan_rose@apple.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><div>Ah, interesting. That's unfortunate: we need to load from the LHS, but that overwrites the location value stored in that expression. Please file a bug; since the value can always be recovered from the location, we should prefer to leave that available for checkers to access. (They'd have to be careful, though, since the LHS could be a C++ reference.)</div>
<div><br></div><div>I'm not completely sure <i>how</i> we'll do this, but it'd be good to have this in the system. The relevant code is in ExprEngine::VisitBinaryOperator and its call to evalLoad.</div><div><br>
</div><div>A note on terminology: both locations and pure values are represented with SVals, and pointer values are usually region values. The C++ standard uses the term "lvalue" (or "glvalue") for addresses of memory regions (which can be loaded from or stored to), and "rvalue" for what you've been calling "SVal" (the contents of a region). You could use "location" vs. "value" if you want to avoid "lvalue" and "rvalue".</div>
<span class="HOEnZb"><font color="#888888"><div><br></div><div>Jordan</div></font></span><div><div class="h5"><div><br></div><br><div><div>On Jan 21, 2014, at 21:33 , Arthur Yoo <<a href="mailto:phjy007@gmail.com" target="_blank">phjy007@gmail.com</a>> wrote:</div>
<br><blockquote type="cite"><div dir="ltr">Hi Jordan,<div><br></div><div><font face="arial, sans-serif">When evaluating a Binary</font><span style="font-family:arial,sans-serif;font-size:13px">AssignOperator(<i>obj.a = 1;</i>), if I use </span><i>state->getSVal(LHS, C.getLocationContext())</i>, I will get the SVal of LHS, which actually is a MemRegionVal. So I can get LHS's MemRegion via MemRegionVal. However, for my test code <span style="font-size:13px;font-family:arial,sans-serif">snippet above, </span>I've tried to use <i>state->getSVal(LHS, C.getLocationContext())</i> to get the SVal of LHS when evaluating '<i style="font-size:13px;font-family:arial,sans-serif">obj.a += sizeof(long);</i>' in <i style="font-size:13px;font-family:arial,sans-serif">void checkPostStmt(const BinaryOperator *Op, CheckerContext &C) const, </i><span style="font-size:13px;font-family:arial,sans-serif">the Analyzer gave me '0 S32b</span><span style="font-size:13px;font-family:arial,sans-serif">'. I know that '0 S32b' does be the value for obj.a. But I want to get the FieldRegion of </span><span style="font-size:13px;font-family:arial,sans-serif">obj.a, not its SVal. However, I don't know how to get its FieldRegion when evaluating </span><span style="font-size:13px;font-family:arial,sans-serif">a</span><span style="font-size:10pt;font-family:arial,sans-serif"> CompoundAssignOperator.</span></div>


<div class="gmail_extra"><br><br><div class="gmail_quote">2014/1/22 Jordan Rose <span dir="ltr"><<a href="mailto:jordan_rose@apple.com" target="_blank">jordan_rose@apple.com</a>></span><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<div style="word-wrap:break-word"><div><br><div><div>On Jan 21, 2014, at 5:19 , Arthur Yoo <<a href="mailto:phjy007@gmail.com" target="_blank">phjy007@gmail.com</a>> wrote:</div><br><blockquote type="cite">
<div dir="ltr"><p class="MsoNormal">Hi all,</p><p class="MsoNormal"><br></p><p class="MsoNormal"><span style="font-size:10pt">I want to get a FieldRegion when </span><span style="font-size:13px">evaluating a</span><span style="font-size:10pt"> CompoundAssignOperator. The code snippet for my test is like below:</span></p>


<div><span style="font-size:10pt"> </span><br></div><p class="MsoNormal"><span style="font-size:10pt">typedef struct {</span></p><p class="MsoNormal"><span style="font-size:10pt"><span>           </span>int a;</span></p>
<p class="MsoNormal">
<span style="font-size:10pt"><span>           </span>int *p;</span></p><p class="MsoNormal"><span style="font-size:10pt">} Obj;</span></p><p class="MsoNormal"><span style="font-size:10pt">Obj obj;</span></p><p class="MsoNormal">


<span style="font-size:10pt">obj.a = 0;</span></p><p class="MsoNormal"><span style="font-size:10pt">obj.a += sizeof(long);</span></p><div><span style="font-size:10pt"> </span><br></div><div>







































<br></div><p class="MsoNormal"><span style="font-size:10pt">When evaluating the statement
‘<i>obj.a += sizeof(long);</i>’ in the
method <i>void checkPostStmt(const
BinaryOperator *Op, CheckerContext &C) const</i>, I want to get the
FieldRegion of <i>obj.a</i>. But I don’t
know how to get it. Is there anyone can provide me a way to get <i>obj.a</i>’s FieldRegion? Thanks a lot.</span></p></div></blockquote></div><br></div><div>Hi, Arthur. The value of the BinaryOperator's LHS should be an SVal representing the FieldRegion. Are you not seeing that?</div>


<span><font color="#888888"><div><br></div><div>Jordan</div></font></span></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr"><font color="#444444">Best regards,</font><div><font color="#444444">Arthur Yoo</font></div>


</div>
</div></div>
</blockquote></div><br></div></div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr"><font color="#444444">Best regards,</font><div><font color="#444444">ÔÀ¼ÑÔ² | Yue Jiayuan | Arthur Yoo</font></div>
</div>
</div>