[vlc-devel] [vlc-commits] compat: test heap allocation replacements

Steve Lhomme robux4 at ycbcr.xyz
Mon Jul 29 13:29:35 CEST 2019


On 2019-07-29 13:16, Rémi Denis-Courmont wrote:
> Hi,
> 
> How do you test undefined behaviour? I think it's untestable by (lack of) definition.

True. I was worried about this code:

     /* align must be valid/supported */
     assert(align <= alignof (max_align_t));
     return malloc(((void) align, size));

It will assert for developers but just allocate whatever in production. 
Since it's undefined behaviour I guess it's OK to have a different 
behaviour between the two.

> Le 29 juillet 2019 09:19:22 GMT+03:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
>> It seems that you are not testing failure when the code tries to align
>> to a value higher than max_align_t.
>>
>> On 2019-07-26 21:20, Rémi Denis-Courmont wrote:
>>> vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri
>> Jul 26 21:12:32 2019 +0300| [07e3b65d24cd84cbffe8f35f7e38b76546e80e8b]
>> | committer: Rémi Denis-Courmont
>>>
>>> compat: test heap allocation replacements
>>>
>>>>
>> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=07e3b65d24cd84cbffe8f35f7e38b76546e80e8b
>>> ---
>>>
>>>    compat/Makefile.am |   4 ++
>>>    compat/test/heap.c | 105
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>    2 files changed, 109 insertions(+)
>>>
>>> diff --git a/compat/Makefile.am b/compat/Makefile.am
>>> index d709d565c5..cc1d33bb59 100644
>>> --- a/compat/Makefile.am
>>> +++ b/compat/Makefile.am
>>> @@ -13,9 +13,13 @@ dummy.c:
>>>    
>>>    
>>>    check_PROGRAMS = \
>>> +	test_heap \
>>>    	test_strnstr
>>>    
>>>    TESTS = $(check_PROGRAMS)
>>> +AM_TESTS_ENVIRONMENT = ASAN_OPTIONS="allocator_may_return_null=1"
>>>    
>>> +test_heap_SOURCES = test/heap.c
>>> +test_heap_LDADD = libcompat.la
>>>    test_strnstr_SOURCES = test/strnstr.c
>>>    test_strnstr_LDADD = libcompat.la
>>> diff --git a/compat/test/heap.c b/compat/test/heap.c
>>> new file mode 100644
>>> index 0000000000..a4933295ff
>>> --- /dev/null
>>> +++ b/compat/test/heap.c
>>> @@ -0,0 +1,105 @@
>>>
>> +/*****************************************************************************
>>> + * aligned_alloc test case
>>> +
>> *****************************************************************************
>>> + * Copyright © 2019 Rémi Denis-Courmont
>>> + *
>>> + * This program is free software; you can redistribute it and/or
>> modify it
>>> + * under the terms of the GNU Lesser General Public License as
>> published by
>>> + * the Free Software Foundation; either version 2.1 of the License,
>> or
>>> + * (at your option) any later version.
>>> + *
>>> + * This program is distributed in the hope that it will be useful,
>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>>> + * GNU Lesser General Public License for more details.
>>> + *
>>> + * You should have received a copy of the GNU Lesser General Public
>> License
>>> + * along with this program; if not, write to the Free Software
>> Foundation,
>>> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
>>> +
>> *****************************************************************************/
>>> +
>>> +#include "config.h"
>>> +#undef NDEBUG
>>> +#include <assert.h>
>>> +#include <stdalign.h>
>>> +#include <stddef.h>
>>> +#include <stdint.h>
>>> +#include <stdlib.h>
>>> +#include <errno.h>
>>> +
>>> +struct big_align_struct {
>>> +    long long ll;
>>> +    double d;
>>> +};
>>> +
>>> +/* Supported alignments. Others are undefined (ISO C11 §7.22.3,
>> §J.2). */
>>> +static const size_t alignv[] = {
>>> +    alignof (char),
>>> +    alignof (short),
>>> +    alignof (int),
>>> +    alignof (long),
>>> +    alignof (long long),
>>> +    alignof (float),
>>> +    alignof (double),
>>> +    alignof (struct big_align_struct),
>>> +    alignof (void *),
>>> +    alignof (max_align_t),
>>> +};
>>> +
>>> +static const size_t alignc = sizeof (alignv) / sizeof (alignv[0]);
>>> +
>>> +static void test_posix_memalign(size_t align, size_t size)
>>> +{
>>> +    void *p;
>>> +    int val = posix_memalign(&p, align, size);
>>> +
>>> +    if (align >= sizeof (void *)) {
>>> +        if (val == 0) {
>>> +            assert(((uintptr_t)p & (align - 1)) == 0);
>>> +            free(p);
>>> +        }
>>> +    } else
>>> +        assert(val != 0);
>>> +}
>>> +
>>> +int main(void)
>>> +{
>>> +    void *p;
>>> +
>>> +    /* aligned_alloc() */
>>> +
>>> +    for (size_t i = 0; i < alignc; i++) {
>>> +        size_t align = alignv[i];
>>> +
>>> +        assert((align & (align - 1)) == 0); /* must be a power of
>> two */
>>> +
>>> +        p = aligned_alloc(alignv[i], 0);
>>> +        free(p); /* must free {aligned_,c,m,c,re}alloc() allocations
>> */
>>> +
>>> +        for (size_t j = 0; j < alignc; j++) {
>>> +             size_t size = alignv[j];
>>> +
>>> +             if (size < align)
>>> +                 continue; /* size must be a multiple of alignment
>> */
>>> +
>>> +             p = aligned_alloc(align, size);
>>> +             assert(p != NULL); /* small non-zero bytes allocation
>> */
>>> +             assert(((uintptr_t)p & (align - 1)) == 0);
>>> +             free(p);
>>> +        }
>>> +    }
>>> +
>>> +    /* posix_memalign() */
>>> +
>>> +    for (size_t i = 0; i < 21; i++) {
>>> +        size_t align = (size_t)1 << i;
>>> +
>>> +        test_posix_memalign(align, 0);
>>> +        test_posix_memalign(align, 1);
>>> +        test_posix_memalign(align, align - 1);
>>> +        test_posix_memalign(align, align);
>>> +        test_posix_memalign(align, align * 2);
>>> +    }
>>> +
>>> +    return 0;
>>> +}
>>>
>>> _______________________________________________
>>> vlc-commits mailing list
>>> vlc-commits at videolan.org
>>> https://mailman.videolan.org/listinfo/vlc-commits
>>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
> 
> -- 
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
> 
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
> 


More information about the vlc-devel mailing list