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 <[email protected]>:

>  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 <[email protected]>:
>
>> 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
>> [email protected]
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
>
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to