Re: amiga-fdisk: ftbfs with GCC-14

John Paul Adrian Glaubitz <[email protected]>
Newsgroups gmane.linux.debian.ports.68k
Message-ID <570d0b0557783068a652ab35f02676a2e076c181.camel@physik.fu-berlin.de>
Hi Christian,

On Thu, 2024-08-15 at 22:56 +0200, Christian T. Steigies wrote:
> gcc -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/home/cts/salsa/amiga-fdisk=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -Wall -pedantic -DUSE_READLINE=yes -I./include -Wdate-time -D_FORTIFY_SOURCE=2  -c -o amigastuff.o amigastuff.c
> amigastuff.c: In function ‘rigiddisk_reorg’:
> amigastuff.c:859:20: warning: pointer targets in assignment from ‘LONG *’ {aka ‘long int *’} to ‘ULONG *’ {aka ‘long unsigned int *’} differ in signedness [-Wpointer-sign]
>   859 |                 crk=&(FSHB(curr)->fhb_SegListBlocks);
>       |                    ^

In this case, you should just declare your variable such that it matches the function call.

Switching between signed and unsigned without proper conversion is not a good idea in general.

> gcc -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/home/cts/salsa/amiga-fdisk=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -Wall -pedantic -DUSE_READLINE=yes -I./include -Wdate-time -D_FORTIFY_SOURCE=2  -c -o fdisk.o fdisk.c
> fdisk.c: In function ‘atonum’:
> fdisk.c:85:33: warning: format ‘%x’ expects argument of type ‘unsigned int *’, but argument 3 has type ‘int *’ [-Wformat=]
>    85 |                 sscanf(s + 2, "%x", &n);
>       |                                ~^   ~~
>       |                                 |   |
>       |                                 |   int *
>       |                                 unsigned int *
>       |                                %x
> fdisk.c:87:33: warning: format ‘%o’ expects argument of type ‘unsigned int *’, but argument 3 has type ‘int *’ [-Wformat=]
>    87 |                 sscanf(s + 1, "%o", &n);
>       |                                ~^   ~~
>       |                                 |   |
>       |                                 |   int *
>       |                                 unsigned int *
>       |                                %o
> 
> I tried defining n in fdisk.c as unsigned int but this caused even more
> warnings in other places.  Do I have to cast the arguments in sscanf to
> unsigned int?  It wants "unsigned int *", is it as simple as this or is
> there a better solution?

In this case, I would just recommend to use the proper format specifiers, see:

> https://en.cppreference.com/w/c/io/fprintf
> https://www.ibm.com/docs/en/zos/2.4.0?topic=files-inttypesh-io-format-integer-types

I fixed similar bugs in powerpc-utils in the past, see:

> https://github.com/ibm-power-utilities/powerpc-utils/commit/b46743ca68b6a06a2c82de4048d94d3d5191717f

It can be a bit tricky to find the proper format specifier. When testing the change,
make sure to test build on both 32- and 64-bit systems as well as little- and big-
endian.

I would recommend to test on powerpc and ppc64 (perotto.debian.net) and barriere.debian.org
(i386 and amd64).

Adrian

-- 
 .''`.  John Paul Adrian Glaubitz
: :' :  Debian Developer
`. `'   Physicist
  `-    GPG: 62FF 8A75 84E0 2956 9546  0006 7426 3B37 F5B5 F913
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.