[cfe-dev] sizeof (RopeRefCountString)

Zhongxing Xu xuzhongxing at gmail.com
Mon Sep 15 18:34:06 PDT 2008


2008/9/16 Chris Lattner <clattner at apple.com>

> On Sep 15, 2008, at 2:40 PM, Ted Kremenek wrote:
>
>> On Sep 7, 2008, at 1:32 AM, Zhongxing Xu wrote:
>>
>>> In RewriteRope.cpp, RewriteRope::MakeRopeString(const char *Start,
>>> const char *End),
>>> we calculate the AllocSize by:
>>>
>>> unsigned AllocSize = sizeof(RopeRefCountString) - 1 + AllocChunkSize;
>>>
>>> I guess here the intention is: sizeof(RopeRefCountString) is 5. But
>>> gcc says sizeof(RopeRefCountString) is 8. So the actual AllocSize is
>>> 4087. Should we minus 4 instead of 1 to make the AllocSize 4084?
>>>
>>
>> The "-1" I believe is to accommodate for the field Data[1], which
>> occupies a single byte:
>>
>>  struct RopeRefCountString {
>>    unsigned RefCount;
>>    char Data[1];  //  Variable sized.
>>
>>    void addRef() { ... }
>>    void dropRef() { ... }
>>  };
>>
>> By subtracting 1, the field "Data" refers to an array with size
>> AllocChunkSize.
>>
>
> That was the intention, but it forgot the tail padding, so this is a real
> 'bug'.  The intention was the make the allocation just under a page in size.
>  Is this causing a problem in practice?


No, it's not causing any problem in practice.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20080916/491eea1e/attachment.html>


More information about the cfe-dev mailing list