From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_LOW,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 13933 invoked from network); 25 May 2023 14:45:43 -0000 Received: from second.openwall.net (193.110.157.125) by inbox.vuxu.org with ESMTPUTF8; 25 May 2023 14:45:43 -0000 Received: (qmail 30285 invoked by uid 550); 25 May 2023 14:45:31 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 30225 invoked from network); 25 May 2023 14:45:30 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=IzmPsIRVTRmL9dzkwJvgAQel3rjm65qXouIvBkYTWd0=; b=FznpwV/27GYKUr8Vf8iyJsMEs0K7I2+CpJbkfpjO+WJrK9yqnUo8JaCh +blvhBWttH1PlOIInfRYMt0lZfeYHNUH3Bt7IKh68zjFcjO7urdRu52ow YB81VtfYYlmiw3KAkpLlfoOHo1TQ2h59w4kbl3/4DtXcUJClIplEcDJgT s=; Authentication-Results: mail3-relais-sop.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=Jens.Gustedt@inria.fr; dmarc=fail (p=none dis=none) d=inria.fr X-IronPort-AV: E=Sophos;i="6.00,191,1681164000"; d="scan'208";a="57007333" From: Jens Gustedt To: musl@lists.openwall.com Date: Thu, 25 May 2023 16:44:59 +0200 Message-Id: <26b68deb9fc65f8331c7fedaa6d807f4d973a4e6.1684932942.git.Jens.Gustedt@inria.fr> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [musl] [C23 const 1/2] C23: change bsearch to a macro that respects the const contract This adds a macro interface to stdlib that has an additional cast of the return value to `void const*` for the case that the argument to the call was also const-qualified. Nothing changes for the function itself, only the identifier has to be protected with (), such that the macro does not expand for the function declaration or definition. --- include/stdlib.h | 12 +++++++++++- src/include/stdlib.h | 2 ++ src/stdlib/bsearch.c | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/stdlib.h b/include/stdlib.h index 68ccd467..f5281777 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -60,7 +60,17 @@ char *getenv (const char *); int system (const char *); -void *bsearch (const void *, const void *, size_t, size_t, int (*)(const void *, const void *)); +void * (bsearch) (const void *, const void *, size_t, size_t, int (*)(const void *, const void *)); +#if __STDC_VERSION__ > 201112L +# define bsearch(K, B, N, S, C) \ + _Generic( \ + /* ensure conversion to a void pointer */ \ + 1 ? (B) : (void*)1, \ + void const*: (void const*)bsearch((K), (void const*)(B), (N), (S), (C)), \ + /* volatile qualification of *B is an error for this call */ \ + default: bsearch((K), (B), (N), (S), (C)) \ +) +#endif void qsort (void *, size_t, size_t, int (*)(const void *, const void *)); int abs (int); diff --git a/src/include/stdlib.h b/src/include/stdlib.h index 812b04de..f0b03df9 100644 --- a/src/include/stdlib.h +++ b/src/include/stdlib.h @@ -16,4 +16,6 @@ hidden void *__libc_calloc(size_t, size_t); hidden void *__libc_realloc(void *, size_t); hidden void __libc_free(void *); +#undef bsearch + #endif diff --git a/src/stdlib/bsearch.c b/src/stdlib/bsearch.c index fe050ea3..4f62ea37 100644 --- a/src/stdlib/bsearch.c +++ b/src/stdlib/bsearch.c @@ -1,6 +1,6 @@ #include -void *bsearch(const void *key, const void *base, size_t nel, size_t width, int (*cmp)(const void *, const void *)) +void *(bsearch)(const void *key, const void *base, size_t nel, size_t width, int (*cmp)(const void *, const void *)) { void *try; int sign; -- 2.34.1