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

Vassil Vassilev vvasilev at cern.ch
Sun Aug 3 11:52:57 PDT 2014


I will try just one more time and then shut up :)

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->Next;
+      break;
+    }
+    current = I->Next;
+  }
+
    MI->~MacroInfo();
  }


On 03/08/14 20:47, Vassil Vassilev wrote:
> 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
>>>
>>>
>>
>>
>
>
>
> _______________________________________________
> cfe-commits mailing list
> 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/79ad3806/attachment.html>


More information about the cfe-commits mailing list