From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.3 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 Received: from zero.zsh.org (zero.zsh.org [IPv6:2a02:898:31:0:48:4558:7a:7368]) by inbox.vuxu.org (Postfix) with ESMTP id 37C772C9B7 for ; Mon, 18 Mar 2024 08:15:21 +0100 (CET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=zsh.org; s=rsa-20210803; t=1710746121; b=f/ZjuMzb7owNFASP1YNVqdxLDL2kB06nh2euRHmVHw6ujCKUVPgEEbqieq8ZJoplGd146Xj3Wu qWs8HOURA9OrdZxd61JYm3cX4Yu0HGg58ZHsyBmbkbT2IOLDrI/uaXMojydApj8rdp22s+3UBv h1or5Z3id16Qv4j/BMTtaPXwgYtR0jcWR+By5lAFFKue/Osww8iEMaB6bYPByMKfwilQo3OfJT YjvXlg1PqHHGZziqGJqD/YK34svcu4kNwUSiB17W1NwC1y14O8MaLhR0KojsK9UDuRsTiZwyGi OiFe+gTx9wv00+yQPUV476cvkzBZbCCa3GT9ONqBbusGWw==; ARC-Authentication-Results: i=1; zsh.org; iprev=pass (mail-pl1-f179.google.com) smtp.remote-ip=209.85.214.179; dkim=pass header.d=gmail.com header.s=20230601 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=zsh.org; s=rsa-20210803; t=1710746121; bh=APOxZOzr2Y1oDfb3dSWmJ+yVtYpDKmKhpYseSZDs7VM=; h=List-Archive:List-Owner:List-Post:List-Unsubscribe:List-Subscribe:List-Help: List-Id:Sender:Content-Transfer-Encoding:MIME-Version:Message-ID:Date: Subject:Cc:To:From:DKIM-Signature:DKIM-Signature; b=A0u7b6cLHELvSA/JvJhM/BtPeNpf3s8T5a77NrCv7qoPnucAY6OnqX5EIIw9gdhschvJDzRVb9 OObKPiBPFBC5u7idspr8ZFJcHhfiKVqHhPfpZg2C6nvtih+vVkjxKvU12ZJXWQpLvb6OEvXOBn xImSORBZ7YrZk+dib8m4L/jHt/2eBOEzr0s93mFhxGI+vv7DEMwzcJj08MK62jFn1ekOTue9Un 6wLdBM7oSSpl97D1NFOzhA3Kb19k/iOp4Y+2YsXnUwIqhIlz5q18aaWTvD0u9FYBJDZ4HF++Pc wQ0j6xLryyQ2bMXjNAQa9Ra2l+Lxyq1zXxvN6xPq089nEg==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=zsh.org; s=rsa-20210803; h=List-Archive:List-Owner:List-Post:List-Unsubscribe: List-Subscribe:List-Help:List-Id:Sender:Content-Transfer-Encoding: MIME-Version:Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References; bh=u4I1c8k9hQ4xz2uUdid+CJMUrrYfpcjy+Ydt1JUyNx4=; b=iawddh4T/TerQ6Oys9ksw4m14x In3dO6peIHFww0U99l+fOrJfFPeES7d/CpO21awVePg05TZOB7icdwhWxYZWnAUHL5QIwIxMNbVtF UJLshMtoMfXDauLTXIZ0ULE5Rwvgy2vWm1J1pJ8QNYtdrGowidMKJZWas1SOnDgtH4f3VBN8rcllO B8WeZQdoq92jUgHVRrlSlVp3b+QQTqOAN9kdhOmMW5OA6uoNsw1FhWmzfJ3FYEdDc6D0b/8CMV0Go Sp1/NYnxLdRPKUkW/+74OY5vYxim5S4V3avBSlEl+6OWihujMWGoteNEO0hLvC/Tg4gVqVzL1l3Dr De6TOAJA==; Received: by zero.zsh.org with local id 1rm7DK-000M3P-SZ; Mon, 18 Mar 2024 07:15:18 +0000 Authentication-Results: zsh.org; iprev=pass (mail-pl1-f179.google.com) smtp.remote-ip=209.85.214.179; dkim=pass header.d=gmail.com header.s=20230601 header.a=rsa-sha256; dmarc=pass header.from=gmail.com; arc=none Received: from mail-pl1-f179.google.com ([209.85.214.179]:58464) by zero.zsh.org with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128) id 1rm7D6-000LmE-KU; Mon, 18 Mar 2024 07:15:05 +0000 Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-1e034607879so586095ad.0 for ; Mon, 18 Mar 2024 00:15:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710746102; x=1711350902; darn=zsh.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=u4I1c8k9hQ4xz2uUdid+CJMUrrYfpcjy+Ydt1JUyNx4=; b=PcDx5uqLN3/u1lbeZpj3vwklQlhhqraEnKqn/p9Z+xaaCy4BnrhQfhODOrYffxeFrk pZFpGN/NYw+mrlb1L4YQn6nNMthVRwD5WU/5X20yTXq1Fz8ZU1F3DsxzDafAgdMUs71Z 9uEHiE8RJaqxUgDGhBTmvhtWyey1NWyPXepa9g/Z7/N68YQcs/QsqOOkTjVt8oYv18n5 e8wZYNOTMrd9boyWYjiSEDBXIW2PuTshIejwzNnh/hNSFIaMOQFqQtMAM3Ru3+AZp1Wh 1pkDmFkk9rOTfj6P7G3p/G03+Rzi3Hh+eil2maI1wUUFl+UCeDrubvpisjcZbfTiVEp3 Drdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710746102; x=1711350902; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=u4I1c8k9hQ4xz2uUdid+CJMUrrYfpcjy+Ydt1JUyNx4=; b=doChm5DKQxeTm9o1q0NyimjAhjVWl1Ap2pbl0s4TBGYnKLvvHKnGhycmsNxo4ZRJWD aag2plqt+qd7mK2hzAi5u/fX9RXxsPqKR9EJdvycv2pOiseNkG3vZ0t15RUyUQzWW6vU hu51VsDmXST7c3JpdNoiiMU2FVPKgjVHatetBoEmQrH7qLcmgTP3mjxoFUx/FTnDMLYX Pg6bOC2aidca6c/hIVkDa66o+OoIW0pcwEoh8R13RGC/YuGdzJbEIp0KnlX5LP5lnNtE hKeiKAPs0GbvwP5e4yO4NDJ0QeF65KBc/Qc0YnHPsUZdye1bhaMoSuDMECLnAqqQrkUd X1Tg== X-Gm-Message-State: AOJu0YyFdEyD0ywUmXyuQ1ees3EIl4l7jFDoUpp5Y7jD7Vq/28xaFTB1 YlVWml6JEOjAn9Np+qk55tZEZvJzrlwoi+bKyAtA5zuMbK0gs6FaCFFo75sD X-Google-Smtp-Source: AGHT+IExy7qFz1kxNtTbUGgBSFeE2yeBYDNVMhidlxgUlG2i9MpRsV9MNM47y1+Ou6XxloUKZvq1Vg== X-Received: by 2002:a17:902:dac5:b0:1de:ff81:f650 with SMTP id q5-20020a170902dac500b001deff81f650mr10043767plx.10.1710746101906; Mon, 18 Mar 2024 00:15:01 -0700 (PDT) Received: from localhost.localdomain ([2404:c0:2020::10e4:fb4b]) by smtp.gmail.com with ESMTPSA id ky6-20020a170902f98600b001dcfbbb1ddesm8451612plb.7.2024.03.18.00.14.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Mar 2024 00:15:01 -0700 (PDT) From: James Tirta Halim To: zsh-workers@zsh.org Cc: James Tirta Halim Subject: [PATCH v2] prefer memcpy() over strcpy() Date: Mon, 18 Mar 2024 14:11:48 +0700 Message-ID: <20240318071148.135833-1-tirtajames45@gmail.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Seq: 52766 Archived-At: X-Loop: zsh-workers@zsh.org Errors-To: zsh-workers-owner@zsh.org Precedence: list Precedence: bulk Sender: zsh-workers-request@zsh.org X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Add zmemcpyz(), a memcpy() that nul-terminates the destination string. This is meant to be used when we have the strlen() of the string. We should prefer memcpy() when we know the length because it most libc implementations provide an assembly implementation of memcpy but maybe not strcpy(). Even if it is implemented in assembly, memcpy() is likely to be faster than strcpy() since as the loop condition strcpy() needs to check for zeros in SRC, whereas memcpy() can just decrement the size. --- Src/string.c | 56 +++++++++++++++++++++++++++++----------------------- Src/zsh.h | 10 ++++++++++ 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/Src/string.c b/Src/string.c index 5f439926e..12da19f72 100644 --- a/Src/string.c +++ b/Src/string.c @@ -33,11 +33,13 @@ mod_export char * dupstring(const char *s) { char *t; + size_t l; if (!s) return NULL; - t = (char *) zhalloc(strlen((char *)s) + 1); - strcpy(t, s); + l = strlen((char *)s); + t = (char *) zhalloc(l + 1); + zmemcpyz(t, s, l); return t; } @@ -68,7 +70,7 @@ dupstring_glen(const char *s, unsigned *len_ret) if (!s) return NULL; t = (char *) zhalloc((*len_ret = strlen((char *)s)) + 1); - strcpy(t, s); + zmemcpyz(t, s, *len_ret); return t; } @@ -77,11 +79,13 @@ mod_export char * ztrdup(const char *s) { char *t; + size_t l; if (!s) return NULL; - t = (char *)zalloc(strlen((char *)s) + 1); - strcpy(t, s); + l = strlen((char *)s); + t = (char *)zalloc(l + 1); + zmemcpyz(t, s, l); return t; } @@ -116,11 +120,12 @@ tricat(char const *s1, char const *s2, char const *s3) char *ptr; size_t l1 = strlen(s1); size_t l2 = strlen(s2); + size_t l3 = strlen(s3); - ptr = (char *)zalloc(l1 + l2 + strlen(s3) + 1); - strcpy(ptr, s1); - strcpy(ptr + l1, s2); - strcpy(ptr + l1 + l2, s3); + ptr = (char *)zalloc(l1 + l2 + l3 + 1); + memcpy(ptr, s1, l1); + memcpy(ptr + l1, s2, l2); + zmemcpyz(ptr + l1 + l2, s3, l3); return ptr; } @@ -131,11 +136,12 @@ zhtricat(char const *s1, char const *s2, char const *s3) char *ptr; size_t l1 = strlen(s1); size_t l2 = strlen(s2); + size_t l3 = strlen(s3); ptr = (char *)zhalloc(l1 + l2 + strlen(s3) + 1); - strcpy(ptr, s1); - strcpy(ptr + l1, s2); - strcpy(ptr + l1 + l2, s3); + memcpy(ptr, s1, l1); + memcpy(ptr + l1, s2, l2); + zmemcpyz(ptr + l1 + l2, s3, l3); return ptr; } @@ -148,10 +154,11 @@ dyncat(const char *s1, const char *s2) /* This version always uses space from the current heap. */ char *ptr; size_t l1 = strlen(s1); + size_t l2 = strlen(s2); - ptr = (char *)zhalloc(l1 + strlen(s2) + 1); - strcpy(ptr, s1); - strcpy(ptr + l1, s2); + ptr = (char *)zhalloc(l1 + l2 + 1); + memcpy(ptr, s1, l1); + zmemcpyz(ptr + l1, s2, l2); return ptr; } @@ -162,10 +169,11 @@ bicat(const char *s1, const char *s2) /* This version always uses permanently-allocated space. */ char *ptr; size_t l1 = strlen(s1); + size_t l2 = strlen(s2); - ptr = (char *)zalloc(l1 + strlen(s2) + 1); - strcpy(ptr, s1); - strcpy(ptr + l1, s2); + ptr = (char *)zalloc(l1 + l2 + 1); + memcpy(ptr, s1, l1); + zmemcpyz(ptr + l1, s2, l2); return ptr; } @@ -177,9 +185,7 @@ dupstrpfx(const char *s, int len) { char *r = zhalloc(len + 1); - memcpy(r, s, len); - r[len] = '\0'; - return r; + return zmemcpyz(r, s, len); } /**/ @@ -189,9 +195,7 @@ ztrduppfx(const char *s, int len) /* This version always uses permanently-allocated space. */ char *r = zalloc(len + 1); - memcpy(r, s, len); - r[len] = '\0'; - return r; + return zmemcpyz(r, s, len); } /* Append a string to an allocated string, reallocating to make room. */ @@ -200,7 +204,9 @@ ztrduppfx(const char *s, int len) mod_export char * appstr(char *base, char const *append) { - return strcat(realloc(base, strlen(base) + strlen(append) + 1), append); + size_t bl = strlen(base); + size_t al = strlen(append); + return zmemcpyz((char *)realloc(base, bl + al + 1) + bl, append, al); } /* Return a pointer to the last character of a string, diff --git a/Src/zsh.h b/Src/zsh.h index fae62b8d0..b10705356 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -3367,3 +3367,13 @@ typedef int convchar_t; #define ZWS(s) s #endif /* MULTIBYTE_SUPPORT */ + +#include +#include + +/* memcpy that nul-terminates DST. SRC need not be nul-terminated. */ +static inline char *zmemcpyz(char *dst, const char *src, size_t n) +{ + *((char *)memcpy(dst, src, n) + n) = '\0'; + return dst; +} -- 2.44.0