]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
mdraid1x_linux: Fix gcc10 error -Werror=array-bounds
authorMichael Chang <mchang@suse.com>
Thu, 26 Mar 2020 06:35:34 +0000 (14:35 +0800)
committerDaniel Kiper <daniel.kiper@oracle.com>
Tue, 31 Mar 2020 10:17:02 +0000 (12:17 +0200)
We bumped into the build error while testing gcc-10 pre-release.

../../grub-core/disk/mdraid1x_linux.c: In function 'grub_mdraid_detect':
../../grub-core/disk/mdraid1x_linux.c:181:15: error: array subscript <unknown> is outside array bounds of 'grub_uint16_t[0]' {aka 'short unsigned int[0]'} [-Werror=array-bounds]
  181 |      (char *) &sb.dev_roles[grub_le_to_cpu32 (sb.dev_number)]
      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../grub-core/disk/mdraid1x_linux.c:98:17: note: while referencing 'dev_roles'
   98 |   grub_uint16_t dev_roles[0]; /* Role in array, or 0xffff for a spare, or 0xfffe for faulty.  */
      |                 ^~~~~~~~~
../../grub-core/disk/mdraid1x_linux.c:127:33: note: defined here 'sb'
  127 |       struct grub_raid_super_1x sb;
      |                                 ^~
cc1: all warnings being treated as errors

Apparently gcc issues the warning when trying to access sb.dev_roles
array's member, since it is a zero length array as the last element of
struct grub_raid_super_1x that is allocated sparsely without extra
chunks for the trailing bits, so the warning looks legitimate in this
regard.

As the whole thing here is doing offset computation, it is undue to use
syntax that would imply array member access then take address from it
later. Instead we could accomplish the same thing through basic array
pointer arithmetic to pacify the warning.

Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/disk/mdraid1x_linux.c

index 7cc80d3df39f75072bae5c81f0bae3fff1062ccd..c980feba4d7214c12d04f223561b6c28b9a3652c 100644 (file)
@@ -178,7 +178,7 @@ grub_mdraid_detect (grub_disk_t disk,
        return NULL;
 
       if (grub_disk_read (disk, sector, 
-                         (char *) &sb.dev_roles[grub_le_to_cpu32 (sb.dev_number)]
+                         (char *) (sb.dev_roles + grub_le_to_cpu32 (sb.dev_number))
                          - (char *) &sb,
                          sizeof (role), &role))
        return NULL;