I solved this -- I just had to use extended alignment with my dynamic 
allocation to align the new object to 64 bytes.

On Monday, November 26, 2018 at 12:31:44 PM UTC-5, markdavi...@gmail.com 
wrote:
>
> Adding one more detail: I'm creating an instantiation of class A using new 
> like this:
>
> A* a = new A();
>
> Do I have to do something special with the new call to make sure it's 64 
> byte aligned? Can I solve this problem in the definition of A somehow? 
>
> On Monday, November 26, 2018 at 10:39:46 AM UTC-5, markdavi...@gmail.com 
> wrote:
>>
>> Thanks. Regarding your second point about how to align the aggregate: 
>> just to make sure I understand, is the recommended approach something like 
>> this, assuming class A is the aggregate that contains class C the child, 
>> and class C's alignment is 64 bytes:
>>
>> class alignas(64) A {
>>  C member_var; 
>>  /* class definition continued */
>> };
>>
>>
>>
>> However when I did this, I still got the same UBSAN error. So, I'm not 
>> sure how to actually align the address of objects of type A. I would think 
>> that specifying the alignment in the definition of class A would handle 
>> this, but it doesn't. Note that the way I'm creating objects of class A is 
>> via the new operator.
>>
>> Any pointers here would be helpful.
>>
>>
>>
>> On Wednesday, October 10, 2018 at 3:55:06 PM UTC-4, Reid Kleckner wrote:
>>>
>>> Generally, I think ubsan is discussed on the main clang list, cfe-dev. I 
>>> don't think there's a separate group for it, since it's fairly low 
>>> maintenance, and has more to do with checking fidly C++ language rules like 
>>> this.
>>>
>>> In any case, this seems pretty straightforward. If you request a certain 
>>> field alignment, that will raise the minimum required alignment for the 
>>> aggregate, and clang emits a ubsan check for that.
>>>
>>> It seems like the character arrays are enough to prevent false sharing. 
>>> If you put another padding array between 'r' and 'w' you shouldn't need to 
>>> worry about false sharing between them.
>>>
>>> On Wed, Oct 10, 2018 at 11:17 AM <markdavi...@gmail.com> wrote:
>>>
>>>>
>>>> (I'm posting this question about UBSAN on the ASAN list because I 
>>>> couldn't find a UBSAN list; let me know if there is one.)
>>>>
>>>> Hello, I have a pretty large C++11 program that I just ran UBSAN on and 
>>>> I'm getting errors related to misaligned addresses and alignments. It's 
>>>> non-trivial to show a sample program so I'm hoping I can get pointed in 
>>>> the 
>>>> right direction without that for now.
>>>>
>>>> The class C in question has the following characteristics:
>>>>
>>>>
>>>>    - Class C itself doesn't do anything special regarding memory 
>>>>    alignment. No posix_memalign, no alignas, etc.
>>>>    - Class C, however, has a member that is of class M
>>>>    - Class M does some alignment for some members using alignas. It 
>>>>    looks like this:
>>>>
>>>> #define FALSE_SHARING_RANGE 128
>>>>
>>>> class M {
>>>>     char pad0_[FALSE_SHARING_RANGE];
>>>>     alignas(FALSE_SHARING_RANGE) std::atomic<unsigned int> r;
>>>>     alignas(FALSE_SHARING_RANGE) std::atomic<unsigned int> w;
>>>>     char pad1_[FALSE_SHARING_RANGE - sizeof(w)];
>>>>
>>>>     void*          v1;
>>>>     const uint32_t s;
>>>>     const uint32_t b;
>>>>     const uint32_t pb;
>>>> }
>>>>
>>>>
>>>>  Here are the UBSAN errors:
>>>>
>>>> runtime error: constructor call on misaligned address 0x000003330ca0 
>>>> for type 'C', which requires 128 byte alignment
>>>> 0x000003330ca0: note: pointer points here
>>>>  00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 
>>>> 00 00 00 00 00 00  00 00 00 00
>>>>               ^ 
>>>> runtime error: constructor call on misaligned address 0x000003330ca0 
>>>> for type 'C *', which requires 128 byte alignment
>>>> 0x000003330ca0: note: pointer points here
>>>>  00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 
>>>> 00 00 00 00 00 00  00 00 00 00
>>>>               ^ 
>>>> runtime error: member call on misaligned address 0x000003330ca0 for 
>>>> type 'C *', which requires 128 byte alignment
>>>> 0x000003330ca0: note: pointer points here
>>>>
>>>>
>>>>  00 00 00 00  85 eb 03 00 00 00 00 00  00 00 00 00 00 00 00 00  00 00 
>>>> 00 00 00 00 00 00  00 00 00 00
>>>>               ^ 
>>>> ... similar errors continue
>>>>
>>>> Note that when the alignas specifiers on r and w are removed, the UBSAN 
>>>> errors go away.
>>>>
>>>> I'd greatly appreciate if someone can explain 1) why this is occuring; 
>>>> 2) and how to properly write the code to make the error go away. (Note: my 
>>>> motivation for the alignas attributes is to prevent false sharing between 
>>>> r 
>>>> and w as this class is used by concurrent threads.)
>>>>
>>>> -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "address-sanitizer" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to address-saniti...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>

-- 
You received this message because you are subscribed to the Google Groups 
"address-sanitizer" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to address-sanitizer+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to