misc: Replace zero-length arrays with flexible array member (automatic)

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 7be41675f7).

All these instances of code were found with the help of the
following Coccinelle script:

  @@
  identifier s, m, a;
  type t, T;
  @@
   struct s {
      ...
      t m;
  -   T a[0];
  +   T a[];
  };
  @@
  identifier s, m, a;
  type t, T;
  @@
   struct s {
      ...
      t m;
  -   T a[0];
  +   T a[];
   } QEMU_PACKED;

[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>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Philippe Mathieu-Daudé 2020-03-04 16:38:15 +01:00 committed by Paolo Bonzini
parent 770275ed0c
commit f7795e4096
24 changed files with 35 additions and 34 deletions

View File

@ -121,7 +121,7 @@ struct aio_ring {
unsigned incompat_features; unsigned incompat_features;
unsigned header_length; /* size of aio_ring */ unsigned header_length; /* size of aio_ring */
struct io_event io_events[0]; struct io_event io_events[];
}; };
/** /**

View File

@ -95,7 +95,7 @@ typedef struct TaskState {
struct sigqueue *first_free; /* first free siginfo queue entry */ struct sigqueue *first_free; /* first free siginfo queue entry */
int signal_pending; /* non zero if a signal may be pending */ int signal_pending; /* non zero if a signal may be pending */
uint8_t stack[0]; uint8_t stack[];
} __attribute__((aligned(16))) TaskState; } __attribute__((aligned(16))) TaskState;
void init_task_state(TaskState *ts); void init_task_state(TaskState *ts);

View File

@ -286,7 +286,7 @@ typedef struct VuVirtqInflight {
uint16_t used_idx; uint16_t used_idx;
/* Used to track the state of each descriptor in descriptor table */ /* Used to track the state of each descriptor in descriptor table */
VuDescStateSplit desc[0]; VuDescStateSplit desc[];
} VuVirtqInflight; } VuVirtqInflight;
typedef struct VuVirtqInflightDesc { typedef struct VuVirtqInflightDesc {

View File

@ -485,7 +485,7 @@ struct NvdimmFuncGetLabelDataOut {
/* the size of buffer filled by QEMU. */ /* the size of buffer filled by QEMU. */
uint32_t len; uint32_t len;
uint32_t func_ret_status; /* return status code. */ uint32_t func_ret_status; /* return status code. */
uint8_t out_buf[0]; /* the data got via Get Namesapce Label function. */ uint8_t out_buf[]; /* the data got via Get Namesapce Label function. */
} QEMU_PACKED; } QEMU_PACKED;
typedef struct NvdimmFuncGetLabelDataOut NvdimmFuncGetLabelDataOut; typedef struct NvdimmFuncGetLabelDataOut NvdimmFuncGetLabelDataOut;
QEMU_BUILD_BUG_ON(sizeof(NvdimmFuncGetLabelDataOut) > NVDIMM_DSM_MEMORY_SIZE); QEMU_BUILD_BUG_ON(sizeof(NvdimmFuncGetLabelDataOut) > NVDIMM_DSM_MEMORY_SIZE);
@ -493,7 +493,7 @@ QEMU_BUILD_BUG_ON(sizeof(NvdimmFuncGetLabelDataOut) > NVDIMM_DSM_MEMORY_SIZE);
struct NvdimmFuncSetLabelDataIn { struct NvdimmFuncSetLabelDataIn {
uint32_t offset; /* the offset in the namespace label data area. */ uint32_t offset; /* the offset in the namespace label data area. */
uint32_t length; /* the size of data is to be written via the function. */ uint32_t length; /* the size of data is to be written via the function. */
uint8_t in_buf[0]; /* the data written to label data area. */ uint8_t in_buf[]; /* the data written to label data area. */
} QEMU_PACKED; } QEMU_PACKED;
typedef struct NvdimmFuncSetLabelDataIn NvdimmFuncSetLabelDataIn; typedef struct NvdimmFuncSetLabelDataIn NvdimmFuncSetLabelDataIn;
QEMU_BUILD_BUG_ON(sizeof(NvdimmFuncSetLabelDataIn) + QEMU_BUILD_BUG_ON(sizeof(NvdimmFuncSetLabelDataIn) +
@ -510,7 +510,7 @@ struct NvdimmFuncReadFITOut {
/* the size of buffer filled by QEMU. */ /* the size of buffer filled by QEMU. */
uint32_t len; uint32_t len;
uint32_t func_ret_status; /* return status code. */ uint32_t func_ret_status; /* return status code. */
uint8_t fit[0]; /* the FIT data. */ uint8_t fit[]; /* the FIT data. */
} QEMU_PACKED; } QEMU_PACKED;
typedef struct NvdimmFuncReadFITOut NvdimmFuncReadFITOut; typedef struct NvdimmFuncReadFITOut NvdimmFuncReadFITOut;
QEMU_BUILD_BUG_ON(sizeof(NvdimmFuncReadFITOut) > NVDIMM_DSM_MEMORY_SIZE); QEMU_BUILD_BUG_ON(sizeof(NvdimmFuncReadFITOut) > NVDIMM_DSM_MEMORY_SIZE);

View File

@ -80,7 +80,7 @@ struct dma_s {
} *memmap; } *memmap;
int memmap_size; int memmap_size;
struct soc_dma_ch_s ch[0]; struct soc_dma_ch_s ch[];
}; };
static void soc_dma_ch_schedule(struct soc_dma_ch_s *ch, int delay_bytes) static void soc_dma_ch_schedule(struct soc_dma_ch_s *ch, int delay_bytes)

