]> git.ipfire.org Git - thirdparty/git.git/commitdiff
use xstrncmpz()
authorRené Scharfe <l.s.r@web.de>
Sat, 10 Feb 2024 07:43:01 +0000 (08:43 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 12 Feb 2024 17:32:41 +0000 (09:32 -0800)
Add and apply a semantic patch for calling xstrncmpz() to compare a
NUL-terminated string with a buffer of a known length instead of using
strncmp() and checking the terminating NUL explicitly.  This simplifies
callers by reducing code duplication.

I had to adjust remote.c manually because Coccinelle inexplicably
changed the indent of the else branches.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
archive-tar.c
builtin/fast-export.c
builtin/merge.c
builtin/reflog.c
contrib/coccinelle/xstrncmpz.cocci [new file with mode: 0644]
convert.c
merge-ll.c
object.c
remote.c
userdiff.c

index f2a0ed77523b457fa17497498d3ffb4499773a1f..8ae30125f84c463118d70b69eae88d4d21d31905 100644 (file)
@@ -365,7 +365,7 @@ static struct archiver *find_tar_filter(const char *name, size_t len)
        int i;
        for (i = 0; i < nr_tar_filters; i++) {
                struct archiver *ar = tar_filters[i];
-               if (!strncmp(ar->name, name, len) && !ar->name[len])
+               if (!xstrncmpz(ar->name, name, len))
                        return ar;
        }
        return NULL;
index f18f0809f9c7f78874eaddfd869c5fc5d11831e0..4693d18cc94f09ecf760c4662753583052ebc4c6 100644 (file)
@@ -136,8 +136,7 @@ static int anonymized_entry_cmp(const void *cmp_data UNUSED,
        a = container_of(eptr, const struct anonymized_entry, hash);
        if (keydata) {
                const struct anonymized_entry_key *key = keydata;
-               int equal = !strncmp(a->orig, key->orig, key->orig_len) &&
-                           !a->orig[key->orig_len];
+               int equal = !xstrncmpz(a->orig, key->orig, key->orig_len);
                return !equal;
        }
 
index ebbe05033e98bc796ceeb6c70e6259b8c76c18f2..b390a8f6bc94f25f47e767efc340260c3ac08f25 100644 (file)
@@ -192,8 +192,7 @@ static struct strategy *get_strategy(const char *name)
                        int j, found = 0;
                        struct cmdname *ent = main_cmds.names[i];
                        for (j = 0; !found && j < ARRAY_SIZE(all_strategy); j++)
-                               if (!strncmp(ent->name, all_strategy[j].name, ent->len)
-                                               && !all_strategy[j].name[ent->len])
+                               if (!xstrncmpz(all_strategy[j].name, ent->name, ent->len))
                                        found = 1;
                        if (!found)
                                add_cmdname(&not_strategies, ent->name, ent->len);
index a5a4099f61a5f825d6e622572c9ee85ae563de7b..2c3369fca54f66f1625b6bcd2b786f909f515b26 100644 (file)
@@ -96,8 +96,7 @@ static struct reflog_expire_cfg *find_cfg_ent(const char *pattern, size_t len)
                reflog_expire_cfg_tail = &reflog_expire_cfg;
 
        for (ent = reflog_expire_cfg; ent; ent = ent->next)
-               if (!strncmp(ent->pattern, pattern, len) &&
-                   ent->pattern[len] == '\0')
+               if (!xstrncmpz(ent->pattern, pattern, len))
                        return ent;
 
        FLEX_ALLOC_MEM(ent, pattern, pattern, len);
diff --git a/contrib/coccinelle/xstrncmpz.cocci b/contrib/coccinelle/xstrncmpz.cocci
new file mode 100644 (file)
index 0000000..ccb39e2
--- /dev/null
@@ -0,0 +1,28 @@
+@@
+expression S, T, L;
+@@
+(
+- strncmp(S, T, L) || S[L]
++ !!xstrncmpz(S, T, L)
+|
+- strncmp(S, T, L) || S[L] != '\0'
++ !!xstrncmpz(S, T, L)
+|
+- strncmp(S, T, L) || T[L]
++ !!xstrncmpz(T, S, L)
+|
+- strncmp(S, T, L) || T[L] != '\0'
++ !!xstrncmpz(T, S, L)
+|
+- !strncmp(S, T, L) && !S[L]
++ !xstrncmpz(S, T, L)
+|
+- !strncmp(S, T, L) && S[L] == '\0'
++ !xstrncmpz(S, T, L)
+|
+- !strncmp(S, T, L) && !T[L]
++ !xstrncmpz(T, S, L)
+|
+- !strncmp(S, T, L) && T[L] == '\0'
++ !xstrncmpz(T, S, L)
+)
index a8870baff36a4a3042baf31c730793b45f6b6442..35b25eb3cb9212f92dd918d0f247e49ecd620c41 100644 (file)
--- a/convert.c
+++ b/convert.c
@@ -1028,7 +1028,7 @@ static int read_convert_config(const char *var, const char *value,
        if (parse_config_key(var, "filter", &name, &namelen, &key) < 0 || !name)
                return 0;
        for (drv = user_convert; drv; drv = drv->next)
-               if (!strncmp(drv->name, name, namelen) && !drv->name[namelen])
+               if (!xstrncmpz(drv->name, name, namelen))
                        break;
        if (!drv) {
                CALLOC_ARRAY(drv, 1);
index 1df58ebaac08582d042268f5a07cf5cbd9d7b1c3..31f4d031de29ca4e6d9971fc07f2f5eea15defe0 100644 (file)
@@ -286,7 +286,7 @@ static int read_merge_config(const char *var, const char *value,
         * after seeing merge.<name>.var1.
         */
        for (fn = ll_user_merge; fn; fn = fn->next)
-               if (!strncmp(fn->name, name, namelen) && !fn->name[namelen])
+               if (!xstrncmpz(fn->name, name, namelen))
                        break;
        if (!fn) {
                CALLOC_ARRAY(fn, 1);
index 2c61e4c86217e633d2e28acd0b3ae654584ede7d..e6a1c4d9059ab398f06f042a7b7cdd953ff6a943 100644 (file)
--- a/object.c
+++ b/object.c
@@ -47,8 +47,7 @@ int type_from_string_gently(const char *str, ssize_t len, int gentle)
                len = strlen(str);
 
        for (i = 1; i < ARRAY_SIZE(object_type_strings); i++)
-               if (!strncmp(str, object_type_strings[i], len) &&
-                   object_type_strings[i][len] == '\0')
+               if (!xstrncmpz(object_type_strings[i], str, len))
                        return i;
 
        if (gentle)
index 6bef95316af6573b5a6829ace42b183e25548939..405e7685cf59c391ac0c1cfd1b22ce228de4b672 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -105,7 +105,7 @@ static int remotes_hash_cmp(const void *cmp_data UNUSED,
        b = container_of(entry_or_key, const struct remote, ent);
 
        if (key)
-               return strncmp(a->name, key->str, key->len) || a->name[key->len];
+               return !!xstrncmpz(a->name, key->str, key->len);
        else
                return strcmp(a->name, b->name);
 }
@@ -189,8 +189,7 @@ static int branches_hash_cmp(const void *cmp_data UNUSED,
        b = container_of(entry_or_key, const struct branch, ent);
 
        if (key)
-               return strncmp(a->name, key->str, key->len) ||
-                      a->name[key->len];
+               return !!xstrncmpz(a->name, key->str, key->len);
        else
                return strcmp(a->name, b->name);
 }
index e399543823bdf2c0c8f24fb87f7622ac4d8a366b..2b1dab2649ac50b64abf99846e5b78c517e78ef4 100644 (file)
@@ -323,8 +323,7 @@ static int userdiff_find_by_namelen_cb(struct userdiff_driver *driver,
 {
        struct find_by_namelen_data *cb_data = priv;
 
-       if (!strncmp(driver->name, cb_data->name, cb_data->len) &&
-           !driver->name[cb_data->len]) {
+       if (!xstrncmpz(driver->name, cb_data->name, cb_data->len)) {
                cb_data->driver = driver;
                return 1; /* tell the caller to stop iterating */
        }