From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 4CC683858D32 for ; Mon, 8 May 2023 14:20:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4CC683858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1683555628; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9OU5CeGB7lCJXal04YPVLImDokPiZNlMd2XYJvDzOLg=; b=QUzJsAh9BgQS/60/jABpvAv3Vau+q0Xi77pbkIYZtZ1N9RvDRYOX4gJ+DNGwkVqiTpJw5l hqTkvRa9dmJGtQEUTBTfKFZvgwFDWw0jlIaWyD9NsmqsJ6c/kCraBNGBjH5lpJFyrUE0XX ODGv68A2sc2fbGigPx8RhLUsk/3gA54= Received: from mail-yw1-f199.google.com (mail-yw1-f199.google.com [209.85.128.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-354-AC-BzViROZucClyvXmd9Mw-1; Mon, 08 May 2023 10:20:27 -0400 X-MC-Unique: AC-BzViROZucClyvXmd9Mw-1 Received: by mail-yw1-f199.google.com with SMTP id 00721157ae682-559d35837bbso87380167b3.3 for ; Mon, 08 May 2023 07:20:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683555626; x=1686147626; h=content-transfer-encoding:in-reply-to:organization:from:references :cc:to:content-language:subject:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=9OU5CeGB7lCJXal04YPVLImDokPiZNlMd2XYJvDzOLg=; b=BTsAZ2fAoQgH1z/OVdE2eElIl94k1/qBa1TmqwjKWctznK8QpKRMbLWeOGNE9ZScwo ch8qZsAmbOVBR3K8WbDuEFmbub5NgKNASW7WEHvapX5c/PCipAXC8P9/R3wrSn9s+qWT rAoWWGLiKLX3l10Ndb6lWwznaDWZeP71eeT0KJG8kZ+gYSQwTKCLL9om8ks8g7EHcFnE xncTjNSde1Cil/CBSs9X6aY8rF7qM+9yT+Z4NhmGrOuGMzppYXgGYZarJSKP5WiisUvZ 9W7vjaZR0eSc935NikMhirgmhToi19WdmXLCw1FSM5IixHvRonSSb5mqKbWFs12lwlMr yICg== X-Gm-Message-State: AC+VfDzMpxuel6pdiTFnb7oTo3D7EgV8lpdNUvrI7s1z5ziyB1hZGYtb APphGSwJ4vQFWubKLc7y+Wa7DQVYsu0wJBjO/9VT1OUunjN7tHxlIrQ/Zwacn9q2C+GJtUe8pbJ YSqT/j2A4cpIyBuaPqqXSLSVdDl4v X-Received: by 2002:a81:498f:0:b0:55a:6c69:1514 with SMTP id w137-20020a81498f000000b0055a6c691514mr11275733ywa.40.1683555626032; Mon, 08 May 2023 07:20:26 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ77fkRGBT4CI0qLFdGwkUxsBW2cJmlHsLQ0D2zn2B9FWEBB80MWZpzYlMNfZcj4+tH7z0KeRA== X-Received: by 2002:a81:498f:0:b0:55a:6c69:1514 with SMTP id w137-20020a81498f000000b0055a6c691514mr11275716ywa.40.1683555625738; Mon, 08 May 2023 07:20:25 -0700 (PDT) Received: from [192.168.0.241] ([198.48.244.52]) by smtp.gmail.com with ESMTPSA id o206-20020a0dccd7000000b0055a881abfc3sm2525462ywd.135.2023.05.08.07.20.24 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 08 May 2023 07:20:25 -0700 (PDT) Message-ID: Date: Mon, 8 May 2023 10:20:24 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.10.0 Subject: Re: [patch v5] aligned_alloc: conform to C17 To: DJ Delorie Cc: libc-alpha@sourceware.org References: From: Carlos O'Donell Organization: Red Hat In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_NUMSUBJECT,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 5/2/23 15:01, DJ Delorie wrote: > > Changes as requested... > LGTM. Reviewed-by: Carlos O'Donell > From a2c1315544c72dedfcbd94b2efa7afb3eb1f0a02 Mon Sep 17 00:00:00 2001 > From: DJ Delorie > Date: Tue, 21 Mar 2023 00:46:43 -0400 > Subject: aligned_alloc: conform to C17 > > This patch adds the strict checking for power-of-two alignments > in aligned_alloc(), and updates the manual accordingly. > > diff --git a/malloc/Makefile b/malloc/Makefile > index f4cae2538c..57a9677512 100644 > --- a/malloc/Makefile > +++ b/malloc/Makefile > @@ -44,11 +44,13 @@ tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \ > tst-safe-linking \ > tst-mallocalign1 \ > tst-memalign-2 \ > - tst-memalign-3 > + tst-memalign-3 \ > + tst-aligned-alloc OK. > > tests-static := \ > tst-interpose-static-nothread \ > - tst-interpose-static-thread > + tst-interpose-static-thread \ > + tst-aligned-alloc-static OK. > > # Test for the malloc_set_state symbol removed in glibc 2.25. > ifeq ($(have-GLIBC_2.23)$(build-shared),yesyes) > diff --git a/malloc/malloc-debug.c b/malloc/malloc-debug.c > index 3867d15698..da9d2340d3 100644 > --- a/malloc/malloc-debug.c > +++ b/malloc/malloc-debug.c > @@ -299,7 +299,14 @@ __debug_memalign (size_t alignment, size_t bytes) > return _debug_mid_memalign (alignment, bytes, RETURN_ADDRESS (0)); > } > strong_alias (__debug_memalign, memalign) > -strong_alias (__debug_memalign, aligned_alloc) > +static void * > +__debug_aligned_alloc (size_t alignment, size_t bytes) > +{ > + if (!powerof2 (alignment) || alignment == 0) > + return NULL; > + return _debug_mid_memalign (alignment, bytes, RETURN_ADDRESS (0)); > +} > +strong_alias (__debug_aligned_alloc, aligned_alloc) OK. > > static void * > __debug_pvalloc (size_t bytes) > diff --git a/malloc/malloc.c b/malloc/malloc.c > index e33ed665db..5d8b61d66c 100644 > --- a/malloc/malloc.c > +++ b/malloc/malloc.c > @@ -3528,6 +3528,29 @@ __libc_memalign (size_t alignment, size_t bytes) > void *address = RETURN_ADDRESS (0); > return _mid_memalign (alignment, bytes, address); > } > +libc_hidden_def (__libc_memalign) > + > +/* For ISO C17. */ OK. Corrected. > +void * > +weak_function > +aligned_alloc (size_t alignment, size_t bytes) > +{ > + if (!__malloc_initialized) > + ptmalloc_init (); > + > +/* Similar to memalign, but starting with ISO C17 the standard > + requires an error for alignments that are not supported by the > + implementation. Valid alignments for the current implementation > + are non-negative powers of two. */ OK. > + if (!powerof2 (alignment) || alignment == 0) > + { > + __set_errno (EINVAL); > + return 0; > + } > + > + void *address = RETURN_ADDRESS (0); > + return _mid_memalign (alignment, bytes, address); > +} > > static void * > _mid_memalign (size_t alignment, size_t bytes, void *address) > @@ -3618,9 +3641,6 @@ _mid_memalign (size_t alignment, size_t bytes, void *address) > ar_ptr == arena_for_chunk (mem2chunk (p))); > return tag_new_usable (p); > } > -/* For ISO C11. */ > -weak_alias (__libc_memalign, aligned_alloc) > -libc_hidden_def (__libc_memalign) > > void * > __libc_valloc (size_t bytes) > diff --git a/malloc/tst-aligned-alloc-static.c b/malloc/tst-aligned-alloc-static.c > new file mode 100644 > index 0000000000..d504473094 > --- /dev/null > +++ b/malloc/tst-aligned-alloc-static.c > @@ -0,0 +1 @@ > +#include "tst-aligned-alloc.c" > diff --git a/malloc/tst-aligned-alloc.c b/malloc/tst-aligned-alloc.c > new file mode 100644 > index 0000000000..8bd6527147 > --- /dev/null > +++ b/malloc/tst-aligned-alloc.c > @@ -0,0 +1,80 @@ > +/* Test for C17 alignment requirements. OK. Corrected. > + Copyright (C) 2023 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library 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. > + > + The GNU C Library 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 the GNU C Library; if not, see > + . */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +static int > +do_test (void) > +{ > + void *p1; > + void *p2; > + void *p3; > + void *p4; > + void *p5; > + > + errno = 0; > + > + /* The implementation supports alignments that are non-negative powers of 2. > + We test 5 distinct conditions here: > + - A non-negative power of 2 alignment e.g. 64. > + - A degenerate zero power of 2 alignment e.g. 1. > + - A non-power-of-2 alignment e.g. 65. > + - A zero alignment. > + - A corner case SIZE_MAX / 2 + 1 alignment. > + */ > + > + p1 = aligned_alloc (64, 64); > + > + if (p1 == NULL) > + FAIL_EXIT1 ("aligned_alloc(64, 64) failed"); > + > + p2 = aligned_alloc (1, 64); > + > + if (p2 == NULL) > + FAIL_EXIT1 ("aligned_alloc(1, 64) failed"); > + > + p3 = aligned_alloc (65, 64); > + > + if (p3 != NULL) > + FAIL_EXIT1 ("aligned_alloc(65, 64) did not fail"); > + > + p4 = aligned_alloc (0, 64); > + > + if (p4 != NULL) > + FAIL_EXIT1 ("aligned_alloc(0, 64) did not fail"); > + > + /* This is an alignment like 0x80000000...UL */ > + p5 = aligned_alloc (SIZE_MAX / 2 + 1, 64); > + > + if (p5 != NULL) > + FAIL_EXIT1 ("aligned_alloc(SIZE_MAX/2+1, 64) did not fail"); > + > + free (p1); > + free (p2); > + return 0; > +} > + > +#define TEST_FUNCTION do_test () > +#include "../test-skeleton.c" > diff --git a/manual/memory.texi b/manual/memory.texi > index 9d3398a326..8952ff2bfa 100644 > --- a/manual/memory.texi > +++ b/manual/memory.texi > @@ -995,7 +995,7 @@ power of two than that, use @code{aligned_alloc} or @code{posix_memalign}. > @c Alias to memalign. > The @code{aligned_alloc} function allocates a block of @var{size} bytes whose > address is a multiple of @var{alignment}. The @var{alignment} must be a > -power of two and @var{size} must be a multiple of @var{alignment}. > +power of two. > > The @code{aligned_alloc} function returns a null pointer on error and sets > @code{errno} to one of the following values: > -- Cheers, Carlos.