[PATCH] Inconsistency in Preprocessor::ReleaseMacroInfo(MacroInfo *MI)
Yaron Keren
yaron.keren at gmail.com
Mon Aug 4 00:37:59 PDT 2014
Thanks Richard!
2014-08-04 2:50 GMT+03:00 Richard Smith <richard at metafoo.co.uk>:
> Fixed in a much more simple way in r214675. Thanks for reporting!
On Sun, Aug 3, 2014 at 11:52 AM, Vassil Vassilev <vvasilev at cern.ch> wrote:
> 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>:
>
>> 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>:
>>
>>> 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
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>
>>
>>
>>
>
>
>
> _______________________________________________
> cfe-commits mailing listcfe-commits at cs.uiuc.eduhttp://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/20140804/936eb5d6/attachment.html>
More information about the cfe-commits
mailing list