[PATCH v3 4/9] s390x: Avoid variable size warning in ipl.h

Daniele Buono posted 9 patches 5 years, 3 months ago
Maintainers: Cornelia Huck <cohuck@redhat.com>, Laurent Vivier <lvivier@redhat.com>, Stefan Hajnoczi <stefanha@redhat.com>, Christian Borntraeger <borntraeger@de.ibm.com>, Gerd Hoffmann <kraxel@redhat.com>, Fam Zheng <fam@euphon.net>, Halil Pasic <pasic@linux.ibm.com>, Bandan Das <bsd@redhat.com>, Thomas Huth <thuth@redhat.com>, Alexander Bulekov <alxndr@bu.edu>, Paolo Bonzini <pbonzini@redhat.com>, Richard Henderson <rth@twiddle.net>, David Hildenbrand <david@redhat.com>
There is a newer version of this series
[PATCH v3 4/9] s390x: Avoid variable size warning in ipl.h
Posted by Daniele Buono 5 years, 3 months ago
S390IPLState contains two IplParameterBlock, which may in turn have
either a IPLBlockPV or a IplBlockFcp, both ending with a variable
sized field (an array).

This causes a warning with clang 11 or greater, which checks that
variable sized type are only allocated at the end of the struct:

In file included from ../qemu-cfi-v3/target/s390x/diag.c:21:
../qemu-cfi-v3/hw/s390x/ipl.h:161:23: error: field 'iplb' with variable sized type 'IplParameterBlock' (aka 'union IplParameterBlock') not at the end of a struct or class is a GNU extension [-Werror,-Wgnu-variable-sized-type-not-at-end]
    IplParameterBlock iplb;
                      ^
../qemu-cfi-v3/hw/s390x/ipl.h:162:23: error: field 'iplb_pv' with variable sized type 'IplParameterBlock' (aka 'union IplParameterBlock') not at the end of a struct or class is a GNU extension [-Werror,-Wgnu-variable-sized-type-not-at-end]
    IplParameterBlock iplb_pv;

In this case, however, the warning is a false positive, because
IPLBlockPV and IplBlockFcp are allocated in a union wrapped at 4K,
making the union non-variable sized.

Fix the warning by turning the two variable sized arrays into arrays
of size 0. This avoids the compiler error and should produce the
same code.

Signed-off-by: Daniele Buono <dbuono@linux.vnet.ibm.com>
---
There is the possibility of removing  IplBlockFcp from
IplParameterBlock, since it is not actually used.
This would also allow to entirely remove the definition of
IplBlockFcp, but we may want to keep it for completeness.

 hw/s390x/ipl.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h
index 9e90169695..dfc6dfd89c 100644
--- a/hw/s390x/ipl.h
+++ b/hw/s390x/ipl.h
@@ -32,7 +32,7 @@ struct IPLBlockPV {
     uint32_t num_comp;          /* 0x74 */
     uint64_t pv_header_addr;    /* 0x78 */
     uint64_t pv_header_len;     /* 0x80 */
-    struct IPLBlockPVComp components[];
+    struct IPLBlockPVComp components[0];
 } QEMU_PACKED;
 typedef struct IPLBlockPV IPLBlockPV;
 
@@ -63,7 +63,7 @@ struct IplBlockFcp {
     uint64_t br_lba;
     uint32_t scp_data_len;
     uint8_t  reserved6[260];
-    uint8_t  scp_data[];
+    uint8_t  scp_data[0];
 } QEMU_PACKED;
 typedef struct IplBlockFcp IplBlockFcp;
 
-- 
2.17.1


Re: [PATCH v3 4/9] s390x: Avoid variable size warning in ipl.h
Posted by Cornelia Huck 5 years, 3 months ago
On Thu,  5 Nov 2020 17:19:00 -0500
Daniele Buono <dbuono@linux.vnet.ibm.com> wrote:

> S390IPLState contains two IplParameterBlock, which may in turn have
> either a IPLBlockPV or a IplBlockFcp, both ending with a variable
> sized field (an array).
> 
> This causes a warning with clang 11 or greater, which checks that
> variable sized type are only allocated at the end of the struct:
> 
> In file included from ../qemu-cfi-v3/target/s390x/diag.c:21:
> ../qemu-cfi-v3/hw/s390x/ipl.h:161:23: error: field 'iplb' with variable sized type 'IplParameterBlock' (aka 'union IplParameterBlock') not at the end of a struct or class is a GNU extension [-Werror,-Wgnu-variable-sized-type-not-at-end]
>     IplParameterBlock iplb;
>                       ^
> ../qemu-cfi-v3/hw/s390x/ipl.h:162:23: error: field 'iplb_pv' with variable sized type 'IplParameterBlock' (aka 'union IplParameterBlock') not at the end of a struct or class is a GNU extension [-Werror,-Wgnu-variable-sized-type-not-at-end]
>     IplParameterBlock iplb_pv;
> 
> In this case, however, the warning is a false positive, because
> IPLBlockPV and IplBlockFcp are allocated in a union wrapped at 4K,
> making the union non-variable sized.
> 
> Fix the warning by turning the two variable sized arrays into arrays
> of size 0. This avoids the compiler error and should produce the
> same code.
> 
> Signed-off-by: Daniele Buono <dbuono@linux.vnet.ibm.com>
> ---
> There is the possibility of removing  IplBlockFcp from
> IplParameterBlock, since it is not actually used.
> This would also allow to entirely remove the definition of
> IplBlockFcp, but we may want to keep it for completeness.

We can easily do that in the future clean-up round, if we want that.

> 
>  hw/s390x/ipl.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h
> index 9e90169695..dfc6dfd89c 100644
> --- a/hw/s390x/ipl.h
> +++ b/hw/s390x/ipl.h
> @@ -32,7 +32,7 @@ struct IPLBlockPV {
>      uint32_t num_comp;          /* 0x74 */
>      uint64_t pv_header_addr;    /* 0x78 */
>      uint64_t pv_header_len;     /* 0x80 */
> -    struct IPLBlockPVComp components[];
> +    struct IPLBlockPVComp components[0];
>  } QEMU_PACKED;
>  typedef struct IPLBlockPV IPLBlockPV;
>  
> @@ -63,7 +63,7 @@ struct IplBlockFcp {
>      uint64_t br_lba;
>      uint32_t scp_data_len;
>      uint8_t  reserved6[260];
> -    uint8_t  scp_data[];
> +    uint8_t  scp_data[0];
>  } QEMU_PACKED;
>  typedef struct IplBlockFcp IplBlockFcp;
>  

For now, this is a nicely small patch.

Acked-by: Cornelia Huck <cohuck@redhat.com>