On Thu, Jan 22, 2026 at 07:26:48PM +0000, Gavin Smith wrote:
> This warning is issued with the current git master as well as Texinfo 7.2.
> The warning message from gcc is very obscure but appears to be about
> the following line of code:
>
> if ((read (descriptor, contents, read_file_size)) != read_file_size)
>
> It does not like the third argument to 'read'.
>
> I found reverting the following change got rid of the warning:
>
> Author: Patrice Dumas <[email protected]>
> Date: 2024-10-10 11:56:24 +0200
>
> * info/filesys.c (filesys_read_info_file): convert to ssize_t to use
> as read return value an not to size_t and convert to size_t later on.
> Do not cast finfo->st_size to (long), leave it as off_t and convert to
> either size_t or ssize_t depending on how the file is read. Add
> comments to mark conversion from unsigned to signed.
>
> * info/filesys.c (convert_eols): use size_t in argument an as return
> type.
>
> I found changing a single line would also get rid of the warning:
>
> --- a/info/filesys.c
> +++ b/info/filesys.c
> @@ -330,7 +330,7 @@ filesys_read_info_file (char *pathname, size_t *filesize,
> else
> {
> int descriptor;
> - ssize_t read_file_size = stat_fsize;
> + size_t read_file_size = stat_fsize;
>
> *is_compressed = 0;
> descriptor = open (pathname, O_RDONLY | O_BINARY, 0666);
>
>
> So does adding a check that read_file_size is positive:
>
> --- a/info/filesys.c
> +++ b/info/filesys.c
> @@ -344,7 +344,8 @@ filesys_read_info_file (char *pathname, size_t *filesize,
>
> /* Try to read the contents of this file. */
> contents = xmalloc (1 + read_file_size);
> - if ((read (descriptor, contents, read_file_size)) != read_file_size)
> + if (read_file_size > 0
> + && (read (descriptor, contents, read_file_size)) != read_file_size)
> {
> filesys_error_number = errno;
> close (descriptor);
>
> The third argument to 'read' is declared as size_t so perhaps the warning
> is triggered by passing in a value of type ssize_t that could potentially
> be negative.
>
> I'll try to commit a fix to add such a check.
>
> I haven't understand fully all the reasons for the changes to types in
> this code. I expect this problem is a hangover from people deciding to
> convert from unsigned integer types to signed integer types or vice versa.
>
> (In commit 219bed49caf262a (2012-11-17), types were changed from long (signed)
> to size_t (unsigned). This was further changed in the commit above.)
I can say for the changes I made. The idea was to avoid mixing signed
and unsigned integers because it can easily lead to bugs because going
through 0 may get unnoticed, and also probably because it is undefined
behaviour. When this is anavoidable, at least add something that shows
that a conversion is needed or such. There is a warning that helps to
make the issue visible:
warning: comparison of integer expressions of different signedness: ‘long int’
and ‘size_t’ {aka ‘long unsigned int’} [-Wsign-compare]
If I recall well, I also tried to avoid or minimize the possibility to
have integer overflows.
I also remember that sometimes it was easy to change the type, and it
could make the code more readable, by making unambiguous that a negative
value could never be possible. But sometimes it was not possible to do
something clean.
--
Pat