Message ID | 20200304005844.28346-1-philmd@redhat.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | misc: Replace zero-length arrays with flexible array member | expand |
On 04.03.20 01:58, Philippe Mathieu-Daudé wrote: > Description copied from Linux kernel commit from Gustavo A. R. Silva > (see [3]): > > --v-- description start --v-- > > The current codebase makes use of the zero-length array language > extension to the C90 standard, but the preferred mechanism to > declare variable-length types such as these ones is a flexible > array member [1], introduced in C99: > > struct foo { > int stuff; > struct boo array[]; > }; > > By making use of the mechanism above, we will get a compiler > warning in case the flexible array does not occur last in the > structure, which will help us prevent some kind of undefined > behavior bugs from being unadvertenly introduced [2] to the > Linux codebase from now on. > > --^-- description end --^-- > > Do the similar housekeeping in the QEMU codebase (which uses > C99 since commit 7be41675f7cb). > > All these instances of code were found with the help of the > following command (then manual analysis): > > git grep -F '[0];' > > [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html > [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=76497732932f > [3] https://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux.git/commit/?id=17642a2fbd2c1 > > Inspired-by: Gustavo A. R. Silva <gustavo@embeddedor.com> > Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> > --- > docs/interop/vhost-user.rst | 4 ++-- > block/qed.h | 2 +- > include/hw/acpi/acpi-defs.h | 4 ++-- > include/hw/boards.h | 2 +- > include/hw/s390x/event-facility.h | 2 +- > include/hw/s390x/sclp.h | 8 ++++---- > block/vmdk.c | 2 +- > hw/char/sclpconsole-lm.c | 2 +- > hw/char/sclpconsole.c | 2 +- > hw/s390x/virtio-ccw.c | 2 +- > target/s390x/ioinst.c | 2 +- > 11 files changed, 16 insertions(+), 16 deletions(-) > > diff --git a/docs/interop/vhost-user.rst b/docs/interop/vhost-user.rst > index 401652397c..3b1b6602c7 100644 > --- a/docs/interop/vhost-user.rst > +++ b/docs/interop/vhost-user.rst > @@ -568,7 +568,7 @@ For split virtqueue, queue region can be implemented as: > uint16_t used_idx; > > /* Used to track the state of each descriptor in descriptor table */ > - DescStateSplit desc[0]; > + DescStateSplit desc[]; > } QueueRegionSplit; > > To track inflight I/O, the queue region should be processed as follows: > @@ -690,7 +690,7 @@ For packed virtqueue, queue region can be implemented as: > uint8_t padding[7]; > > /* Used to track the state of each descriptor fetched from descriptor ring */ > - DescStatePacked desc[0]; > + DescStatePacked desc[]; > } QueueRegionPacked; > > To track inflight I/O, the queue region should be processed as follows: > diff --git a/block/qed.h b/block/qed.h > index 42c115d822..87428ba00e 100644 > --- a/block/qed.h > +++ b/block/qed.h > @@ -103,7 +103,7 @@ typedef struct { > } QEMU_PACKED QEDHeader; > > typedef struct { > - uint64_t offsets[0]; /* in bytes */ > + uint64_t offsets[]; /* in bytes */ > } QEDTable; > > /* The L2 cache is a simple write-through cache for L2 structures */ > diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h > index 19f7ba7b70..c13327fa78 100644 > --- a/include/hw/acpi/acpi-defs.h > +++ b/include/hw/acpi/acpi-defs.h > @@ -152,7 +152,7 @@ typedef struct AcpiSerialPortConsoleRedirection > */ > struct AcpiRsdtDescriptorRev1 { > ACPI_TABLE_HEADER_DEF /* ACPI common table header */ > - uint32_t table_offset_entry[0]; /* Array of pointers to other */ > + uint32_t table_offset_entry[]; /* Array of pointers to other */ > /* ACPI tables */ > } QEMU_PACKED; > typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1; > @@ -162,7 +162,7 @@ typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1; > */ > struct AcpiXsdtDescriptorRev2 { > ACPI_TABLE_HEADER_DEF /* ACPI common table header */ > - uint64_t table_offset_entry[0]; /* Array of pointers to other */ > + uint64_t table_offset_entry[]; /* Array of pointers to other */ > /* ACPI tables */ > } QEMU_PACKED; > typedef struct AcpiXsdtDescriptorRev2 AcpiXsdtDescriptorRev2; > diff --git a/include/hw/boards.h b/include/hw/boards.h > index 9bc42dfb22..c96120d15f 100644 > --- a/include/hw/boards.h > +++ b/include/hw/boards.h > @@ -71,7 +71,7 @@ typedef struct CPUArchId { > */ > typedef struct { > int len; > - CPUArchId cpus[0]; > + CPUArchId cpus[]; > } CPUArchIdList; > > /** > diff --git a/include/hw/s390x/event-facility.h b/include/hw/s390x/event-facility.h > index bdc32a3c09..700a610f33 100644 > --- a/include/hw/s390x/event-facility.h > +++ b/include/hw/s390x/event-facility.h > @@ -122,7 +122,7 @@ typedef struct MDBO { > > typedef struct MDB { > MdbHeader header; > - MDBO mdbo[0]; > + MDBO mdbo[]; > } QEMU_PACKED MDB; > > typedef struct SclpMsg { > diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h > index c54413b78c..cd7b24359f 100644 > --- a/include/hw/s390x/sclp.h > +++ b/include/hw/s390x/sclp.h > @@ -132,7 +132,7 @@ typedef struct ReadInfo { > uint16_t highest_cpu; > uint8_t _reserved5[124 - 122]; /* 122-123 */ > uint32_t hmfai; > - struct CPUEntry entries[0]; > + struct CPUEntry entries[]; > } QEMU_PACKED ReadInfo; > > typedef struct ReadCpuInfo { > @@ -142,7 +142,7 @@ typedef struct ReadCpuInfo { > uint16_t nr_standby; /* 12-13 */ > uint16_t offset_standby; /* 14-15 */ > uint8_t reserved0[24-16]; /* 16-23 */ > - struct CPUEntry entries[0]; > + struct CPUEntry entries[]; > } QEMU_PACKED ReadCpuInfo; > > typedef struct ReadStorageElementInfo { > @@ -151,7 +151,7 @@ typedef struct ReadStorageElementInfo { > uint16_t assigned; > uint16_t standby; > uint8_t _reserved0[16 - 14]; /* 14-15 */ > - uint32_t entries[0]; > + uint32_t entries[]; > } QEMU_PACKED ReadStorageElementInfo; > > typedef struct AttachStorageElement { > @@ -159,7 +159,7 @@ typedef struct AttachStorageElement { > uint8_t _reserved0[10 - 8]; /* 8-9 */ > uint16_t assigned; > uint8_t _reserved1[16 - 12]; /* 12-15 */ > - uint32_t entries[0]; > + uint32_t entries[]; > } QEMU_PACKED AttachStorageElement; > > typedef struct AssignStorage { > diff --git a/block/vmdk.c b/block/vmdk.c > index 20e909d997..8466051bc9 100644 > --- a/block/vmdk.c > +++ b/block/vmdk.c > @@ -187,7 +187,7 @@ typedef struct VmdkMetaData { > typedef struct VmdkGrainMarker { > uint64_t lba; > uint32_t size; > - uint8_t data[0]; > + uint8_t data[]; > } QEMU_PACKED VmdkGrainMarker; > > enum { > diff --git a/hw/char/sclpconsole-lm.c b/hw/char/sclpconsole-lm.c > index c420dc066e..2b5f37b6a2 100644 > --- a/hw/char/sclpconsole-lm.c > +++ b/hw/char/sclpconsole-lm.c > @@ -31,7 +31,7 @@ > typedef struct OprtnsCommand { > EventBufferHeader header; > MDMSU message_unit; > - char data[0]; > + char data[]; > } QEMU_PACKED OprtnsCommand; > > /* max size for line-mode data in 4K SCCB page */ > diff --git a/hw/char/sclpconsole.c b/hw/char/sclpconsole.c > index 1fa124dab9..5c7664905e 100644 > --- a/hw/char/sclpconsole.c > +++ b/hw/char/sclpconsole.c > @@ -25,7 +25,7 @@ > > typedef struct ASCIIConsoleData { > EventBufferHeader ebh; > - char data[0]; > + char data[]; > } QEMU_PACKED ASCIIConsoleData; > > /* max size for ASCII data in 4K SCCB page */ > diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c > index 50cf95b781..64f928fc7d 100644 > --- a/hw/s390x/virtio-ccw.c > +++ b/hw/s390x/virtio-ccw.c > @@ -193,7 +193,7 @@ typedef struct VirtioThinintInfo { > typedef struct VirtioRevInfo { > uint16_t revision; > uint16_t length; > - uint8_t data[0]; > + uint8_t data[]; > } QEMU_PACKED VirtioRevInfo; > > /* Specify where the virtqueues for the subchannel are in guest memory. */ > diff --git a/target/s390x/ioinst.c b/target/s390x/ioinst.c > index c437a1d8c6..0e840cc579 100644 > --- a/target/s390x/ioinst.c > +++ b/target/s390x/ioinst.c > @@ -347,7 +347,7 @@ typedef struct ChscResp { > uint16_t len; > uint16_t code; > uint32_t param; > - char data[0]; > + char data[]; > } QEMU_PACKED ChscResp; > > #define CHSC_MIN_RESP_LEN 0x0008 > Reviewed-by: David Hildenbrand <david@redhat.com>
On 3/4/20 1:58 AM, Philippe Mathieu-Daudé wrote: > Description copied from Linux kernel commit from Gustavo A. R. Silva > (see [3]): > > --v-- description start --v-- > > The current codebase makes use of the zero-length array language > extension to the C90 standard, but the preferred mechanism to > declare variable-length types such as these ones is a flexible > array member [1], introduced in C99: > > struct foo { > int stuff; > struct boo array[]; > }; > > By making use of the mechanism above, we will get a compiler > warning in case the flexible array does not occur last in the > structure, which will help us prevent some kind of undefined > behavior bugs from being unadvertenly introduced [2] to the > Linux codebase from now on. > > --^-- description end --^-- > > Do the similar housekeeping in the QEMU codebase (which uses > C99 since commit 7be41675f7cb). > > All these instances of code were found with the help of the > following command (then manual analysis): > > git grep -F '[0];' > > [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html > [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=76497732932f > [3] https://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux.git/commit/?id=17642a2fbd2c1 > > Inspired-by: Gustavo A. R. Silva <gustavo@embeddedor.com> > Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> > --- > docs/interop/vhost-user.rst | 4 ++-- > block/qed.h | 2 +- > include/hw/acpi/acpi-defs.h | 4 ++-- > include/hw/boards.h | 2 +- > include/hw/s390x/event-facility.h | 2 +- > include/hw/s390x/sclp.h | 8 ++++---- > block/vmdk.c | 2 +- > hw/char/sclpconsole-lm.c | 2 +- > hw/char/sclpconsole.c | 2 +- > hw/s390x/virtio-ccw.c | 2 +- > target/s390x/ioinst.c | 2 +- > 11 files changed, 16 insertions(+), 16 deletions(-) > > diff --git a/docs/interop/vhost-user.rst b/docs/interop/vhost-user.rst > index 401652397c..3b1b6602c7 100644 > --- a/docs/interop/vhost-user.rst > +++ b/docs/interop/vhost-user.rst > @@ -568,7 +568,7 @@ For split virtqueue, queue region can be implemented as: > uint16_t used_idx; > > /* Used to track the state of each descriptor in descriptor table */ > - DescStateSplit desc[0]; > + DescStateSplit desc[]; > } QueueRegionSplit; > > To track inflight I/O, the queue region should be processed as follows: > @@ -690,7 +690,7 @@ For packed virtqueue, queue region can be implemented as: > uint8_t padding[7]; > > /* Used to track the state of each descriptor fetched from descriptor ring */ > - DescStatePacked desc[0]; > + DescStatePacked desc[]; > } QueueRegionPacked; > > To track inflight I/O, the queue region should be processed as follows: > diff --git a/block/qed.h b/block/qed.h > index 42c115d822..87428ba00e 100644 > --- a/block/qed.h > +++ b/block/qed.h > @@ -103,7 +103,7 @@ typedef struct { > } QEMU_PACKED QEDHeader; > > typedef struct { > - uint64_t offsets[0]; /* in bytes */ > + uint64_t offsets[]; /* in bytes */ Apparently this one is incorrect, it triggers: GCC: block/qed.h:106:14: error: flexible array member in otherwise empty struct Clang: block/qed.h:106:14: error: flexible array member 'offsets' not allowed in otherwise empty struct > } QEDTable; > > /* The L2 cache is a simple write-through cache for L2 structures */ > diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h > index 19f7ba7b70..c13327fa78 100644 > --- a/include/hw/acpi/acpi-defs.h > +++ b/include/hw/acpi/acpi-defs.h > @@ -152,7 +152,7 @@ typedef struct AcpiSerialPortConsoleRedirection > */ > struct AcpiRsdtDescriptorRev1 { > ACPI_TABLE_HEADER_DEF /* ACPI common table header */ > - uint32_t table_offset_entry[0]; /* Array of pointers to other */ > + uint32_t table_offset_entry[]; /* Array of pointers to other */ > /* ACPI tables */ > } QEMU_PACKED; > typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1; > @@ -162,7 +162,7 @@ typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1; > */ > struct AcpiXsdtDescriptorRev2 { > ACPI_TABLE_HEADER_DEF /* ACPI common table header */ > - uint64_t table_offset_entry[0]; /* Array of pointers to other */ > + uint64_t table_offset_entry[]; /* Array of pointers to other */ > /* ACPI tables */ > } QEMU_PACKED; > typedef struct AcpiXsdtDescriptorRev2 AcpiXsdtDescriptorRev2; > diff --git a/include/hw/boards.h b/include/hw/boards.h > index 9bc42dfb22..c96120d15f 100644 > --- a/include/hw/boards.h > +++ b/include/hw/boards.h > @@ -71,7 +71,7 @@ typedef struct CPUArchId { > */ > typedef struct { > int len; > - CPUArchId cpus[0]; > + CPUArchId cpus[]; > } CPUArchIdList; > > /** > diff --git a/include/hw/s390x/event-facility.h b/include/hw/s390x/event-facility.h > index bdc32a3c09..700a610f33 100644 > --- a/include/hw/s390x/event-facility.h > +++ b/include/hw/s390x/event-facility.h > @@ -122,7 +122,7 @@ typedef struct MDBO { > > typedef struct MDB { > MdbHeader header; > - MDBO mdbo[0]; > + MDBO mdbo[]; > } QEMU_PACKED MDB; > > typedef struct SclpMsg { > diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h > index c54413b78c..cd7b24359f 100644 > --- a/include/hw/s390x/sclp.h > +++ b/include/hw/s390x/sclp.h > @@ -132,7 +132,7 @@ typedef struct ReadInfo { > uint16_t highest_cpu; > uint8_t _reserved5[124 - 122]; /* 122-123 */ > uint32_t hmfai; > - struct CPUEntry entries[0]; > + struct CPUEntry entries[]; > } QEMU_PACKED ReadInfo; > > typedef struct ReadCpuInfo { > @@ -142,7 +142,7 @@ typedef struct ReadCpuInfo { > uint16_t nr_standby; /* 12-13 */ > uint16_t offset_standby; /* 14-15 */ > uint8_t reserved0[24-16]; /* 16-23 */ > - struct CPUEntry entries[0]; > + struct CPUEntry entries[]; > } QEMU_PACKED ReadCpuInfo; > > typedef struct ReadStorageElementInfo { > @@ -151,7 +151,7 @@ typedef struct ReadStorageElementInfo { > uint16_t assigned; > uint16_t standby; > uint8_t _reserved0[16 - 14]; /* 14-15 */ > - uint32_t entries[0]; > + uint32_t entries[]; > } QEMU_PACKED ReadStorageElementInfo; > > typedef struct AttachStorageElement { > @@ -159,7 +159,7 @@ typedef struct AttachStorageElement { > uint8_t _reserved0[10 - 8]; /* 8-9 */ > uint16_t assigned; > uint8_t _reserved1[16 - 12]; /* 12-15 */ > - uint32_t entries[0]; > + uint32_t entries[]; > } QEMU_PACKED AttachStorageElement; > > typedef struct AssignStorage { > diff --git a/block/vmdk.c b/block/vmdk.c > index 20e909d997..8466051bc9 100644 > --- a/block/vmdk.c > +++ b/block/vmdk.c > @@ -187,7 +187,7 @@ typedef struct VmdkMetaData { > typedef struct VmdkGrainMarker { > uint64_t lba; > uint32_t size; > - uint8_t data[0]; > + uint8_t data[]; > } QEMU_PACKED VmdkGrainMarker; > > enum { > diff --git a/hw/char/sclpconsole-lm.c b/hw/char/sclpconsole-lm.c > index c420dc066e..2b5f37b6a2 100644 > --- a/hw/char/sclpconsole-lm.c > +++ b/hw/char/sclpconsole-lm.c > @@ -31,7 +31,7 @@ > typedef struct OprtnsCommand { > EventBufferHeader header; > MDMSU message_unit; > - char data[0]; > + char data[]; > } QEMU_PACKED OprtnsCommand; > > /* max size for line-mode data in 4K SCCB page */ > diff --git a/hw/char/sclpconsole.c b/hw/char/sclpconsole.c > index 1fa124dab9..5c7664905e 100644 > --- a/hw/char/sclpconsole.c > +++ b/hw/char/sclpconsole.c > @@ -25,7 +25,7 @@ > > typedef struct ASCIIConsoleData { > EventBufferHeader ebh; > - char data[0]; > + char data[]; > } QEMU_PACKED ASCIIConsoleData; > > /* max size for ASCII data in 4K SCCB page */ > diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c > index 50cf95b781..64f928fc7d 100644 > --- a/hw/s390x/virtio-ccw.c > +++ b/hw/s390x/virtio-ccw.c > @@ -193,7 +193,7 @@ typedef struct VirtioThinintInfo { > typedef struct VirtioRevInfo { > uint16_t revision; > uint16_t length; > - uint8_t data[0]; > + uint8_t data[]; > } QEMU_PACKED VirtioRevInfo; > > /* Specify where the virtqueues for the subchannel are in guest memory. */ > diff --git a/target/s390x/ioinst.c b/target/s390x/ioinst.c > index c437a1d8c6..0e840cc579 100644 > --- a/target/s390x/ioinst.c > +++ b/target/s390x/ioinst.c > @@ -347,7 +347,7 @@ typedef struct ChscResp { > uint16_t len; > uint16_t code; > uint32_t param; > - char data[0]; > + char data[]; > } QEMU_PACKED ChscResp; > > #define CHSC_MIN_RESP_LEN 0x0008 >
diff --git a/docs/interop/vhost-user.rst b/docs/interop/vhost-user.rst index 401652397c..3b1b6602c7 100644 --- a/docs/interop/vhost-user.rst +++ b/docs/interop/vhost-user.rst @@ -568,7 +568,7 @@ For split virtqueue, queue region can be implemented as: uint16_t used_idx; /* Used to track the state of each descriptor in descriptor table */ - DescStateSplit desc[0]; + DescStateSplit desc[]; } QueueRegionSplit; To track inflight I/O, the queue region should be processed as follows: @@ -690,7 +690,7 @@ For packed virtqueue, queue region can be implemented as: uint8_t padding[7]; /* Used to track the state of each descriptor fetched from descriptor ring */ - DescStatePacked desc[0]; + DescStatePacked desc[]; } QueueRegionPacked; To track inflight I/O, the queue region should be processed as follows: diff --git a/block/qed.h b/block/qed.h index 42c115d822..87428ba00e 100644 --- a/block/qed.h +++ b/block/qed.h @@ -103,7 +103,7 @@ typedef struct { } QEMU_PACKED QEDHeader; typedef struct { - uint64_t offsets[0]; /* in bytes */ + uint64_t offsets[]; /* in bytes */ } QEDTable; /* The L2 cache is a simple write-through cache for L2 structures */ diff --git a/include/hw/acpi/acpi-defs.h b/include/hw/acpi/acpi-defs.h index 19f7ba7b70..c13327fa78 100644 --- a/include/hw/acpi/acpi-defs.h +++ b/include/hw/acpi/acpi-defs.h @@ -152,7 +152,7 @@ typedef struct AcpiSerialPortConsoleRedirection */ struct AcpiRsdtDescriptorRev1 { ACPI_TABLE_HEADER_DEF /* ACPI common table header */ - uint32_t table_offset_entry[0]; /* Array of pointers to other */ + uint32_t table_offset_entry[]; /* Array of pointers to other */ /* ACPI tables */ } QEMU_PACKED; typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1; @@ -162,7 +162,7 @@ typedef struct AcpiRsdtDescriptorRev1 AcpiRsdtDescriptorRev1; */ struct AcpiXsdtDescriptorRev2 { ACPI_TABLE_HEADER_DEF /* ACPI common table header */ - uint64_t table_offset_entry[0]; /* Array of pointers to other */ + uint64_t table_offset_entry[]; /* Array of pointers to other */ /* ACPI tables */ } QEMU_PACKED; typedef struct AcpiXsdtDescriptorRev2 AcpiXsdtDescriptorRev2; diff --git a/include/hw/boards.h b/include/hw/boards.h index 9bc42dfb22..c96120d15f 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -71,7 +71,7 @@ typedef struct CPUArchId { */ typedef struct { int len; - CPUArchId cpus[0]; + CPUArchId cpus[]; } CPUArchIdList; /** diff --git a/include/hw/s390x/event-facility.h b/include/hw/s390x/event-facility.h index bdc32a3c09..700a610f33 100644 --- a/include/hw/s390x/event-facility.h +++ b/include/hw/s390x/event-facility.h @@ -122,7 +122,7 @@ typedef struct MDBO { typedef struct MDB { MdbHeader header; - MDBO mdbo[0]; + MDBO mdbo[]; } QEMU_PACKED MDB; typedef struct SclpMsg { diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h index c54413b78c..cd7b24359f 100644 --- a/include/hw/s390x/sclp.h +++ b/include/hw/s390x/sclp.h @@ -132,7 +132,7 @@ typedef struct ReadInfo { uint16_t highest_cpu; uint8_t _reserved5[124 - 122]; /* 122-123 */ uint32_t hmfai; - struct CPUEntry entries[0]; + struct CPUEntry entries[]; } QEMU_PACKED ReadInfo; typedef struct ReadCpuInfo { @@ -142,7 +142,7 @@ typedef struct ReadCpuInfo { uint16_t nr_standby; /* 12-13 */ uint16_t offset_standby; /* 14-15 */ uint8_t reserved0[24-16]; /* 16-23 */ - struct CPUEntry entries[0]; + struct CPUEntry entries[]; } QEMU_PACKED ReadCpuInfo; typedef struct ReadStorageElementInfo { @@ -151,7 +151,7 @@ typedef struct ReadStorageElementInfo { uint16_t assigned; uint16_t standby; uint8_t _reserved0[16 - 14]; /* 14-15 */ - uint32_t entries[0]; + uint32_t entries[]; } QEMU_PACKED ReadStorageElementInfo; typedef struct AttachStorageElement { @@ -159,7 +159,7 @@ typedef struct AttachStorageElement { uint8_t _reserved0[10 - 8]; /* 8-9 */ uint16_t assigned; uint8_t _reserved1[16 - 12]; /* 12-15 */ - uint32_t entries[0]; + uint32_t entries[]; } QEMU_PACKED AttachStorageElement; typedef struct AssignStorage { diff --git a/block/vmdk.c b/block/vmdk.c index 20e909d997..8466051bc9 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -187,7 +187,7 @@ typedef struct VmdkMetaData { typedef struct VmdkGrainMarker { uint64_t lba; uint32_t size; - uint8_t data[0]; + uint8_t data[]; } QEMU_PACKED VmdkGrainMarker; enum { diff --git a/hw/char/sclpconsole-lm.c b/hw/char/sclpconsole-lm.c index c420dc066e..2b5f37b6a2 100644 --- a/hw/char/sclpconsole-lm.c +++ b/hw/char/sclpconsole-lm.c @@ -31,7 +31,7 @@ typedef struct OprtnsCommand { EventBufferHeader header; MDMSU message_unit; - char data[0]; + char data[]; } QEMU_PACKED OprtnsCommand; /* max size for line-mode data in 4K SCCB page */ diff --git a/hw/char/sclpconsole.c b/hw/char/sclpconsole.c index 1fa124dab9..5c7664905e 100644 --- a/hw/char/sclpconsole.c +++ b/hw/char/sclpconsole.c @@ -25,7 +25,7 @@ typedef struct ASCIIConsoleData { EventBufferHeader ebh; - char data[0]; + char data[]; } QEMU_PACKED ASCIIConsoleData; /* max size for ASCII data in 4K SCCB page */ diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 50cf95b781..64f928fc7d 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -193,7 +193,7 @@ typedef struct VirtioThinintInfo { typedef struct VirtioRevInfo { uint16_t revision; uint16_t length; - uint8_t data[0]; + uint8_t data[]; } QEMU_PACKED VirtioRevInfo; /* Specify where the virtqueues for the subchannel are in guest memory. */ diff --git a/target/s390x/ioinst.c b/target/s390x/ioinst.c index c437a1d8c6..0e840cc579 100644 --- a/target/s390x/ioinst.c +++ b/target/s390x/ioinst.c @@ -347,7 +347,7 @@ typedef struct ChscResp { uint16_t len; uint16_t code; uint32_t param; - char data[0]; + char data[]; } QEMU_PACKED ChscResp; #define CHSC_MIN_RESP_LEN 0x0008
Description copied from Linux kernel commit from Gustavo A. R. Silva (see [3]): --v-- description start --v-- The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member [1], introduced in C99: struct foo { int stuff; struct boo array[]; }; By making use of the mechanism above, we will get a compiler warning in case the flexible array does not occur last in the structure, which will help us prevent some kind of undefined behavior bugs from being unadvertenly introduced [2] to the Linux codebase from now on. --^-- description end --^-- Do the similar housekeeping in the QEMU codebase (which uses C99 since commit 7be41675f7cb). All these instances of code were found with the help of the following command (then manual analysis): git grep -F '[0];' [1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=76497732932f [3] https://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux.git/commit/?id=17642a2fbd2c1 Inspired-by: Gustavo A. R. Silva <gustavo@embeddedor.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> --- docs/interop/vhost-user.rst | 4 ++-- block/qed.h | 2 +- include/hw/acpi/acpi-defs.h | 4 ++-- include/hw/boards.h | 2 +- include/hw/s390x/event-facility.h | 2 +- include/hw/s390x/sclp.h | 8 ++++---- block/vmdk.c | 2 +- hw/char/sclpconsole-lm.c | 2 +- hw/char/sclpconsole.c | 2 +- hw/s390x/virtio-ccw.c | 2 +- target/s390x/ioinst.c | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-)