<div dir="rtl"><div dir="ltr">Thanks Richard!</div><div dir="ltr"><br></div></div><div class="gmail_extra"><div dir="ltr"><br><br><div class="gmail_quote">2014-08-04 2:50 GMT+03:00 Richard Smith <span dir="ltr"><<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>></span>:<br>

<blockquote class="gmail_quote" style="margin:0 .8ex;border-left:1px #ccc solid;border-right:1px #ccc solid;padding-left:1ex;padding-right:1ex">Fixed in a much more simple way in r<span style="color:rgb(0,0,0)">214675. Thanks for reporting!</span></blockquote>

</div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Aug 3, 2014 at 11:52 AM, Vassil Vassilev <span dir="ltr"><<a href="mailto:vvasilev@cern.ch" target="_blank">vvasilev@cern.ch</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>I will try just one more time and then
      shut up :)<div><br>
      <br>
      diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp<br>
      index 5f38387..000ea7a 100644<br>
      --- a/lib/Lex/PPDirectives.cpp<br>
      +++ b/lib/Lex/PPDirectives.cpp<br>
      @@ -94,6 +94,19 @@
      Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,<br>
       /// error in the macro definition.<br>
       void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) {<br>
         // Don't try to reuse the storage; this only happens on error
      paths.<br>
      +<br>
      +  // If this is on the macro info chain, avoid double deletion on
      teardown.<br>
      +  MacroInfoChain *current = MIChainHead;<br>
      +  while (MacroInfoChain *I = current) {<br>
      +    if (&(I->MI) == MI) {<br>
      +      I->Next = (I->Next) ? I->Next->Next : 0;<br>
      +      if (I == MIChainHead)<br></div>
      +        MIChainHead = I->Next;<div><br>
      +      break;<br>
      +    }<br>
      +    current = I->Next;<br>
      +  }<br>
      +<br>
         MI->~MacroInfo();<br>
       }<br>
      <br>
      <br></div><div><div>
      On 03/08/14 20:47, Vassil Vassilev wrote:<br>
    </div></div></div><div><div>
    <blockquote type="cite">
      
      <div>Hi,<br>
          Sorry overlooked, thanks for pointing it out!<br>
          I hope this is what we want.<br>
        Vassil<br>
        <br>
        diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp<br>
        index 5f38387..000ea7a 100644<br>
        --- a/lib/Lex/PPDirectives.cpp<br>
        +++ b/lib/Lex/PPDirectives.cpp<br>
        @@ -94,6 +94,19 @@
        Preprocessor::AllocateVisibilityMacroDirective(SourceLocation
        Loc,<br>
         /// error in the macro definition.<br>
         void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) {<br>
           // Don't try to reuse the storage; this only happens on error
        paths.<br>
        +<br>
        +  // If this is on the macro info chain, avoid double deletion
        on teardown.<br>
        +  MacroInfoChain *current = MIChainHead;<br>
        +  while (MacroInfoChain *I = current) {<br>
        +    if (&(I->MI) == MI) {<br>
        +      I->Next = (I->Next) ? I->Next->Next : 0;<br>
        +      if (I == MIChainHead)<br>
        +        MIChainHead = I;<br>
        +      break;<br>
        +    }<br>
        +    current = I->Next;<br>
        +  }<br>
        +<br>
           MI->~MacroInfo();<br>
         }<br>
         <br>
        On 03/08/14 20:28, Yaron Keren wrote:<br>
      </div>
      <blockquote type="cite">
        <div dir="rtl">
          <div dir="ltr">Hi,</div>
          <div dir="ltr"><br>
          </div>
          <div dir="ltr">MIChainHead is a pointer to the head of a
            linked list of MacroInfoChain nodes, each containing
            a MacroInfo and MacroInfoChain*.<br>
          </div>
          <div dir="ltr"> <br>
          </div>
          <div dir="ltr">Why does the while loop modify MIChainHead on
            every iteration?</div>
          <div dir="ltr">MIChainHead should be modified only if it
            points to the node containing the removed <span style="font-size:12.727272033691406px;font-family:arial,sans-serif">MacroInfo

              MI. </span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">In

              all other cases it should not change.</span></div>
          <div dir="ltr"><span style="font-family:arial,sans-serif;font-size:12.727272033691406px"><br>
            </span></div>
          <div dir="ltr">As it is now, the loop will always terminate
            with MIChainHead == nullptr.<br>
          </div>
          <div dir="ltr"><br>
          </div>
          <div dir="ltr">Yaron</div>
          <div dir="ltr"><br>
          </div>
          <div class="gmail_extra"><br>
            <br>
            <div class="gmail_quote">
              <div dir="ltr">2014-08-03 21:10 GMT+03:00 Vassil Vassilev
                <span dir="ltr"><<a href="mailto:vvasilev@cern.ch" target="_blank">vvasilev@cern.ch</a>></span>:</div>
              <blockquote class="gmail_quote" style="margin:0 .8ex;border-left:1px #ccc solid;border-right:1px #ccc solid;padding-left:1ex;padding-right:1ex">
                <div bgcolor="#FFFFFF" text="#000000">
                  <div>Hi Yaron,<br>
                      Yes I meant double destruction.<span><font color="#888888"><br>
                        Vassil</font></span>
                    <div>
                      <div><br>
                        On 03/08/14 20:08, Yaron Keren wrote:<br>
                      </div>
                    </div>
                  </div>
                  <div>
                    <div>
                      <blockquote type="cite">
                        <div dir="rtl">
                          <div dir="ltr">Hi Vassil,</div>
                          <div dir="ltr"><br>
                          </div>
                          <div dir="ltr">Do you mean double destruction
                            (not deletion) of <span style="font-family:arial,sans-serif;font-size:12.727272033691406px">MacroInfo


                              first time in </span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">ReleaseMacroInfo </span><span style="font-family:arial,sans-serif;font-size:12.727272033691406px">and
                              the second time in </span>~Preprocessor
                            via  ~MacroInfoChain?</div>
                          <div dir="ltr"><br>
                          </div>
                          <div dir="ltr">
                            <div dir="ltr">  while (MacroInfoChain *I =
                              MIChainHead) {</div>
                            <div dir="ltr">    MIChainHead = I->Next;</div>
                            <div dir="ltr">    I->~MacroInfoChain();</div>
                            <div dir="ltr">  }</div>
                            <div><br>
                            </div>
                            <div>or something else?</div>
                            <div><br>
                            </div>
                            <div>Yaron<br>
                            </div>
                          </div>
                          <div dir="ltr"><br>
                          </div>
                        </div>
                        <div class="gmail_extra"><br>
                          <br>
                          <div class="gmail_quote">
                            <div dir="ltr">2014-08-02 23:05 GMT+03:00
                              Vassil Vassilev <span dir="ltr"><<a href="mailto:vvasilev@cern.ch" target="_blank">vvasilev@cern.ch</a>></span>:</div>
                            <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
                                In cases where ReleaseMacroInfo gets
                              called and it doesn't cleanup the
                              Preprocessor's MIChainHead can lead to
                              double deletion. I am sending the patch
                              that fixes the problem for me.<br>
                              Vassil<br>
                              <br>
                              <br>
                              diff --git a/lib/Lex/PPDirectives.cpp
                              b/lib/Lex/PPDirectives.cpp<br>
                              index 5f38387..1a9b5eb 100644<br>
                              --- a/lib/Lex/PPDirectives.cpp<br>
                              +++ b/lib/Lex/PPDirectives.cpp<br>
                              @@ -94,6 +94,14 @@
                              Preprocessor::AllocateVisibilityMacroDirective(SourceLocation
                              Loc,<br>
                               /// error in the macro definition.<br>
                               void
                              Preprocessor::ReleaseMacroInfo(MacroInfo
                              *MI) {<br>
                                 // Don't try to reuse the storage; this
                              only happens on error paths.<br>
                              +<br>
                              +  // If this is on the macro info chain,
                              avoid double deletion on teardown.<br>
                              +  while (MacroInfoChain *I = MIChainHead)
                              {<br>
                              +    if (&(I->MI) == MI)<br>
                              +      I->Next = (I->Next) ?
                              I->Next->Next : 0;<br>
                              +    MIChainHead = I->Next;<br>
                              +  }<br>
                              +<br>
                                 MI->~MacroInfo();<br>
                               }<br>
                              <br>
_______________________________________________<br>
                              cfe-commits mailing list<br>
                              <a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
                              <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
                            </blockquote>
                          </div>
                          <br>
                        </div>
                      </blockquote>
                      <br>
                    </div>
                  </div>
                </div>
              </blockquote>
            </div>
            <br>
          </div>
        </div>
      </blockquote>
      <br>
      <br>
      <fieldset></fieldset>
      <br>
      <pre>_______________________________________________
cfe-commits mailing list
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a>
</pre>
    </blockquote>
    <br>
  </div></div></div>

<br>_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br></blockquote></div><br></div>
</div></div></div></div>