2023-09-04 00:49:52

by Andre Przywara

[permalink] [raw]
Subject: Re: [PATCH] phy: sun4i-usb: Fix a W=1 compilation failure

On Sun, 3 Sep 2023 12:11:06 +0200
Christophe JAILLET <[email protected]> wrote:

> With gcc 12.3.0, when this file is built, we get errors such as:
>
> drivers/phy/allwinner/phy-sun4i-usb.c: In function ‘sun4i_usb_phy_probe’:
> drivers/phy/allwinner/phy-sun4i-usb.c:790:52: error: ‘_vbus’ directive output may be truncated writing 5 bytes into a region of size between 2 and 12 [-Werror=format-truncation=]
> 790 | snprintf(name, sizeof(name), "usb%d_vbus", i);
> | ^~~~~
> drivers/phy/allwinner/phy-sun4i-usb.c:790:17: note: ‘snprintf’ output between 10 and 20 bytes into a destination of size 16
> 790 | snprintf(name, sizeof(name), "usb%d_vbus", i);
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> Because of the possible value of 'i', this can't be an issue in real world

Would using "u8 i;" help? After all currently there are only 4 PHYs
max, and in general this isn't expected to be more than a "handful", so
8 bits should be plenty. An unsigned is better anyway.
It leaves a bit of a bitter taste, though, as we shouldn't do this kind
type tweaking, especially not to work around the compiler trying to be
clever, but then not seeing the whole picture (that "i" is bounded by
compile time constants not exceeding "4").

Cheers,
Andre

> application, but in order to have "make W=1" work correctly, give more
> space for 'name'.
>
> Signed-off-by: Christophe JAILLET <[email protected]>
> ---
> drivers/phy/allwinner/phy-sun4i-usb.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c
> index ec551464dd4f..e53a9a9317bc 100644
> --- a/drivers/phy/allwinner/phy-sun4i-usb.c
> +++ b/drivers/phy/allwinner/phy-sun4i-usb.c
> @@ -782,7 +782,7 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)
>
> for (i = 0; i < data->cfg->num_phys; i++) {
> struct sun4i_usb_phy *phy = data->phys + i;
> - char name[16];
> + char name[32];
>
> if (data->cfg->missing_phys & BIT(i))
> continue;