<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    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?<br>
    <br>
    <div class="moz-cite-prefix">On 6/25/19 9:10 PM, Torry Chen wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CADmWND_VMD=U0=fE_RdMtqK35gmAKfWq2jq1VOR6P8nXHnVF_w@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <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"
            moz-do-not-send="true">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" moz-do-not-send="true">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" moz-do-not-send="true">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" moz-do-not-send="true">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
</pre>
            </blockquote>
            <br>
          </div>
        </blockquote>
      </div>
    </blockquote>
    <br>
  </body>
</html>