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 <[email protected] <javascript:>>
> 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 [email protected] <javascript:>.
>> 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 [email protected].
For more options, visit https://groups.google.com/d/optout.