[vlc-devel] [vlc-commits] compat: test heap allocation replacements
Rémi Denis-Courmont
remi at remlab.net
Mon Jul 29 13:16:18 CEST 2019
Hi,
How do you test undefined behaviour? I think it's untestable by (lack of) definition.
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é.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20190729/0cdb9db9/attachment.html>
More information about the vlc-devel
mailing list