View File

@ -328,7 +328,7 @@ struct setup_data {
uint64_t next; uint64_t next;
uint32_t type; uint32_t type;
uint32_t len; uint32_t len;
uint8_t data[0]; uint8_t data[];
} __attribute__((packed)); } __attribute__((packed));

View File

@ -14,7 +14,7 @@
struct bi_record { struct bi_record {
uint16_t tag; /* tag ID */ uint16_t tag; /* tag ID */
uint16_t size; /* size of record */ uint16_t size; /* size of record */
uint32_t data[0]; /* data */ uint32_t data[]; /* data */
}; };
/* machine independent tags */ /* machine independent tags */

View File

@ -24,7 +24,7 @@ struct omap_l4_s {
MemoryRegion *address_space; MemoryRegion *address_space;
hwaddr base; hwaddr base;
int ta_num; int ta_num;
struct omap_target_agent_s ta[0]; struct omap_target_agent_s ta[];
}; };
struct omap_l4_s *omap_l4_init(MemoryRegion *address_space, struct omap_l4_s *omap_l4_init(MemoryRegion *address_space,

View File

@ -86,7 +86,7 @@ struct _eeprom_t {
uint8_t addrbits; uint8_t addrbits;
uint16_t size; uint16_t size;
uint16_t data; uint16_t data;
uint16_t contents[0]; uint16_t contents[];
}; };
/* Code for saving and restoring of EEPROM state. */ /* Code for saving and restoring of EEPROM state. */

View File

@ -34,13 +34,13 @@ typedef struct CompHandlerCtx {
/* Send Queue WQE */ /* Send Queue WQE */
typedef struct PvrdmaSqWqe { typedef struct PvrdmaSqWqe {
struct pvrdma_sq_wqe_hdr hdr; struct pvrdma_sq_wqe_hdr hdr;
struct pvrdma_sge sge[0]; struct pvrdma_sge sge[];
} PvrdmaSqWqe; } PvrdmaSqWqe;
/* Recv Queue WQE */ /* Recv Queue WQE */
typedef struct PvrdmaRqWqe { typedef struct PvrdmaRqWqe {
struct pvrdma_rq_wqe_hdr hdr; struct pvrdma_rq_wqe_hdr hdr;
struct pvrdma_sge sge[0]; struct pvrdma_sge sge[];
} PvrdmaRqWqe; } PvrdmaRqWqe;
/* /*

View File

@ -626,7 +626,7 @@ static const uint32_t oid_supported_list[] =
struct rndis_response { struct rndis_response {
QTAILQ_ENTRY(rndis_response) entries; QTAILQ_ENTRY(rndis_response) entries;
uint32_t length; uint32_t length;
uint8_t buf[0]; uint8_t buf[];
}; };
typedef struct USBNetState { typedef struct USBNetState {

View File

@ -227,7 +227,7 @@ typedef struct QEMU_PACKED CCID_Parameter {
typedef struct QEMU_PACKED CCID_DataBlock { typedef struct QEMU_PACKED CCID_DataBlock {
CCID_BULK_IN b; CCID_BULK_IN b;
uint8_t bChainParameter; uint8_t bChainParameter;
uint8_t abData[0]; uint8_t abData[];
} CCID_DataBlock; } CCID_DataBlock;
/* 6.1.4 PC_to_RDR_XfrBlock */ /* 6.1.4 PC_to_RDR_XfrBlock */
@ -235,7 +235,7 @@ typedef struct QEMU_PACKED CCID_XferBlock {
CCID_Header hdr; CCID_Header hdr;
uint8_t bBWI; /* Block Waiting Timeout */ uint8_t bBWI; /* Block Waiting Timeout */
uint16_t wLevelParameter; /* XXX currently unused */ uint16_t wLevelParameter; /* XXX currently unused */
uint8_t abData[0]; uint8_t abData[];
} CCID_XferBlock; } CCID_XferBlock;
typedef struct QEMU_PACKED CCID_IccPowerOn { typedef struct QEMU_PACKED CCID_IccPowerOn {

View File

@ -54,7 +54,7 @@ typedef struct VRingAvail
{ {
uint16_t flags; uint16_t flags;
uint16_t idx; uint16_t idx;
uint16_t ring[0]; uint16_t ring[];
} VRingAvail; } VRingAvail;
typedef struct VRingUsedElem typedef struct VRingUsedElem
@ -67,7 +67,7 @@ typedef struct VRingUsed
{ {
uint16_t flags; uint16_t flags;
uint16_t idx; uint16_t idx;
VRingUsedElem ring[0]; VRingUsedElem ring[];
} VRingUsed; } VRingUsed;
typedef struct VRingMemoryRegionCaches { typedef struct VRingMemoryRegionCaches {

View File

@ -203,7 +203,7 @@ typedef struct XenPTMSIX {
uint64_t mmio_base_addr; uint64_t mmio_base_addr;
MemoryRegion mmio; MemoryRegion mmio;
void *phys_iomem_base; void *phys_iomem_base;
XenPTMSIXEntry msix_entry[0]; XenPTMSIXEntry msix_entry[];
} XenPTMSIX; } XenPTMSIX;
struct XenPCIPassthroughState { struct XenPCIPassthroughState {

View File

@ -518,7 +518,7 @@ struct AcpiDmarDeviceScope {
struct { struct {
uint8_t device; uint8_t device;
uint8_t function; uint8_t function;
} path[0]; } path[];
} QEMU_PACKED; } QEMU_PACKED;
typedef struct AcpiDmarDeviceScope AcpiDmarDeviceScope; typedef struct AcpiDmarDeviceScope AcpiDmarDeviceScope;
@ -530,7 +530,7 @@ struct AcpiDmarHardwareUnit {
uint8_t reserved; uint8_t reserved;
uint16_t pci_segment; /* The PCI Segment associated with this unit */ uint16_t pci_segment; /* The PCI Segment associated with this unit */
uint64_t address; /* Base address of remapping hardware register-set */ uint64_t address; /* Base address of remapping hardware register-set */
AcpiDmarDeviceScope scope[0]; AcpiDmarDeviceScope scope[];
} QEMU_PACKED; } QEMU_PACKED;
typedef struct AcpiDmarHardwareUnit AcpiDmarHardwareUnit; typedef struct AcpiDmarHardwareUnit AcpiDmarHardwareUnit;
@ -541,7 +541,7 @@ struct AcpiDmarRootPortATS {
uint8_t flags; uint8_t flags;
uint8_t reserved; uint8_t reserved;
uint16_t pci_segment; uint16_t pci_segment;
AcpiDmarDeviceScope scope[0]; AcpiDmarDeviceScope scope[];
} QEMU_PACKED; } QEMU_PACKED;
typedef struct AcpiDmarRootPortATS AcpiDmarRootPortATS; typedef struct AcpiDmarRootPortATS AcpiDmarRootPortATS;
@ -604,7 +604,7 @@ typedef struct AcpiIortMemoryAccess AcpiIortMemoryAccess;
struct AcpiIortItsGroup { struct AcpiIortItsGroup {
ACPI_IORT_NODE_HEADER_DEF ACPI_IORT_NODE_HEADER_DEF
uint32_t its_count; uint32_t its_count;
uint32_t identifiers[0]; uint32_t identifiers[];
} QEMU_PACKED; } QEMU_PACKED;
typedef struct AcpiIortItsGroup AcpiIortItsGroup; typedef struct AcpiIortItsGroup AcpiIortItsGroup;
@ -621,7 +621,7 @@ struct AcpiIortSmmu3 {
uint32_t pri_gsiv; uint32_t pri_gsiv;
uint32_t gerr_gsiv; uint32_t gerr_gsiv;
uint32_t sync_gsiv; uint32_t sync_gsiv;
AcpiIortIdMapping id_mapping_array[0]; AcpiIortIdMapping id_mapping_array[];
} QEMU_PACKED; } QEMU_PACKED;
typedef struct AcpiIortSmmu3 AcpiIortSmmu3; typedef struct AcpiIortSmmu3 AcpiIortSmmu3;
@ -630,7 +630,7 @@ struct AcpiIortRC {
AcpiIortMemoryAccess memory_properties; AcpiIortMemoryAccess memory_properties;
uint32_t ats_attribute; uint32_t ats_attribute;
uint32_t pci_segment_number; uint32_t pci_segment_number;
AcpiIortIdMapping id_mapping_array[0]; AcpiIortIdMapping id_mapping_array[];
} QEMU_PACKED; } QEMU_PACKED;
typedef struct AcpiIortRC AcpiIortRC; typedef struct AcpiIortRC AcpiIortRC;

View File

@ -85,7 +85,7 @@ typedef struct SMMUDevice {
typedef struct SMMUPciBus { typedef struct SMMUPciBus {
PCIBus *bus; PCIBus *bus;
SMMUDevice *pbdev[0]; /* Parent array is sparse, so dynamically alloc */ SMMUDevice *pbdev[]; /* Parent array is sparse, so dynamically alloc */
} SMMUPciBus; } SMMUPciBus;
typedef struct SMMUIOTLBKey { typedef struct SMMUIOTLBKey {

View File

@ -114,7 +114,8 @@ struct VTDAddressSpace {
struct VTDBus { struct VTDBus {
PCIBus* bus; /* A reference to the bus to provide translation for */ PCIBus* bus; /* A reference to the bus to provide translation for */
VTDAddressSpace *dev_as[0]; /* A table of VTDAddressSpace objects indexed by devfn */ /* A table of VTDAddressSpace objects indexed by devfn */
VTDAddressSpace *dev_as[];
}; };
struct VTDIOTLBEntry { struct VTDIOTLBEntry {

View File

@ -41,7 +41,7 @@ typedef struct IOMMUDevice {
typedef struct IOMMUPciBus { typedef struct IOMMUPciBus {
PCIBus *bus; PCIBus *bus;
IOMMUDevice *pbdev[0]; /* Parent array is sparse, so dynamically alloc */ IOMMUDevice *pbdev[]; /* Parent array is sparse, so dynamically alloc */
} IOMMUPciBus; } IOMMUPciBus;
typedef struct VirtIOIOMMU { typedef struct VirtIOIOMMU {

View File

@ -143,7 +143,7 @@ typedef struct CryptoDevBackendSymOpInfo {
uint8_t *dst; uint8_t *dst;
uint8_t *aad_data; uint8_t *aad_data;
uint8_t *digest_result; uint8_t *digest_result;
uint8_t data[0]; uint8_t data[];
} CryptoDevBackendSymOpInfo; } CryptoDevBackendSymOpInfo;
typedef struct CryptoDevBackendClass { typedef struct CryptoDevBackendClass {

View File

@ -267,7 +267,7 @@ struct TCGLabel {
typedef struct TCGPool { typedef struct TCGPool {
struct TCGPool *next; struct TCGPool *next;
int size; int size;
uint8_t data[0] __attribute__ ((aligned)); uint8_t data[] __attribute__ ((aligned));
} TCGPool; } TCGPool;
#define TCG_POOL_CHUNK_SIZE 32768 #define TCG_POOL_CHUNK_SIZE 32768

View File

@ -46,7 +46,7 @@ struct NetPacket {
unsigned flags; unsigned flags;
int size; int size;
NetPacketSent *sent_cb; NetPacketSent *sent_cb;
uint8_t data[0]; uint8_t data[];
}; };
struct NetQueue { struct NetQueue {

View File

@ -136,7 +136,7 @@ typedef struct BootMapScriptHeader {
typedef struct BootMapScript { typedef struct BootMapScript {
BootMapScriptHeader header; BootMapScriptHeader header;
BootMapScriptEntry entry[0]; BootMapScriptEntry entry[];
} __attribute__ ((packed)) BootMapScript; } __attribute__ ((packed)) BootMapScript;
/* /*

View File

@ -95,7 +95,7 @@ typedef struct EventBufferHeader {
typedef struct WriteEventData { typedef struct WriteEventData {
SCCBHeader h; SCCBHeader h;
EventBufferHeader ebh; EventBufferHeader ebh;
char data[0]; char data[];
} __attribute__((packed)) WriteEventData; } __attribute__((packed)) WriteEventData;
typedef struct ReadEventData { typedef struct ReadEventData {

View File

@ -351,7 +351,7 @@ typedef struct AHCIQState {
typedef struct FIS { typedef struct FIS {
uint8_t fis_type; uint8_t fis_type;
uint8_t flags; uint8_t flags;
char data[0]; char data[];
} __attribute__((__packed__)) FIS; } __attribute__((__packed__)) FIS;
/** /**