[libcxx] r284210 - XFAIL aligned allocation test failures with UBSAN

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 14 15:40:31 PDT 2016


On Fri, Oct 14, 2016 at 3:34 PM, Eric Fiselier via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Oh, I have another idea: could it be that you're also turning some
> optimization on when UBSan is enabled? Note that the operator new/operator
> delete pair is elidable in each of these tests, and Clang will remove the
> calls when compiling with optimizations enabled.
>
> That's it. The UBSAN tests build w/ -O2.
>

OK. You should be able to get the tests to pass by escaping the allocation
somehow. Try changing the type of the x variable to 'B *volatile'.


> /Eric
>
> On Fri, Oct 14, 2016 at 4:18 PM, Richard Smith <richard at metafoo.co.uk>
> wrote:
>
>> Oh, I have another idea: could it be that you're also turning some
>> optimization on when UBSan is enabled? Note that the operator new/operator
>> delete pair is elidable in each of these tests, and Clang will remove the
>> calls when compiling with optimizations enabled.
>>
>> On Fri, Oct 14, 2016 at 2:38 PM, Eric Fiselier via cfe-commits <
>> cfe-commits at lists.llvm.org> wrote:
>>
>>> UBSAN may not be replacing the function, but it is doing something weird
>>> at the codegen level. I looked into this a while ago but never sorted it
>>> out.
>>>
>>> Either way I'll clarify the comments and add the missing reset() calls.
>>> Unfortunately the tests still fail in the same way.
>>>
>>> On Fri, Oct 14, 2016 at 11:49 AM, Richard Smith <richard at metafoo.co.uk>
>>> wrote:
>>>
>>>> On Fri, Oct 14, 2016 at 12:49 AM, Eric Fiselier via cfe-commits <
>>>> cfe-commits at lists.llvm.org> wrote:
>>>>
>>>>> Author: ericwf
>>>>> Date: Fri Oct 14 02:49:15 2016
>>>>> New Revision: 284210
>>>>>
>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=284210&view=rev
>>>>> Log:
>>>>> XFAIL  aligned allocation test failures with UBSAN
>>>>>
>>>>> Modified:
>>>>>     libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.array/delete_align_val_t_replace.pass.cpp
>>>>>     libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.array/new_align_val_t_nothrow_replace.pass.cpp
>>>>>     libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.single/delete_align_val_t_replace.pass.cpp
>>>>>     libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.single/new_align_val_t_nothrow_replace.pass.cpp
>>>>>
>>>>> Modified: libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.array/delete_align_val_t_replace.pass.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/la
>>>>> nguage.support/support.dynamic/new.delete/new.delete.array/d
>>>>> elete_align_val_t_replace.pass.cpp?rev=284210&r1=284209&r2=2
>>>>> 84210&view=diff
>>>>> ============================================================
>>>>> ==================
>>>>> --- libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.array/delete_align_val_t_replace.pass.cpp (original)
>>>>> +++ libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.array/delete_align_val_t_replace.pass.cpp Fri Oct 14
>>>>> 02:49:15 2016
>>>>> @@ -17,6 +17,9 @@
>>>>>  // None of the current GCC compilers support this.
>>>>>  // XFAIL: gcc-4, gcc-5, gcc-6
>>>>>
>>>>> +// UBSAN replaces certain new/delete functions which makes this test
>>>>> fail
>>>>>
>>>>
>>>> I don't think that's the problem; the UBSan runtime doesn't replace any
>>>> functions. Instead...
>>>>
>>>>
>>>>> +// XFAIL: ubsan
>>>>> +
>>>>>  #include <new>
>>>>>  #include <cstddef>
>>>>>  #include <cstdlib>
>>>>> @@ -58,24 +61,24 @@ struct alignas(std::max_align_t) B {};
>>>>>  int main()
>>>>>  {
>>>>>
>>>>
>>>> I think you're missing a call to reset() here. It looks like the
>>>> sanitizer runtimes happen to call 'operator new' before entering main.
>>>>
>>>>
>>>>>      {
>>>>> -        B *x = new B;
>>>>> +        B *x = new B[2];
>>>>>          assert(0 == unsized_delete_called);
>>>>>          assert(0 == unsized_delete_nothrow_called);
>>>>>          assert(0 == aligned_delete_called);
>>>>>
>>>>> -        delete x;
>>>>> +        delete [] x;
>>>>>          assert(1 == unsized_delete_called);
>>>>>          assert(0 == unsized_delete_nothrow_called);
>>>>>          assert(0 == aligned_delete_called);
>>>>>      }
>>>>>      reset();
>>>>>      {
>>>>> -        A *x = new A;
>>>>> +        A *x = new A[2];
>>>>>          assert(0 == unsized_delete_called);
>>>>>          assert(0 == unsized_delete_nothrow_called);
>>>>>          assert(0 == aligned_delete_called);
>>>>>
>>>>> -        delete x;
>>>>> +        delete [] x;
>>>>>          assert(0 == unsized_delete_called);
>>>>>          assert(0 == unsized_delete_nothrow_called);
>>>>>          assert(1 == aligned_delete_called);
>>>>>
>>>>> Modified: libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.array/new_align_val_t_nothrow_replace.pass.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/la
>>>>> nguage.support/support.dynamic/new.delete/new.delete.array/n
>>>>> ew_align_val_t_nothrow_replace.pass.cpp?rev=284210&r1=284209
>>>>> &r2=284210&view=diff
>>>>> ============================================================
>>>>> ==================
>>>>> --- libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.array/new_align_val_t_nothrow_replace.pass.cpp
>>>>> (original)
>>>>> +++ libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.array/new_align_val_t_nothrow_replace.pass.cpp Fri
>>>>> Oct 14 02:49:15 2016
>>>>> @@ -13,9 +13,6 @@
>>>>>
>>>>>  // UNSUPPORTED: sanitizer-new-delete
>>>>>
>>>>> -// TODO Investigate why UBSAN prevents nothrow new from calling our
>>>>> replacement.
>>>>> -// XFAIL: ubsan
>>>>> -
>>>>>  #include <new>
>>>>>  #include <cstddef>
>>>>>  #include <cstdlib>
>>>>>
>>>>> Modified: libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.single/delete_align_val_t_replace.pass.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/la
>>>>> nguage.support/support.dynamic/new.delete/new.delete.single/
>>>>> delete_align_val_t_replace.pass.cpp?rev=284210&r1=284209&r2=
>>>>> 284210&view=diff
>>>>> ============================================================
>>>>> ==================
>>>>> --- libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.single/delete_align_val_t_replace.pass.cpp (original)
>>>>> +++ libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.single/delete_align_val_t_replace.pass.cpp Fri Oct
>>>>> 14 02:49:15 2016
>>>>> @@ -17,6 +17,9 @@
>>>>>  // None of the current GCC compilers support this.
>>>>>  // XFAIL: gcc-4, gcc-5, gcc-6
>>>>>
>>>>> +// UBSAN replaces certain new/delete functions which makes this test
>>>>> fail
>>>>> +// XFAIL: ubsan
>>>>> +
>>>>>  #include <new>
>>>>>  #include <cstddef>
>>>>>  #include <cstdlib>
>>>>>
>>>>> Modified: libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.single/new_align_val_t_nothrow_replace.pass.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/la
>>>>> nguage.support/support.dynamic/new.delete/new.delete.single/
>>>>> new_align_val_t_nothrow_replace.pass.cpp?rev=284210&r1=28420
>>>>> 9&r2=284210&view=diff
>>>>> ============================================================
>>>>> ==================
>>>>> --- libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.single/new_align_val_t_nothrow_replace.pass.cpp
>>>>> (original)
>>>>> +++ libcxx/trunk/test/std/language.support/support.dynamic/new.d
>>>>> elete/new.delete.single/new_align_val_t_nothrow_replace.pass.cpp Fri
>>>>> Oct 14 02:49:15 2016
>>>>> @@ -13,8 +13,6 @@
>>>>>
>>>>>  // UNSUPPORTED: sanitizer-new-delete
>>>>>
>>>>> -// TODO Investigate why UBSAN prevents nothrow new from calling our
>>>>> replacement.
>>>>> -// XFAIL: ubsan
>>>>>
>>>>>  #include <new>
>>>>>  #include <cstddef>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> cfe-commits mailing list
>>>>> cfe-commits at lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>>
>>>>
>>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>>
>>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161014/1a200490/attachment-0001.html>


More information about the cfe-commits mailing list