Subject: Re: [PATCH 10/10] reftable: address trivial -Wsign-compare warnings

From: Junio C Hamano <[email-masked]>
Date: Thu, 16 Jan 2025 14:12:33 -0800

Patrick Steinhardt <[email-masked]> writes:

> Address the last couple of trivial -Wsign-compare warnings in the
> reftable library and remove the DISABLE_SIGN_COMPARE_WARNINGS macro that
> we have in "reftable/system.h".

Hmph.

> -	int l = strlen(str);
> +	size_t l = strlen(str);

Obviously correct.

> -	j = 1;
> -	while (j < count) {
> +	for (uint64_t j = 1; j < count; j++) {

OK.  As count is u64, it makes sense to match.

> diff --git a/reftable/stack.c b/reftable/stack.c
> index 531660a49f..5c0d6273a7 100644
> --- a/reftable/stack.c
> +++ b/reftable/stack.c
> @@ -220,9 +220,9 @@ void reftable_stack_destroy(struct reftable_stack *st)
>  	}
>  
>  	if (st->readers) {
> -		int i = 0;
>  		struct reftable_buf filename = REFTABLE_BUF_INIT;
> -		for (i = 0; i < st->readers_len; i++) {
> +
> +		for (size_t i = 0; i < st->readers_len; i++) {

Likewise, readers_len is size_t so counters can match it.

> -	for (i = 0; i < st->readers_len; i++) {
> +	for (size_t i = 0; i < st->readers_len; i++) {

Ditto.

> -		for (i = 0; !found && i < st->readers_len; i++) {
> +		for (size_t i = 0; !found && i < st->readers_len; i++)

Ditto.

> diff --git a/reftable/writer.c b/reftable/writer.c
> index 4e6ca2e368..91d6629486 100644
> --- a/reftable/writer.c
> +++ b/reftable/writer.c
> @@ -577,7 +577,7 @@ static int writer_finish_section(struct reftable_writer *w)
>  
>  struct common_prefix_arg {
>  	struct reftable_buf *last;
> -	int max;
> +	size_t max;
>  };

This is dubious.  write.c:update_common() uses this to keep track of
the maximum value returned by common_prefix_size(), which returns
an int.  writer.c:writer_dump_object_index() assigns the value
comparable to this member to reftable_stats.object_id_len that is of
type int.

I may be more sympathetic if we were making common_prefix_size()
return size_t instead of "int" and dealing with all the fallouts
from such a change, but this smells more like somebody _else_ is
using size_t on something that is not an allocation size, and such
mixed use is cascading down to contaminate this member, which would
be perfectly fine with platform native "int".

Ah, OK, an earlier patch does change these other things to size_t,
so this must change to size_t to be consistent.  Shouldn't it be
done in the same patch, then, though?