On Tue, Mar 23, 2021 at 1:55 PM Arnd Bergmann <arnd@xxxxxxxxxx> wrote: > > From: Arnd Bergmann <arnd@xxxxxxxx> > > On some configurations, gcc warns about overlapping source and > destination arguments to snprintf: > > drivers/scsi/pm8001/pm8001_init.c: In function 'pm8001_request_msix': > drivers/scsi/pm8001/pm8001_init.c:977:3: error: 'snprintf' argument 4 may overlap destination object 'pm8001_ha' [-Werror=restrict] > 977 | snprintf(drvname, len, "%s-%d", pm8001_ha->name, i); > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > drivers/scsi/pm8001/pm8001_init.c:962:56: note: destination object referenced by 'restrict'-qualified argument 1 was declared here > 962 | static u32 pm8001_request_msix(struct pm8001_hba_info *pm8001_ha) > | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~ > > I first assumed this was a gcc bug, as that should not happen, but > a reduced test case makes it clear that this happens when the loop > counter is not bounded by the array size. > > Help the compiler out by adding an explicit limit here to make the > code slightly more robust and avoid the warning. > > Link: https://godbolt.org/z/6T1qPM > Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx> Acked-by: Jack Wang <jinpu.wang@xxxxxxxxx> > --- > drivers/scsi/pm8001/pm8001_init.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c > index bd626ef876da..a268c647b987 100644 > --- a/drivers/scsi/pm8001/pm8001_init.c > +++ b/drivers/scsi/pm8001/pm8001_init.c > @@ -963,6 +963,7 @@ static u32 pm8001_request_msix(struct pm8001_hba_info *pm8001_ha) > { > u32 i = 0, j = 0; > int flag = 0, rc = 0; > + int nr_irqs = pm8001_ha->number_of_intr; > > if (pm8001_ha->chip_id != chip_8001) > flag &= ~IRQF_SHARED; > @@ -971,7 +972,10 @@ static u32 pm8001_request_msix(struct pm8001_hba_info *pm8001_ha) > "pci_enable_msix request number of intr %d\n", > pm8001_ha->number_of_intr); > > - for (i = 0; i < pm8001_ha->number_of_intr; i++) { > + if (nr_irqs > ARRAY_SIZE(pm8001_ha->intr_drvname)) > + nr_irqs = ARRAY_SIZE(pm8001_ha->intr_drvname); > + > + for (i = 0; i < nr_irqs; i++) { > snprintf(pm8001_ha->intr_drvname[i], > sizeof(pm8001_ha->intr_drvname[0]), > "%s-%d", pm8001_ha->name, i); > -- > 2.29.2 >