mirror of
https://github.com/qemu/qemu.git
synced 2024-11-24 03:13:44 +08:00
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:
parent
770275ed0c
commit
f7795e4096
@ -121,7 +121,7 @@ struct aio_ring {
|
||||
unsigned incompat_features;
|
||||
unsigned header_length; /* size of aio_ring */
|
||||
|
||||
struct io_event io_events[0];
|
||||
struct io_event io_events[];
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -95,7 +95,7 @@ typedef struct TaskState {
|
||||
struct sigqueue *first_free; /* first free siginfo queue entry */
|
||||
int signal_pending; /* non zero if a signal may be pending */
|
||||
|
||||
uint8_t stack[0];
|
||||
uint8_t stack[];
|
||||
} __attribute__((aligned(16))) TaskState;
|
||||
|
||||
void init_task_state(TaskState *ts);
|
||||
|
@ -286,7 +286,7 @@ typedef struct VuVirtqInflight {
|
||||
uint16_t used_idx;
|
||||
|
||||
/* Used to track the state of each descriptor in descriptor table */
|
||||
VuDescStateSplit desc[0];
|
||||
VuDescStateSplit desc[];
|
||||
} VuVirtqInflight;
|
||||
|
||||
typedef struct VuVirtqInflightDesc {
|
||||
|
@ -485,7 +485,7 @@ struct NvdimmFuncGetLabelDataOut {
|
||||
/* the size of buffer filled by QEMU. */
|
||||
uint32_t len;
|
||||
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;
|
||||
typedef struct NvdimmFuncGetLabelDataOut NvdimmFuncGetLabelDataOut;
|
||||
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 {
|
||||
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. */
|
||||
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;
|
||||
typedef struct NvdimmFuncSetLabelDataIn NvdimmFuncSetLabelDataIn;
|
||||
QEMU_BUILD_BUG_ON(sizeof(NvdimmFuncSetLabelDataIn) +
|
||||
@ -510,7 +510,7 @@ struct NvdimmFuncReadFITOut {
|
||||
/* the size of buffer filled by QEMU. */
|
||||
uint32_t len;
|
||||
uint32_t func_ret_status; /* return status code. */
|
||||
uint8_t fit[0]; /* the FIT data. */
|
||||
uint8_t fit[]; /* the FIT data. */
|
||||
} QEMU_PACKED;
|
||||
typedef struct NvdimmFuncReadFITOut NvdimmFuncReadFITOut;
|
||||
QEMU_BUILD_BUG_ON(sizeof(NvdimmFuncReadFITOut) > NVDIMM_DSM_MEMORY_SIZE);
|
||||
|
@ -80,7 +80,7 @@ struct dma_s {
|
||||
} *memmap;
|
||||
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)
|
||||
|
@ -328,7 +328,7 @@ struct setup_data {
|
||||
uint64_t next;
|
||||
uint32_t type;
|
||||
uint32_t len;
|
||||
uint8_t data[0];
|
||||
uint8_t data[];
|
||||
} __attribute__((packed));
|
||||
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
struct bi_record {
|
||||
uint16_t tag; /* tag ID */
|
||||
uint16_t size; /* size of record */
|
||||
uint32_t data[0]; /* data */
|
||||
uint32_t data[]; /* data */
|
||||
};
|
||||
|
||||
/* machine independent tags */
|
||||
|
@ -24,7 +24,7 @@ struct omap_l4_s {
|
||||
MemoryRegion *address_space;
|
||||
hwaddr base;
|
||||
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,
|
||||
|
@ -86,7 +86,7 @@ struct _eeprom_t {
|
||||
uint8_t addrbits;
|
||||
uint16_t size;
|
||||
uint16_t data;
|
||||
uint16_t contents[0];
|
||||
uint16_t contents[];
|
||||
};
|
||||
|
||||
/* Code for saving and restoring of EEPROM state. */
|
||||
|
@ -34,13 +34,13 @@ typedef struct CompHandlerCtx {
|
||||
/* Send Queue WQE */
|
||||
typedef struct PvrdmaSqWqe {
|
||||
struct pvrdma_sq_wqe_hdr hdr;
|
||||
struct pvrdma_sge sge[0];
|
||||
struct pvrdma_sge sge[];
|
||||
} PvrdmaSqWqe;
|
||||
|
||||
/* Recv Queue WQE */
|
||||
typedef struct PvrdmaRqWqe {
|
||||
struct pvrdma_rq_wqe_hdr hdr;
|
||||
struct pvrdma_sge sge[0];
|
||||
struct pvrdma_sge sge[];
|
||||
} PvrdmaRqWqe;
|
||||
|
||||
/*
|
||||
|
@ -626,7 +626,7 @@ static const uint32_t oid_supported_list[] =
|
||||
struct rndis_response {
|
||||
QTAILQ_ENTRY(rndis_response) entries;
|
||||
uint32_t length;
|
||||
uint8_t buf[0];
|
||||
uint8_t buf[];
|
||||
};
|
||||
|
||||
typedef struct USBNetState {
|
||||
|
@ -227,7 +227,7 @@ typedef struct QEMU_PACKED CCID_Parameter {
|
||||
typedef struct QEMU_PACKED CCID_DataBlock {
|
||||
CCID_BULK_IN b;
|
||||
uint8_t bChainParameter;
|
||||
uint8_t abData[0];
|
||||
uint8_t abData[];
|
||||
} CCID_DataBlock;
|
||||
|
||||
/* 6.1.4 PC_to_RDR_XfrBlock */
|
||||
@ -235,7 +235,7 @@ typedef struct QEMU_PACKED CCID_XferBlock {
|
||||
CCID_Header hdr;
|
||||
uint8_t bBWI; /* Block Waiting Timeout */
|
||||
uint16_t wLevelParameter; /* XXX currently unused */
|
||||
uint8_t abData[0];
|
||||
uint8_t abData[];
|
||||
} CCID_XferBlock;
|
||||
|
||||
typedef struct QEMU_PACKED CCID_IccPowerOn {
|
||||
|
@ -54,7 +54,7 @@ typedef struct VRingAvail
|
||||
{
|
||||
uint16_t flags;
|
||||
uint16_t idx;
|
||||
uint16_t ring[0];
|
||||
uint16_t ring[];
|
||||
} VRingAvail;
|
||||
|
||||
typedef struct VRingUsedElem
|
||||
@ -67,7 +67,7 @@ typedef struct VRingUsed
|
||||
{
|
||||
uint16_t flags;
|
||||
uint16_t idx;
|
||||
VRingUsedElem ring[0];
|
||||
VRingUsedElem ring[];
|
||||
} VRingUsed;
|
||||
|
||||
typedef struct VRingMemoryRegionCaches {
|
||||
|
@ -203,7 +203,7 @@ typedef struct XenPTMSIX {
|
||||
uint64_t mmio_base_addr;
|
||||
MemoryRegion mmio;
|
||||
void *phys_iomem_base;
|
||||
XenPTMSIXEntry msix_entry[0];
|
||||
XenPTMSIXEntry msix_entry[];
|
||||
} XenPTMSIX;
|
||||
|
||||
struct XenPCIPassthroughState {
|
||||
|
@ -518,7 +518,7 @@ struct AcpiDmarDeviceScope {
|
||||
struct {
|
||||
uint8_t device;
|
||||
uint8_t function;
|
||||
} path[0];
|
||||
} path[];
|
||||
} QEMU_PACKED;
|
||||
typedef struct AcpiDmarDeviceScope AcpiDmarDeviceScope;
|
||||
|
||||
@ -530,7 +530,7 @@ struct AcpiDmarHardwareUnit {
|
||||
uint8_t reserved;
|
||||
uint16_t pci_segment; /* The PCI Segment associated with this unit */
|
||||
uint64_t address; /* Base address of remapping hardware register-set */
|
||||
AcpiDmarDeviceScope scope[0];
|
||||
AcpiDmarDeviceScope scope[];
|
||||
} QEMU_PACKED;
|
||||
typedef struct AcpiDmarHardwareUnit AcpiDmarHardwareUnit;
|
||||
|
||||
@ -541,7 +541,7 @@ struct AcpiDmarRootPortATS {
|
||||
uint8_t flags;
|
||||
uint8_t reserved;
|
||||
uint16_t pci_segment;
|
||||
AcpiDmarDeviceScope scope[0];
|
||||
AcpiDmarDeviceScope scope[];
|
||||
} QEMU_PACKED;
|
||||
typedef struct AcpiDmarRootPortATS AcpiDmarRootPortATS;
|
||||
|
||||
@ -604,7 +604,7 @@ typedef struct AcpiIortMemoryAccess AcpiIortMemoryAccess;
|
||||
struct AcpiIortItsGroup {
|
||||
ACPI_IORT_NODE_HEADER_DEF
|
||||
uint32_t its_count;
|
||||
uint32_t identifiers[0];
|
||||
uint32_t identifiers[];
|
||||
} QEMU_PACKED;
|
||||
typedef struct AcpiIortItsGroup AcpiIortItsGroup;
|
||||
|
||||
@ -621,7 +621,7 @@ struct AcpiIortSmmu3 {
|
||||
uint32_t pri_gsiv;
|
||||
uint32_t gerr_gsiv;
|
||||
uint32_t sync_gsiv;
|
||||
AcpiIortIdMapping id_mapping_array[0];
|
||||
AcpiIortIdMapping id_mapping_array[];
|
||||
} QEMU_PACKED;
|
||||
typedef struct AcpiIortSmmu3 AcpiIortSmmu3;
|
||||
|
||||
@ -630,7 +630,7 @@ struct AcpiIortRC {
|
||||
AcpiIortMemoryAccess memory_properties;
|
||||
uint32_t ats_attribute;
|
||||
uint32_t pci_segment_number;
|
||||
AcpiIortIdMapping id_mapping_array[0];
|
||||
AcpiIortIdMapping id_mapping_array[];
|
||||
} QEMU_PACKED;
|
||||
typedef struct AcpiIortRC AcpiIortRC;
|
||||
|
||||
|
@ -85,7 +85,7 @@ typedef struct SMMUDevice {
|
||||
|
||||
typedef struct SMMUPciBus {
|
||||
PCIBus *bus;
|
||||
SMMUDevice *pbdev[0]; /* Parent array is sparse, so dynamically alloc */
|
||||
SMMUDevice *pbdev[]; /* Parent array is sparse, so dynamically alloc */
|
||||
} SMMUPciBus;
|
||||
|
||||
typedef struct SMMUIOTLBKey {
|
||||
|
@ -114,7 +114,8 @@ struct VTDAddressSpace {
|
||||
|
||||
struct VTDBus {
|
||||
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 {
|
||||
|
@ -41,7 +41,7 @@ typedef struct IOMMUDevice {
|
||||
|
||||
typedef struct IOMMUPciBus {
|
||||
PCIBus *bus;
|
||||
IOMMUDevice *pbdev[0]; /* Parent array is sparse, so dynamically alloc */
|
||||
IOMMUDevice *pbdev[]; /* Parent array is sparse, so dynamically alloc */
|
||||
} IOMMUPciBus;
|
||||
|
||||
typedef struct VirtIOIOMMU {
|
||||
|
@ -143,7 +143,7 @@ typedef struct CryptoDevBackendSymOpInfo {
|
||||
uint8_t *dst;
|
||||
uint8_t *aad_data;
|
||||
uint8_t *digest_result;
|
||||
uint8_t data[0];
|
||||
uint8_t data[];
|
||||
} CryptoDevBackendSymOpInfo;
|
||||
|
||||
typedef struct CryptoDevBackendClass {
|
||||
|
@ -267,7 +267,7 @@ struct TCGLabel {
|
||||
typedef struct TCGPool {
|
||||
struct TCGPool *next;
|
||||
int size;
|
||||
uint8_t data[0] __attribute__ ((aligned));
|
||||
uint8_t data[] __attribute__ ((aligned));
|
||||
} TCGPool;
|
||||
|
||||
#define TCG_POOL_CHUNK_SIZE 32768
|
||||
|
@ -46,7 +46,7 @@ struct NetPacket {
|
||||
unsigned flags;
|
||||
int size;
|
||||
NetPacketSent *sent_cb;
|
||||
uint8_t data[0];
|
||||
uint8_t data[];
|
||||
};
|
||||
|
||||
struct NetQueue {
|
||||
|
@ -136,7 +136,7 @@ typedef struct BootMapScriptHeader {
|
||||
|
||||
typedef struct BootMapScript {
|
||||
BootMapScriptHeader header;
|
||||
BootMapScriptEntry entry[0];
|
||||
BootMapScriptEntry entry[];
|
||||
} __attribute__ ((packed)) BootMapScript;
|
||||
|
||||
/*
|
||||
|
@ -95,7 +95,7 @@ typedef struct EventBufferHeader {
|
||||
typedef struct WriteEventData {
|
||||
SCCBHeader h;
|
||||
EventBufferHeader ebh;
|
||||
char data[0];
|
||||
char data[];
|
||||
} __attribute__((packed)) WriteEventData;
|
||||
|
||||
typedef struct ReadEventData {
|
||||
|
@ -351,7 +351,7 @@ typedef struct AHCIQState {
|
||||
typedef struct FIS {
|
||||
uint8_t fis_type;
|
||||
uint8_t flags;
|
||||
char data[0];
|
||||
char data[];
|
||||
} __attribute__((__packed__)) FIS;
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user