[PATCH] Inconsistency in Preprocessor::ReleaseMacroInfo(MacroInfo *MI)

Vassil Vassilev vvasilev at cern.ch
Sun Aug 3 11:47:02 PDT 2014


Hi,
   Sorry overlooked, thanks for pointing it out!
   I hope this is what we want.
Vassil

diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp
index 5f38387..000ea7a 100644
--- a/lib/Lex/PPDirectives.cpp
+++ b/lib/Lex/PPDirectives.cpp
@@ -94,6 +94,19 @@ 
Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
  /// error in the macro definition.
  void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) {
    // Don't try to reuse the storage; this only happens on error paths.
+
+  // If this is on the macro info chain, avoid double deletion on teardown.
+  MacroInfoChain *current = MIChainHead;
+  while (MacroInfoChain *I = current) {
+    if (&(I->MI) == MI) {
+      I->Next = (I->Next) ? I->Next->Next : 0;
+      if (I == MIChainHead)
+        MIChainHead = I;
+      break;
+    }
+    current = I->Next;
+  }
+
    MI->~MacroInfo();
  }

On 03/08/14 20:28, Yaron Keren wrote:
> Hi,
>
> MIChainHead is a pointer to the head of a linked list 
> of MacroInfoChain nodes, each containing a MacroInfo and MacroInfoChain*.
>
> Why does the while loop modify MIChainHead on every iteration?
> MIChainHead should be modified only if it points to the node 
> containing the removed MacroInfo MI. In all other cases it should not 
> change.
>
> As it is now, the loop will always terminate with MIChainHead == nullptr.
>
> Yaron
>
>
>
> 2014-08-03 21:10 GMT+03:00 Vassil Vassilev <vvasilev at cern.ch 
> <mailto:vvasilev at cern.ch>>:
>
>     Hi Yaron,
>       Yes I meant double destruction.
>     Vassil
>
>     On 03/08/14 20:08, Yaron Keren wrote:
>>     Hi Vassil,
>>
>>     Do you mean double destruction (not deletion) of MacroInfo first
>>     time in ReleaseMacroInfo and the second time in ~Preprocessor via
>>      ~MacroInfoChain?
>>
>>       while (MacroInfoChain *I = MIChainHead) {
>>         MIChainHead = I->Next;
>>         I->~MacroInfoChain();
>>       }
>>
>>     or something else?
>>
>>     Yaron
>>
>>
>>
>>     2014-08-02 23:05 GMT+03:00 Vassil Vassilev <vvasilev at cern.ch
>>     <mailto:vvasilev at cern.ch>>:
>>
>>         Hi,
>>           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.
>>         Vassil
>>
>>
>>         diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp
>>         index 5f38387..1a9b5eb 100644
>>         --- a/lib/Lex/PPDirectives.cpp
>>         +++ b/lib/Lex/PPDirectives.cpp
>>         @@ -94,6 +94,14 @@
>>         Preprocessor::AllocateVisibilityMacroDirective(SourceLocation
>>         Loc,
>>          /// error in the macro definition.
>>          void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) {
>>            // Don't try to reuse the storage; this only happens on
>>         error paths.
>>         +
>>         +  // If this is on the macro info chain, avoid double
>>         deletion on teardown.
>>         +  while (MacroInfoChain *I = MIChainHead) {
>>         +    if (&(I->MI) == MI)
>>         +      I->Next = (I->Next) ? I->Next->Next : 0;
>>         +    MIChainHead = I->Next;
>>         +  }
>>         +
>>            MI->~MacroInfo();
>>          }
>>
>>         _______________________________________________
>>         cfe-commits mailing list
>>         cfe-commits at cs.uiuc.edu <mailto:cfe-commits at cs.uiuc.edu>
>>         http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140803/d6784c57/attachment.html>


More information about the cfe-commits mailing list