From: Patrick Steinhardt <ps@pks.im>
To: Zejun Zhao <jelly.zhao.42@gmail.com>
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>,
Elijah Newren <newren@gmail.com>
Subject: Re: [GSOC][PATCH] apply: address -Wsign-comparison warnings
Date: Wed, 5 Feb 2025 08:47:06 +0100 [thread overview]
Message-ID: <Z6MXevArKhRLacAb@pks.im> (raw)
In-Reply-To: <20250205014055.737190-1-jelly.zhao.42@gmail.com>
On Wed, Feb 05, 2025 at 01:40:55AM +0000, Zejun Zhao wrote:
> There are several -Wsign-comparison warnings in "apply.c", which can be
> classified into the following three types:
>
> 1. comparing a `length` of `size_t` type with a result of pointer
> arithmetic of `int` type
>
> 2. comparing a `length` of `size_t` type with a `length` of `int` type
>
> 3. comparing a loop count `i` of `int` type with an unsigned loop
> bound
>
> Fix these warnings following one basic principle: do not touch the
> relevant logics and keep the behaviors of the code. Adopt three
> different strategies for each of the above three types:
>
> 1. cast the result of pointer arithmetic to `size_t` type
>
> 2. try to change the type of the `length` to `size_t` (may fall back
> to Strategy 1 if the variable is not guaranteed to be unsigned)
>
> 3. use a loop count `i` of `size_t` type
You should split up this patch into a series, as it is really hard to
follow what's going on. There are a couple of things happening:
- You change types in `struct apply_state`, which bubbles up.
- You adapt `git_hdr_len()` to receive different inputs, which bubbles
up.
- You perform small fixes in several places.
It might also be a good idea to split out the loop counters into a
separate commit, as those are trivially correct.
> Signed-off-by: Zejun Zhao <jelly.zhao.42@gmail.com>
> ---
> apply.c | 73 +++++++++++++++++++++++++++------------------------------
> apply.h | 6 ++---
> 2 files changed, 38 insertions(+), 41 deletions(-)
>
> diff --git a/apply.c b/apply.c
> index 4a7b6120ac..0c7b89dc3a 100644
> --- a/apply.c
> +++ b/apply.c
> @@ -8,7 +8,6 @@
> */
>
> #define USE_THE_REPOSITORY_VARIABLE
> -#define DISABLE_SIGN_COMPARE_WARNINGS
>
> #include "git-compat-util.h"
> #include "abspath.h"
> @@ -540,7 +539,7 @@ static size_t date_len(const char *line, size_t len)
> !isdigit(*p++) || !isdigit(*p++)) /* Not a date. */
> return 0;
>
> - if (date - line >= strlen("19") &&
> + if ((size_t) (date - line) >= strlen("19") &&
We know that `date` is always bigger than or equal to `line`, so this is
correct.
> @@ -1087,11 +1086,11 @@ static int gitdiff_index(struct gitdiff_data *state,
> * and optional space with octal mode.
> */
> const char *ptr, *eol;
> - int len;
> - const unsigned hexsz = the_hash_algo->hexsz;
> + size_t len;
> + const size_t hexsz = the_hash_algo->hexsz;
The change to `hexsz` shouldn't be needed, even if it makes us match the
type of `hexsz` as declared in `git_hash_algo`.
> ptr = strchr(line, '.');
> - if (!ptr || ptr[1] != '.' || hexsz < ptr - line)
> + if (!ptr || ptr[1] != '.' || hexsz < (size_t) (ptr - line))
`ptr` is the reline of `strrchr(line)`, so it must be either `NULL` or
greater than or equal to `line`, so this cast is fine.
> @@ -1158,7 +1157,7 @@ static const char *skip_tree_prefix(int p_value,
> */
> static char *git_header_name(int p_value,
> const char *line,
> - int llen)
> + size_t llen)
> {
> const char *name;
> const char *second = NULL;
It would make sense to split this change out into a separate commit, as
it bubbles up into calling functions, as well.
> @@ -1207,7 +1206,7 @@ static char *git_header_name(int p_value,
> cp = skip_tree_prefix(p_value, second, line + llen - second);
> if (!cp)
> goto free_and_fail1;
> - if (line + llen - cp != first.len ||
> + if ((size_t) (line + llen - cp) != first.len ||
> memcmp(first.buf, cp, first.len))
> goto free_and_fail1;
> return strbuf_detach(&first, NULL);
This cast should be fine, too.
> @@ -1240,7 +1239,7 @@ static char *git_header_name(int p_value,
> goto free_and_fail2;
>
> len = sp.buf + sp.len - np;
> - if (len < second - name &&
> + if (len < (size_t) (second - name) &&
> !strncmp(np, name, len) &&
> isspace(name[len])) {
> /* Good */
This one, too. `second` is iterating through `name`, so it's always
greater or equal to `name`.
> @@ -1371,14 +1370,13 @@ int parse_git_diff_header(struct strbuf *root,
> { "index ", gitdiff_index },
> { "", gitdiff_unrecognized },
> };
> - int i;
>
> len = linelen(line, size);
> if (!len || line[len-1] != '\n')
> break;
> - for (i = 0; i < ARRAY_SIZE(optable); i++) {
> + for (size_t i = 0; i < ARRAY_SIZE(optable); i++) {
> const struct opentry *p = optable + i;
> - int oplen = strlen(p->str);
> + size_t oplen = strlen(p->str);
> int res;
> if (len < oplen || memcmp(p->str, line, oplen))
> continue;
Makes sense.
> @@ -1592,7 +1590,7 @@ static int find_header(struct apply_state *state,
> size, patch);
> if (git_hdr_len < 0)
> return -128;
> - if (git_hdr_len <= len)
> + if ((size_t) git_hdr_len <= len)
> continue;
> *hdrsize = git_hdr_len;
> return offset;
We've asserted that `git_hdr_len` isn't negative, so the cast is fine.
> @@ -2185,7 +2182,7 @@ static int parse_chunk(struct apply_state *state, char *buffer, unsigned long si
> };
> int i;
This may arguably be `size_t`, as well.
> @@ -2257,12 +2255,12 @@ static void show_stats(struct apply_state *state, struct patch *patch)
> }
>
> if (patch->is_binary) {
> - printf(" %-*s | Bin\n", max, qname.buf);
> + printf(" %-*s | Bin\n", (int) max, qname.buf);
> strbuf_release(&qname);
> return;
> }
>
> - printf(" %-*s |", max, qname.buf);
> + printf(" %-*s |", (int) max, qname.buf);
> strbuf_release(&qname);
>
> /*
Do we _know_ that `max` fits into an `int`?
Patrick
next prev parent reply other threads:[~2025-02-05 7:47 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-05 1:40 [GSOC][PATCH] apply: address -Wsign-comparison warnings Zejun Zhao
2025-02-05 7:47 ` Patrick Steinhardt [this message]
2025-02-05 15:42 ` Zejun Zhao
2025-02-05 12:58 ` Junio C Hamano
2025-02-05 16:49 ` Zejun Zhao
2025-02-09 8:12 ` [GSOC][PATCH v2 0/6] " Zejun Zhao
2025-02-09 8:12 ` [GSOC][PATCH v2 1/6] apply: change fields in `apply_state` to unsigned Zejun Zhao
2025-02-13 9:51 ` Karthik Nayak
2025-02-13 18:39 ` Junio C Hamano
2025-02-09 8:12 ` [GSOC][PATCH v2 2/6] apply: change some variables from `int` to `size_t` Zejun Zhao
2025-02-13 6:08 ` Patrick Steinhardt
2025-02-16 7:12 ` [GSOC][PATCH] apply: address -Wsign-comparison warnings Zejun Zhao
2025-02-18 17:49 ` Junio C Hamano
2025-02-21 6:37 ` Zejun Zhao
2025-02-21 17:11 ` Junio C Hamano
2025-02-23 17:36 ` Zejun Zhao
2025-02-24 14:27 ` Junio C Hamano
2025-02-25 3:24 ` Zejun Zhao
2025-02-25 12:53 ` Junio C Hamano
2025-02-09 8:12 ` [GSOC][PATCH v2 3/6] apply: do a typecast to eliminate warnings Zejun Zhao
2025-02-09 8:12 ` [GSOC][PATCH v2 4/6] apply: cast some ptrdiff_t's to size_t's Zejun Zhao
2025-02-09 8:12 ` [GSOC][PATCH v2 5/6] apply: use `size_t` loop counters Zejun Zhao
2025-02-13 6:08 ` Patrick Steinhardt
2025-02-09 8:12 ` [GSOC][PATCH v2 6/6] apply: enable -Wsign-comparison checks Zejun Zhao
2025-02-16 7:28 ` [GSOC][PATCH v3 0/6] apply: address -Wsign-comparison warnings Zejun Zhao
2025-02-16 7:28 ` [PATCH v3 1/6] apply: correct type misuse in `apply.h` Zejun Zhao
2025-02-16 7:28 ` [PATCH v3 2/6] apply: change some variables from `int` to `size_t` Zejun Zhao
2025-02-16 7:28 ` [PATCH v3 3/6] apply: do a typecast to eliminate warnings Zejun Zhao
2025-02-16 7:28 ` [PATCH v3 4/6] apply: cast some ptrdiff_t's to size_t's Zejun Zhao
2025-02-16 7:28 ` [PATCH v3 5/6] apply: use `size_t` loop counters Zejun Zhao
2025-02-16 7:28 ` [PATCH v3 6/6] apply: enable -Wsign-comparison checks Zejun Zhao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Z6MXevArKhRLacAb@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jelly.zhao.42@gmail.com \
--cc=newren@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.