Re: [PATCH v4] utf8: replace utf8_strwidth todo with descriptive comment

Junio C Hamano <[email protected]> Tue, 28 Jul 2026 11:24:03 -0700
Newsgroups org.kernel.vger.git
Message-ID <[email protected]>
Phillip Wood <[email protected]> writes:

> I don't think this comment, or the lines below add anything useful to 
> the message. It would be better to say something like
>
> As we do not want to change the return type, update the comment to 
> explain that and the need for the explicit cast.

Perfect ;-)

>> diff --git a/utf8.c b/utf8.c
>> index 96460cc..1b55bd4 100644
>> --- a/utf8.c
>> +++ b/utf8.c
>> @@ -227,8 +227,9 @@ int utf8_strnwidth(const char *string, size_t len, int skip_ansi)
>>   	}
>>   
>>   	/*
>> -	 * TODO: fix the interface of this function and `utf8_strwidth()` to
>> -	 * return `size_t` instead of `int`.
>> +	 * The function is used in multiple locations where the callers
>> +	 * expect the result to be a signed int value. We cast the
>> +	 * result to an int to avoid changing signatures of all callers.
>
> The last sentence does not really capture the reasons given in the 
> message of the commit that added this comment. If you haven't done so 
> already you should read it - see 937b71cc8b (utf8: fix overflow when 
> returning string width, 2022-12-01). The fundamental reason to call 
> cast_size_t_to_int(), rather than relying on an implicit conversion to 
> the return type, is not about changing signatures, it is about avoiding 
> an overflow that caused git to crash.

The comment should also answer why the callers want an int, and
whether that is a legitimate need.  Topics the comment may want to
cover include:

   - Callers want display width; we will never deal with output
     wider than 2 billion columns, so int is adequate, provided we
     do not cause bugs due to integer wraparound.

   - The return value is used to compute width in constructs like:

        printf("%*s", width, string)

     which requires int, not size_t.  Instead of forcing these
     callers to call cast_size_t_to_int() individually, this
     function should return int after ensuring the value is correct
     without wraparound.

This is in addition to explaining why we want cast_size_t_to_int(),
as you described above.

> When you send a new version of the patch please CC everyone who 
> commented on previous versions so they don't have to trawl the list to 
> find it.

Thanks.