All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] clean up zero-length arrays
@ 2022-06-02 15:08 Bruce Richardson
  2022-06-02 15:08 ` [PATCH 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
                   ` (9 more replies)
  0 siblings, 10 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-02 15:08 UTC (permalink / raw)
  To: dev; +Cc: david.marchand, stephen, Bruce Richardson

This patchset adds a coccinelle script to clean-up zero-length
arrays in structures. The final patches are the result of running
that script on the DPDK repository.

Bruce Richardson (4):
  cocci: add script for zero-length arrays in structs
  drivers: replace zero-length arrays with undimensioned ones
  lib: replace zero-length arrays with undimensioned ones
  app: examples: replace zero-length arrays with undimensioned ones

 app/test/test_table_tables.c                  |  2 +-
 devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++
 drivers/bus/dpaa/include/netcfg.h             |  4 +--
 drivers/bus/vmbus/rte_vmbus_reg.h             |  4 +--
 drivers/common/cnxk/roc_se.h                  |  2 +-
 drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
 drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
 drivers/common/mlx5/mlx5_prm.h                | 10 +++----
 drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 +--
 drivers/crypto/virtio/virtio_ring.h           |  4 +--
 drivers/crypto/virtio/virtqueue.h             |  2 +-
 drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
 drivers/net/cxgbe/clip_tbl.h                  |  2 +-
 drivers/net/cxgbe/l2t.h                       |  2 +-
 drivers/net/cxgbe/mps_tcam.h                  |  2 +-
 drivers/net/cxgbe/smt.h                       |  2 +-
 drivers/net/enic/base/vnic_devcmd.h           |  2 +-
 drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
 drivers/net/mlx5/mlx5_tx.h                    |  2 +-
 drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
 drivers/net/virtio/virtio_ring.h              |  4 +--
 drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
 drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
 drivers/net/virtio/virtqueue.h                |  2 +-
 drivers/regex/mlx5/mlx5_rxp.h                 |  4 +--
 examples/ip_reassembly/main.c                 |  2 +-
 examples/ptpclient/ptpclient.c                |  4 +--
 lib/cryptodev/cryptodev_pmd.h                 |  2 +-
 lib/cryptodev/rte_cryptodev.h                 |  2 +-
 lib/eventdev/rte_event_timer_adapter.h        |  2 +-
 lib/ip_frag/ip_reassembly.h                   |  2 +-
 lib/ipsec/sa.h                                |  2 +-
 lib/rib/rte_rib.c                             |  2 +-
 lib/rib/rte_rib6.c                            |  2 +-
 lib/table/rte_swx_table_learner.c             |  4 +--
 lib/table/rte_table_hash_key16.c              |  4 +--
 lib/table/rte_table_hash_key32.c              |  4 +--
 lib/table/rte_table_hash_key8.c               |  4 +--
 lib/vhost/rte_vhost.h                         |  4 +--
 40 files changed, 101 insertions(+), 54 deletions(-)
 create mode 100644 devtools/cocci/zero_length_array.cocci
 create mode 100644 lib/count_comments.py

--
2.34.1


^ permalink raw reply	[flat|nested] 34+ messages in thread

* [PATCH 1/4] cocci: add script for zero-length arrays in structs
  2022-06-02 15:08 [PATCH 0/4] clean up zero-length arrays Bruce Richardson
@ 2022-06-02 15:08 ` Bruce Richardson
  2022-06-02 15:08 ` [PATCH 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-02 15:08 UTC (permalink / raw)
  To: dev; +Cc: david.marchand, stephen, Bruce Richardson

Add script to replace [0] with [] when used at the end of a struct.
The script also includes an additional struct member to match against so
as to avoid issues with arrays with only a single zero-length element.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 devtools/cocci/zero_length_array.cocci | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 devtools/cocci/zero_length_array.cocci

diff --git a/devtools/cocci/zero_length_array.cocci b/devtools/cocci/zero_length_array.cocci
new file mode 100644
index 0000000000..de8783bc7a
--- /dev/null
+++ b/devtools/cocci/zero_length_array.cocci
@@ -0,0 +1,21 @@
+// Replace zero-length array members with []
+@@
+identifier st, member, arr;
+type T1, T2;
+@@
+struct st {
+	...
+	T1 member;
+-	T2 arr[0];
++	T2 arr[];
+};
+@@
+identifier st, member, arr, id;
+type T1, T2;
+@@
+struct st {
+	...
+	T1 member;
+-	T2 arr[0];
++	T2 arr[];
+} id;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 2/4] drivers: replace zero-length arrays with undimensioned ones
  2022-06-02 15:08 [PATCH 0/4] clean up zero-length arrays Bruce Richardson
  2022-06-02 15:08 ` [PATCH 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
@ 2022-06-02 15:08 ` Bruce Richardson
  2022-06-02 15:08 ` [PATCH 3/4] lib: " Bruce Richardson
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-02 15:08 UTC (permalink / raw)
  To: dev; +Cc: david.marchand, stephen, Bruce Richardson

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 drivers/bus/dpaa/include/netcfg.h             |  4 ++--
 drivers/bus/vmbus/rte_vmbus_reg.h             |  4 ++--
 drivers/common/cnxk/roc_se.h                  |  2 +-
 drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
 drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
 drivers/common/mlx5/mlx5_prm.h                | 10 +++++-----
 drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 ++--
 drivers/crypto/virtio/virtio_ring.h           |  4 ++--
 drivers/crypto/virtio/virtqueue.h             |  2 +-
 drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
 drivers/net/cxgbe/clip_tbl.h                  |  2 +-
 drivers/net/cxgbe/l2t.h                       |  2 +-
 drivers/net/cxgbe/mps_tcam.h                  |  2 +-
 drivers/net/cxgbe/smt.h                       |  2 +-
 drivers/net/enic/base/vnic_devcmd.h           |  2 +-
 drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
 drivers/net/mlx5/mlx5_tx.h                    |  2 +-
 drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
 drivers/net/virtio/virtio_ring.h              |  4 ++--
 drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
 drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
 drivers/net/virtio/virtqueue.h                |  2 +-
 drivers/regex/mlx5/mlx5_rxp.h                 |  4 ++--
 23 files changed, 33 insertions(+), 33 deletions(-)

diff --git a/drivers/bus/dpaa/include/netcfg.h b/drivers/bus/dpaa/include/netcfg.h
index bb18a34e3d..43c7e1cfe1 100644
--- a/drivers/bus/dpaa/include/netcfg.h
+++ b/drivers/bus/dpaa/include/netcfg.h
@@ -23,7 +23,7 @@ struct fm_eth_port_cfg {
 struct netcfg_info {
 	uint8_t num_ethports;
 	/**< Number of ports */
-	struct fm_eth_port_cfg port_cfg[0];
+	struct fm_eth_port_cfg port_cfg[];
 	/**< Variable structure array of size num_ethports */
 };
 
@@ -38,7 +38,7 @@ struct interface_info {
 struct netcfg_interface {
 	uint8_t numof_netcfg_interface;
 	uint8_t numof_fman_enabled_macless;
-	struct interface_info interface_info[0];
+	struct interface_info interface_info[];
 };
 
 /* pcd_file: FMC netpcd XML ("policy") file, that contains PCD information.
diff --git a/drivers/bus/vmbus/rte_vmbus_reg.h b/drivers/bus/vmbus/rte_vmbus_reg.h
index 8562672979..a17ce40763 100644
--- a/drivers/bus/vmbus/rte_vmbus_reg.h
+++ b/drivers/bus/vmbus/rte_vmbus_reg.h
@@ -107,7 +107,7 @@ struct vmbus_bufring {
 	 * Ring data starts here + RingDataStartOffset
 	 * !!! DO NOT place any fields below this !!!
 	 */
-	uint8_t data[0];
+	uint8_t data[];
 } __rte_packed;
 
 /*
@@ -140,7 +140,7 @@ vmbus_chanpkt_getlen(uint16_t pktlen)
 struct vmbus_gpa_range {
 	uint32_t       len;
 	uint32_t       ofs;
-	uint64_t       page[0];
+	uint64_t       page[];
 } __rte_packed;
 
 /* This is actually vmbus_gpa_range.gpa_page[1] */
diff --git a/drivers/common/cnxk/roc_se.h b/drivers/common/cnxk/roc_se.h
index 145a1825bd..a1d476a86d 100644
--- a/drivers/common/cnxk/roc_se.h
+++ b/drivers/common/cnxk/roc_se.h
@@ -246,7 +246,7 @@ struct roc_se_buf_ptr {
 /* IOV Pointer */
 struct roc_se_iov_ptr {
 	int buf_cnt;
-	struct roc_se_buf_ptr bufs[0];
+	struct roc_se_buf_ptr bufs[];
 };
 
 struct roc_se_fc_params {
diff --git a/drivers/common/dpaax/caamflib/desc/ipsec.h b/drivers/common/dpaax/caamflib/desc/ipsec.h
index 8ec6aac915..2c9080a1b5 100644
--- a/drivers/common/dpaax/caamflib/desc/ipsec.h
+++ b/drivers/common/dpaax/caamflib/desc/ipsec.h
@@ -350,7 +350,7 @@ struct ipsec_encap_pdb {
 	};
 	uint32_t spi;
 	uint32_t ip_hdr_len;
-	uint8_t ip_hdr[0];
+	uint8_t ip_hdr[];
 };
 
 static inline unsigned int
diff --git a/drivers/common/dpaax/dpaax_iova_table.h b/drivers/common/dpaax/dpaax_iova_table.h
index b1f2300c52..9a18eafca0 100644
--- a/drivers/common/dpaax/dpaax_iova_table.h
+++ b/drivers/common/dpaax/dpaax_iova_table.h
@@ -32,7 +32,7 @@ struct dpaax_iovat_element {
 
 struct dpaax_iova_table {
 	unsigned int count; /**< No. of blocks of contiguous physical pages */
-	struct dpaax_iovat_element entries[0];
+	struct dpaax_iovat_element entries[];
 };
 
 /* Pointer to the table, which is common for DPAA/DPAA2 and only a single
diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h
index 630b2c5100..a9b70eb0a9 100644
--- a/drivers/common/mlx5/mlx5_prm.h
+++ b/drivers/common/mlx5/mlx5_prm.h
@@ -560,7 +560,7 @@ struct mlx5_umr_wqe {
 struct mlx5_rdma_write_wqe {
 	struct mlx5_wqe_cseg ctr;
 	struct mlx5_wqe_rseg rseg;
-	struct mlx5_wqe_dseg dseg[0];
+	struct mlx5_wqe_dseg dseg[];
 } __rte_packed;
 
 #ifdef PEDANTIC
@@ -3478,7 +3478,7 @@ struct mlx5_ifc_qpc_pas_list_bits {
 #endif
 struct mlx5_ifc_qpc_extension_and_pas_list_bits {
 	struct mlx5_ifc_qpc_extension_bits qpc_data_extension;
-	u8 pas[0][0x40];
+	u8[0x40] pas[];
 };
 
 
@@ -3702,7 +3702,7 @@ struct mlx5_ifc_query_qp_out_bits {
 	u8 reserved_at_a0[0x20];
 	struct mlx5_ifc_qpc_bits qpc;
 	u8 reserved_at_800[0x80];
-	u8 pas[0][0x40];
+	u8[0x40] pas[];
 };
 #ifdef PEDANTIC
 #pragma GCC diagnostic error "-Wpedantic"
@@ -3742,7 +3742,7 @@ struct mlx5_ifc_access_register_out_bits {
 	u8 reserved_at_8[0x18];
 	u8 syndrome[0x20];
 	u8 reserved_at_40[0x40];
-	u8 register_data[0][0x20];
+	u8[0x20] register_data[];
 };
 
 struct mlx5_ifc_access_register_in_bits {
@@ -3753,7 +3753,7 @@ struct mlx5_ifc_access_register_in_bits {
 	u8 reserved_at_40[0x10];
 	u8 register_id[0x10];
 	u8 argument[0x20];
-	u8 register_data[0][0x20];
+	u8[0x20] register_data[];
 };
 #ifdef PEDANTIC
 #pragma GCC diagnostic error "-Wpedantic"
diff --git a/drivers/crypto/ipsec_mb/ipsec_mb_private.h b/drivers/crypto/ipsec_mb/ipsec_mb_private.h
index e53101acf1..e2c240dfc0 100644
--- a/drivers/crypto/ipsec_mb/ipsec_mb_private.h
+++ b/drivers/crypto/ipsec_mb/ipsec_mb_private.h
@@ -120,7 +120,7 @@ struct ipsec_mb_dev_private {
 	/**< PMD  type */
 	uint32_t max_nb_queue_pairs;
 	/**< Max number of queue pairs supported by device */
-	__extension__ uint8_t priv[0];
+	__extension__ uint8_t priv[];
 };
 
 /** IPSEC Multi buffer queue pair common queue pair data for all PMDs */
@@ -147,7 +147,7 @@ struct ipsec_mb_qp {
 	/* Multi buffer manager */
 	const struct rte_memzone *mb_mgr_mz;
 	/* Shared memzone for storing mb_mgr */
-	__extension__ uint8_t additional_data[0];
+	__extension__ uint8_t additional_data[];
 	/**< Storing PMD specific additional data */
 };
 
diff --git a/drivers/crypto/virtio/virtio_ring.h b/drivers/crypto/virtio/virtio_ring.h
index ee30674566..55839279fd 100644
--- a/drivers/crypto/virtio/virtio_ring.h
+++ b/drivers/crypto/virtio/virtio_ring.h
@@ -40,7 +40,7 @@ struct vring_desc {
 struct vring_avail {
 	uint16_t flags;
 	uint16_t idx;
-	uint16_t ring[0];
+	uint16_t ring[];
 };
 
 /* id is a 16bit index. uint32_t is used here for ids for padding reasons. */
@@ -54,7 +54,7 @@ struct vring_used_elem {
 struct vring_used {
 	uint16_t flags;
 	volatile uint16_t idx;
-	struct vring_used_elem ring[0];
+	struct vring_used_elem ring[];
 };
 
 struct vring {
diff --git a/drivers/crypto/virtio/virtqueue.h b/drivers/crypto/virtio/virtqueue.h
index c96ca62992..cb08bea94f 100644
--- a/drivers/crypto/virtio/virtqueue.h
+++ b/drivers/crypto/virtio/virtqueue.h
@@ -88,7 +88,7 @@ struct virtqueue {
 
 	uint16_t  *notify_addr;
 
-	struct vq_desc_extra vq_descx[0];
+	struct vq_desc_extra vq_descx[];
 };
 
 /**
diff --git a/drivers/net/atlantic/hw_atl/hw_atl_utils.h b/drivers/net/atlantic/hw_atl/hw_atl_utils.h
index d8fab010cf..12ac9b041e 100644
--- a/drivers/net/atlantic/hw_atl/hw_atl_utils.h
+++ b/drivers/net/atlantic/hw_atl/hw_atl_utils.h
@@ -334,7 +334,7 @@ struct offload_info {
 	struct offload_port_info ports;
 	struct offload_ka_info kas;
 	struct offload_rr_info rrs;
-	u8 buf[0];
+	u8 buf[];
 } __rte_packed;
 
 struct smbus_request {
diff --git a/drivers/net/cxgbe/clip_tbl.h b/drivers/net/cxgbe/clip_tbl.h
index d7689f4b7a..3b2be6645f 100644
--- a/drivers/net/cxgbe/clip_tbl.h
+++ b/drivers/net/cxgbe/clip_tbl.h
@@ -20,7 +20,7 @@ struct clip_tbl {
 	unsigned int clipt_start;     /* start index of CLIP table */
 	unsigned int clipt_size;      /* size of CLIP table */
 	rte_rwlock_t lock;            /* table rw lock */
-	struct clip_entry cl_list[0]; /* MUST BE LAST */
+	struct clip_entry cl_list[]; /* MUST BE LAST */
 };
 
 struct clip_tbl *t4_init_clip_tbl(unsigned int clipt_start,
diff --git a/drivers/net/cxgbe/l2t.h b/drivers/net/cxgbe/l2t.h
index 9845c9f981..e4c0ebedec 100644
--- a/drivers/net/cxgbe/l2t.h
+++ b/drivers/net/cxgbe/l2t.h
@@ -37,7 +37,7 @@ struct l2t_data {
 	unsigned int l2t_start;     /* start index of our piece of the L2T */
 	unsigned int l2t_size;      /* number of entries in l2tab */
 	rte_rwlock_t lock;          /* table rw lock */
-	struct l2t_entry l2tab[0];  /* MUST BE LAST */
+	struct l2t_entry l2tab[];  /* MUST BE LAST */
 };
 
 #define L2T_LPBK	true
diff --git a/drivers/net/cxgbe/mps_tcam.h b/drivers/net/cxgbe/mps_tcam.h
index a359f52442..363786bd38 100644
--- a/drivers/net/cxgbe/mps_tcam.h
+++ b/drivers/net/cxgbe/mps_tcam.h
@@ -41,7 +41,7 @@ struct mpstcam_table {
 			 * free_idx cannot alone determine
 			 * if the table is full
 			 */
-	struct mps_tcam_entry entry[0];
+	struct mps_tcam_entry entry[];
 };
 
 struct mpstcam_table *t4_init_mpstcam(struct adapter *adap);
diff --git a/drivers/net/cxgbe/smt.h b/drivers/net/cxgbe/smt.h
index a70e3a2085..531810e695 100644
--- a/drivers/net/cxgbe/smt.h
+++ b/drivers/net/cxgbe/smt.h
@@ -31,7 +31,7 @@ struct smt_data {
 	unsigned int smt_size;
 	unsigned int smt_start;
 	rte_rwlock_t lock;
-	struct smt_entry smtab[0];
+	struct smt_entry smtab[];
 };
 
 struct smt_data *t4_init_smt(u32 smt_start_idx, u32 smt_size);
diff --git a/drivers/net/enic/base/vnic_devcmd.h b/drivers/net/enic/base/vnic_devcmd.h
index 3157bc8cb5..253a791c3f 100644
--- a/drivers/net/enic/base/vnic_devcmd.h
+++ b/drivers/net/enic/base/vnic_devcmd.h
@@ -997,7 +997,7 @@ enum {
 struct filter_tlv {
 	uint32_t type;
 	uint32_t length;
-	uint32_t val[0];
+	uint32_t val[];
 };
 
 /* Data for CMD_ADD_FILTER is 2 TLV and filter + action structs */
diff --git a/drivers/net/hinic/hinic_pmd_tx.h b/drivers/net/hinic/hinic_pmd_tx.h
index a3ec6299fb..152f7abc53 100644
--- a/drivers/net/hinic/hinic_pmd_tx.h
+++ b/drivers/net/hinic/hinic_pmd_tx.h
@@ -81,7 +81,7 @@ struct hinic_sq_wqe {
 	struct hinic_sq_task		task;
 
 	/* sq sge section start address, 1~127 sges */
-	struct hinic_sq_bufdesc     buf_descs[0];
+	struct hinic_sq_bufdesc     buf_descs[];
 };
 
 struct hinic_txq_stats {
diff --git a/drivers/net/mlx5/mlx5_tx.h b/drivers/net/mlx5/mlx5_tx.h
index 20776919c2..defb745906 100644
--- a/drivers/net/mlx5/mlx5_tx.h
+++ b/drivers/net/mlx5/mlx5_tx.h
@@ -166,7 +166,7 @@ struct mlx5_txq_data {
 	struct mlx5_txq_stats stats; /* TX queue counters. */
 	struct mlx5_txq_stats stats_reset; /* stats on last reset. */
 	struct mlx5_uar_data uar_data;
-	struct rte_mbuf *elts[0];
+	struct rte_mbuf *elts[];
 	/* Storage for queued packets, must be the last field. */
 } __rte_cache_aligned;
 
diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.h b/drivers/net/nfp/nfpcore/nfp_nsp.h
index e74cdeb191..2184c15b4c 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.h
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.h
@@ -224,7 +224,7 @@ struct nfp_eth_table {
 		int is_split;
 
 		unsigned int fec_modes_supported;
-	} ports[0];
+	} ports[];
 };
 
 struct nfp_eth_table *nfp_eth_read_ports(struct nfp_cpp *cpp);
diff --git a/drivers/net/virtio/virtio_ring.h b/drivers/net/virtio/virtio_ring.h
index 17a56b0a73..e848c0b73b 100644
--- a/drivers/net/virtio/virtio_ring.h
+++ b/drivers/net/virtio/virtio_ring.h
@@ -46,7 +46,7 @@ struct vring_desc {
 struct vring_avail {
 	uint16_t flags;
 	uint16_t idx;
-	uint16_t ring[0];
+	uint16_t ring[];
 };
 
 /* id is a 16bit index. uint32_t is used here for ids for padding reasons. */
@@ -60,7 +60,7 @@ struct vring_used_elem {
 struct vring_used {
 	uint16_t flags;
 	uint16_t idx;
-	struct vring_used_elem ring[0];
+	struct vring_used_elem ring[];
 };
 
 /* For support of packed virtqueues in Virtio 1.1 the format of descriptors
diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c
index 986b56a7ca..1aed08b2bd 100644
--- a/drivers/net/virtio/virtio_user/vhost_kernel.c
+++ b/drivers/net/virtio/virtio_user/vhost_kernel.c
@@ -22,7 +22,7 @@ struct vhost_kernel_data {
 struct vhost_memory_kernel {
 	uint32_t nregions;
 	uint32_t padding;
-	struct vhost_memory_region regions[0];
+	struct vhost_memory_region regions[];
 };
 
 /* vhost kernel ioctls */
diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c
index 82f25a8674..bd13fe44b4 100644
--- a/drivers/net/virtio/virtio_user/vhost_vdpa.c
+++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c
@@ -70,7 +70,7 @@ struct vhost_iotlb_msg {
 struct vhost_vdpa_config {
 	uint32_t off;
 	uint32_t len;
-	uint8_t buf[0];
+	uint8_t buf[];
 };
 
 struct vhost_msg {
diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
index 99c68cf622..d100ed8762 100644
--- a/drivers/net/virtio/virtqueue.h
+++ b/drivers/net/virtio/virtqueue.h
@@ -309,7 +309,7 @@ struct virtqueue {
 
 	uint16_t  *notify_addr;
 	struct rte_mbuf **sw_ring;  /**< RX software ring. */
-	struct vq_desc_extra vq_descx[0];
+	struct vq_desc_extra vq_descx[];
 };
 
 /* If multiqueue is provided by host, then we support it. */
diff --git a/drivers/regex/mlx5/mlx5_rxp.h b/drivers/regex/mlx5/mlx5_rxp.h
index 315e3b4ca3..eddc577d79 100644
--- a/drivers/regex/mlx5/mlx5_rxp.h
+++ b/drivers/regex/mlx5/mlx5_rxp.h
@@ -64,7 +64,7 @@ struct mlx5_rxp_match_tuple {
 
 struct mlx5_rxp_response {
 	struct mlx5_rxp_response_desc header;
-	struct mlx5_rxp_match_tuple matches[0];
+	struct mlx5_rxp_match_tuple matches[];
 };
 
 #define MLX5_RXP_MAX_MATCHES 254
@@ -114,7 +114,7 @@ struct mlx5_rxp_rof {
 struct mlx5_rxp_ctl_rules_pgm {
 	struct mlx5_rxp_ctl_hdr hdr;
 	uint32_t count;
-	struct mlx5_rxp_rof_entry rules[0];
+	struct mlx5_rxp_rof_entry rules[];
 } __rte_packed;
 
 /* RXP programming mode setting. */
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 3/4] lib: replace zero-length arrays with undimensioned ones
  2022-06-02 15:08 [PATCH 0/4] clean up zero-length arrays Bruce Richardson
  2022-06-02 15:08 ` [PATCH 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
  2022-06-02 15:08 ` [PATCH 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
@ 2022-06-02 15:08 ` Bruce Richardson
  2022-06-02 15:08 ` [PATCH 4/4] app: examples: " Bruce Richardson
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-02 15:08 UTC (permalink / raw)
  To: dev; +Cc: david.marchand, stephen, Bruce Richardson

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 lib/cryptodev/cryptodev_pmd.h          |  2 +-
 lib/cryptodev/rte_cryptodev.h          |  2 +-
 lib/eventdev/rte_event_timer_adapter.h |  2 +-
 lib/ip_frag/ip_reassembly.h            |  2 +-
 lib/ipsec/sa.h                         |  2 +-
 lib/rib/rte_rib.c                      |  2 +-
 lib/rib/rte_rib6.c                     |  2 +-
 lib/table/rte_swx_table_learner.c      |  4 ++--
 lib/table/rte_table_hash_key16.c       |  4 ++--
 lib/table/rte_table_hash_key32.c       |  4 ++--
 lib/table/rte_table_hash_key8.c        |  4 ++--
 lib/vhost/rte_vhost.h                  |  4 ++--
 13 files changed, 43 insertions(+), 17 deletions(-)
 create mode 100644 lib/count_comments.py

diff --git a/lib/cryptodev/cryptodev_pmd.h b/lib/cryptodev/cryptodev_pmd.h
index 2b1ce2da2d..9bcaa2f1c8 100644
--- a/lib/cryptodev/cryptodev_pmd.h
+++ b/lib/cryptodev/cryptodev_pmd.h
@@ -637,7 +637,7 @@ RTE_STD_C11 struct rte_cryptodev_asym_session {
 	uint16_t user_data_sz;
 	/**< Session user data will be placed after sess_data */
 	uint8_t padding[3];
-	uint8_t sess_private_data[0];
+	uint8_t sess_private_data[];
 };

 #ifdef __cplusplus
diff --git a/lib/cryptodev/rte_cryptodev.h b/lib/cryptodev/rte_cryptodev.h
index 45d33f4a50..089a27407a 100644
--- a/lib/cryptodev/rte_cryptodev.h
+++ b/lib/cryptodev/rte_cryptodev.h
@@ -912,7 +912,7 @@ struct rte_cryptodev_sym_session {
 	__extension__ struct {
 		void *data;
 		uint16_t refcnt;
-	} sess_data[0];
+	} sess_data[];
 	/**< Driver specific session material, variable size */
 };

diff --git a/lib/eventdev/rte_event_timer_adapter.h b/lib/eventdev/rte_event_timer_adapter.h
index 4c91e5516a..eab8e59a57 100644
--- a/lib/eventdev/rte_event_timer_adapter.h
+++ b/lib/eventdev/rte_event_timer_adapter.h
@@ -486,7 +486,7 @@ struct rte_event_timer {
 	 */
 	enum rte_event_timer_state state;
 	/**< State of the event timer. */
-	uint8_t user_meta[0];
+	uint8_t user_meta[];
 	/**< Memory to store user specific metadata.
 	 * The event timer adapter implementation should not modify this area.
 	 */
diff --git a/lib/ip_frag/ip_reassembly.h b/lib/ip_frag/ip_reassembly.h
index 416fb66dd4..ef9d8c0d75 100644
--- a/lib/ip_frag/ip_reassembly.h
+++ b/lib/ip_frag/ip_reassembly.h
@@ -83,7 +83,7 @@ struct rte_ip_frag_tbl {
 	struct ip_frag_pkt *last;     /* last used entry. */
 	struct ip_pkt_list lru;       /* LRU list for table entries. */
 	struct ip_frag_tbl_stat stat; /* statistics counters. */
-	__extension__ struct ip_frag_pkt pkt[0]; /* hash table. */
+	__extension__ struct ip_frag_pkt pkt[]; /* hash table. */
 };

 #endif /* _IP_REASSEMBLY_H_ */
diff --git a/lib/ipsec/sa.h b/lib/ipsec/sa.h
index 46f9a4df5b..ce4af8ceb2 100644
--- a/lib/ipsec/sa.h
+++ b/lib/ipsec/sa.h
@@ -59,7 +59,7 @@ union sym_op_data {
 struct replay_sqn {
 	rte_rwlock_t rwl;
 	uint64_t sqn;
-	__extension__ uint64_t window[0];
+	__extension__ uint64_t window[];
 };

 /*IPSEC SA supported algorithms */
diff --git a/lib/rib/rte_rib.c b/lib/rib/rte_rib.c
index f1fdddbbb4..b0794edf66 100644
--- a/lib/rib/rte_rib.c
+++ b/lib/rib/rte_rib.c
@@ -35,7 +35,7 @@ struct rte_rib_node {
 	uint8_t		depth;
 	uint8_t		flag;
 	uint64_t	nh;
-	__extension__ uint64_t	ext[0];
+	__extension__ uint64_t ext[];
 };

 struct rte_rib {
diff --git a/lib/rib/rte_rib6.c b/lib/rib/rte_rib6.c
index 650bf1b8f6..19e4ff97c4 100644
--- a/lib/rib/rte_rib6.c
+++ b/lib/rib/rte_rib6.c
@@ -34,7 +34,7 @@ struct rte_rib6_node {
 	uint8_t			ip[RTE_RIB6_IPV6_ADDR_SIZE];
 	uint8_t			depth;
 	uint8_t			flag;
-	__extension__ uint64_t		ext[0];
+	__extension__ uint64_t ext[];
 };

 struct rte_rib6 {
diff --git a/lib/table/rte_swx_table_learner.c b/lib/table/rte_swx_table_learner.c
index 222acfc962..f7f8e8aea9 100644
--- a/lib/table/rte_swx_table_learner.c
+++ b/lib/table/rte_swx_table_learner.c
@@ -252,7 +252,7 @@ struct table_bucket {
 	uint32_t sig[TABLE_KEYS_PER_BUCKET];
 	uint8_t key_timeout_id[TABLE_KEYS_PER_BUCKET];
 	uint8_t pad[TABLE_BUCKET_PAD_SIZE];
-	uint8_t key[0];
+	uint8_t key[];
 };

 struct table_params {
@@ -317,7 +317,7 @@ struct table {
 	uint8_t key_mask0[RTE_CACHE_LINE_SIZE];

 	/* Table buckets. */
-	uint8_t buckets[0];
+	uint8_t buckets[];
 } __rte_cache_aligned;

 /* The timeout (in cycles) is stored in the table as a 32-bit value by truncating its least
diff --git a/lib/table/rte_table_hash_key16.c b/lib/table/rte_table_hash_key16.c
index ea8195dc17..04d7fd64bd 100644
--- a/lib/table/rte_table_hash_key16.c
+++ b/lib/table/rte_table_hash_key16.c
@@ -43,7 +43,7 @@ struct rte_bucket_4_16 {
 	uint64_t key[4][2];

 	/* Cache line 2 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_16 {
@@ -58,7 +58,7 @@ struct rte_bucket_4_16 {
 	uint64_t key[4][2];

 	/* Cache line 2 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif

diff --git a/lib/table/rte_table_hash_key32.c b/lib/table/rte_table_hash_key32.c
index 87f83ce6f5..88d8f69c72 100644
--- a/lib/table/rte_table_hash_key32.c
+++ b/lib/table/rte_table_hash_key32.c
@@ -43,7 +43,7 @@ struct rte_bucket_4_32 {
 	uint64_t key[4][4];

 	/* Cache line 3 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_32 {
@@ -58,7 +58,7 @@ struct rte_bucket_4_32 {
 	uint64_t key[4][4];

 	/* Cache line 3 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif

diff --git a/lib/table/rte_table_hash_key8.c b/lib/table/rte_table_hash_key8.c
index 7779a9d1a3..035d242769 100644
--- a/lib/table/rte_table_hash_key8.c
+++ b/lib/table/rte_table_hash_key8.c
@@ -40,7 +40,7 @@ struct rte_bucket_4_8 {
 	uint64_t key[4];

 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_8 {
@@ -54,7 +54,7 @@ struct rte_bucket_4_8 {
 	uint64_t key[4];

 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif

diff --git a/lib/vhost/rte_vhost.h b/lib/vhost/rte_vhost.h
index c733f857c6..99be18ceef 100644
--- a/lib/vhost/rte_vhost.h
+++ b/lib/vhost/rte_vhost.h
@@ -154,7 +154,7 @@ struct rte_vhost_inflight_info_split {
 	uint16_t desc_num;
 	uint16_t last_inflight_io;
 	uint16_t used_idx;
-	struct rte_vhost_inflight_desc_split desc[0];
+	struct rte_vhost_inflight_desc_split desc[];
 };

 struct rte_vhost_inflight_desc_packed {
@@ -181,7 +181,7 @@ struct rte_vhost_inflight_info_packed {
 	uint8_t used_wrap_counter;
 	uint8_t old_used_wrap_counter;
 	uint8_t padding[7];
-	struct rte_vhost_inflight_desc_packed desc[0];
+	struct rte_vhost_inflight_desc_packed desc[];
 };

 struct rte_vhost_resubmit_desc {
--
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 4/4] app: examples: replace zero-length arrays with undimensioned ones
  2022-06-02 15:08 [PATCH 0/4] clean up zero-length arrays Bruce Richardson
                   ` (2 preceding siblings ...)
  2022-06-02 15:08 ` [PATCH 3/4] lib: " Bruce Richardson
@ 2022-06-02 15:08 ` Bruce Richardson
  2022-06-02 15:20 ` [PATCH 0/4] clean up zero-length arrays Morten Brørup
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-02 15:08 UTC (permalink / raw)
  To: dev; +Cc: david.marchand, stephen, Bruce Richardson

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 app/test/test_table_tables.c   | 2 +-
 examples/ip_reassembly/main.c  | 2 +-
 examples/ptpclient/ptpclient.c | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/test/test_table_tables.c b/app/test/test_table_tables.c
index 010dd5a794..26908e6112 100644
--- a/app/test/test_table_tables.c
+++ b/app/test/test_table_tables.c
@@ -53,7 +53,7 @@ struct rte_bucket_4_8 {
 	uint64_t next_valid;
 	uint64_t key[4];
 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 
 #if RTE_TABLE_HASH_LRU_STRATEGY == 3
diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c
index 6e4c11c3c7..3ebf895aa0 100644
--- a/examples/ip_reassembly/main.c
+++ b/examples/ip_reassembly/main.c
@@ -126,7 +126,7 @@ struct mbuf_table {
 	uint32_t len;
 	uint32_t head;
 	uint32_t tail;
-	struct rte_mbuf *m_table[0];
+	struct rte_mbuf *m_table[];
 };
 
 struct rx_queue {
diff --git a/examples/ptpclient/ptpclient.c b/examples/ptpclient/ptpclient.c
index de799f698b..1f1c9c9c52 100644
--- a/examples/ptpclient/ptpclient.c
+++ b/examples/ptpclient/ptpclient.c
@@ -90,7 +90,7 @@ struct sync_msg {
 struct follow_up_msg {
 	struct ptp_header   hdr;
 	struct tstamp       precise_origin_tstamp;
-	uint8_t             suffix[0];
+	uint8_t             suffix[];
 } __rte_packed;
 
 struct delay_req_msg {
@@ -102,7 +102,7 @@ struct delay_resp_msg {
 	struct ptp_header    hdr;
 	struct tstamp        rx_tstamp;
 	struct port_id       req_port_id;
-	uint8_t              suffix[0];
+	uint8_t              suffix[];
 } __rte_packed;
 
 struct ptp_message {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* RE: [PATCH 0/4] clean up zero-length arrays
  2022-06-02 15:08 [PATCH 0/4] clean up zero-length arrays Bruce Richardson
                   ` (3 preceding siblings ...)
  2022-06-02 15:08 ` [PATCH 4/4] app: examples: " Bruce Richardson
@ 2022-06-02 15:20 ` Morten Brørup
  2022-06-02 15:35 ` Stephen Hemminger
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 34+ messages in thread
From: Morten Brørup @ 2022-06-02 15:20 UTC (permalink / raw)
  To: Bruce Richardson, dev; +Cc: david.marchand, stephen

> From: Bruce Richardson [mailto:bruce.richardson@intel.com]
> Sent: Thursday, 2 June 2022 17.09
> 
> This patchset adds a coccinelle script to clean-up zero-length
> arrays in structures. The final patches are the result of running
> that script on the DPDK repository.
> 
> Bruce Richardson (4):
>   cocci: add script for zero-length arrays in structs
>   drivers: replace zero-length arrays with undimensioned ones
>   lib: replace zero-length arrays with undimensioned ones
>   app: examples: replace zero-length arrays with undimensioned ones
> 
>  app/test/test_table_tables.c                  |  2 +-
>  devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++
>  drivers/bus/dpaa/include/netcfg.h             |  4 +--
>  drivers/bus/vmbus/rte_vmbus_reg.h             |  4 +--
>  drivers/common/cnxk/roc_se.h                  |  2 +-
>  drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
>  drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
>  drivers/common/mlx5/mlx5_prm.h                | 10 +++----
>  drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 +--
>  drivers/crypto/virtio/virtio_ring.h           |  4 +--
>  drivers/crypto/virtio/virtqueue.h             |  2 +-
>  drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
>  drivers/net/cxgbe/clip_tbl.h                  |  2 +-
>  drivers/net/cxgbe/l2t.h                       |  2 +-
>  drivers/net/cxgbe/mps_tcam.h                  |  2 +-
>  drivers/net/cxgbe/smt.h                       |  2 +-
>  drivers/net/enic/base/vnic_devcmd.h           |  2 +-
>  drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
>  drivers/net/mlx5/mlx5_tx.h                    |  2 +-
>  drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
>  drivers/net/virtio/virtio_ring.h              |  4 +--
>  drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
>  drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
>  drivers/net/virtio/virtqueue.h                |  2 +-
>  drivers/regex/mlx5/mlx5_rxp.h                 |  4 +--
>  examples/ip_reassembly/main.c                 |  2 +-
>  examples/ptpclient/ptpclient.c                |  4 +--
>  lib/cryptodev/cryptodev_pmd.h                 |  2 +-
>  lib/cryptodev/rte_cryptodev.h                 |  2 +-
>  lib/eventdev/rte_event_timer_adapter.h        |  2 +-
>  lib/ip_frag/ip_reassembly.h                   |  2 +-
>  lib/ipsec/sa.h                                |  2 +-
>  lib/rib/rte_rib.c                             |  2 +-
>  lib/rib/rte_rib6.c                            |  2 +-
>  lib/table/rte_swx_table_learner.c             |  4 +--
>  lib/table/rte_table_hash_key16.c              |  4 +--
>  lib/table/rte_table_hash_key32.c              |  4 +--
>  lib/table/rte_table_hash_key8.c               |  4 +--
>  lib/vhost/rte_vhost.h                         |  4 +--
>  40 files changed, 101 insertions(+), 54 deletions(-)
>  create mode 100644 devtools/cocci/zero_length_array.cocci
>  create mode 100644 lib/count_comments.py
> 
> --
> 2.34.1
> 

Series-Acked-by: Morten Brørup <mb@smartsharesystems.com>


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH 0/4] clean up zero-length arrays
  2022-06-02 15:08 [PATCH 0/4] clean up zero-length arrays Bruce Richardson
                   ` (4 preceding siblings ...)
  2022-06-02 15:20 ` [PATCH 0/4] clean up zero-length arrays Morten Brørup
@ 2022-06-02 15:35 ` Stephen Hemminger
  2022-06-02 16:13 ` [PATCH v2 " Bruce Richardson
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 34+ messages in thread
From: Stephen Hemminger @ 2022-06-02 15:35 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, david.marchand

On Thu,  2 Jun 2022 16:08:30 +0100
Bruce Richardson <bruce.richardson@intel.com> wrote:

> This patchset adds a coccinelle script to clean-up zero-length
> arrays in structures. The final patches are the result of running
> that script on the DPDK repository.
> 
> Bruce Richardson (4):
>   cocci: add script for zero-length arrays in structs
>   drivers: replace zero-length arrays with undimensioned ones
>   lib: replace zero-length arrays with undimensioned ones
>   app: examples: replace zero-length arrays with undimensioned ones
> 
>  app/test/test_table_tables.c                  |  2 +-
>  devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++
>  drivers/bus/dpaa/include/netcfg.h             |  4 +--
>  drivers/bus/vmbus/rte_vmbus_reg.h             |  4 +--
>  drivers/common/cnxk/roc_se.h                  |  2 +-
>  drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
>  drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
>  drivers/common/mlx5/mlx5_prm.h                | 10 +++----
>  drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 +--
>  drivers/crypto/virtio/virtio_ring.h           |  4 +--
>  drivers/crypto/virtio/virtqueue.h             |  2 +-
>  drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
>  drivers/net/cxgbe/clip_tbl.h                  |  2 +-
>  drivers/net/cxgbe/l2t.h                       |  2 +-
>  drivers/net/cxgbe/mps_tcam.h                  |  2 +-
>  drivers/net/cxgbe/smt.h                       |  2 +-
>  drivers/net/enic/base/vnic_devcmd.h           |  2 +-
>  drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
>  drivers/net/mlx5/mlx5_tx.h                    |  2 +-
>  drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
>  drivers/net/virtio/virtio_ring.h              |  4 +--
>  drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
>  drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
>  drivers/net/virtio/virtqueue.h                |  2 +-
>  drivers/regex/mlx5/mlx5_rxp.h                 |  4 +--
>  examples/ip_reassembly/main.c                 |  2 +-
>  examples/ptpclient/ptpclient.c                |  4 +--
>  lib/cryptodev/cryptodev_pmd.h                 |  2 +-
>  lib/cryptodev/rte_cryptodev.h                 |  2 +-
>  lib/eventdev/rte_event_timer_adapter.h        |  2 +-
>  lib/ip_frag/ip_reassembly.h                   |  2 +-
>  lib/ipsec/sa.h                                |  2 +-
>  lib/rib/rte_rib.c                             |  2 +-
>  lib/rib/rte_rib6.c                            |  2 +-
>  lib/table/rte_swx_table_learner.c             |  4 +--
>  lib/table/rte_table_hash_key16.c              |  4 +--
>  lib/table/rte_table_hash_key32.c              |  4 +--
>  lib/table/rte_table_hash_key8.c               |  4 +--
>  lib/vhost/rte_vhost.h                         |  4 +--
>  40 files changed, 101 insertions(+), 54 deletions(-)
>  create mode 100644 devtools/cocci/zero_length_array.cocci
>  create mode 100644 lib/count_comments.py
> 
> --
> 2.34.1
> 

Series-acked-by: Stephen Hemminger <stephen@networkplumber.org>

Would it be possible to add check for zero length arrays in checkpatch?
So that new drivers don't bring the problem back.

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [PATCH v2 0/4] clean up zero-length arrays
  2022-06-02 15:08 [PATCH 0/4] clean up zero-length arrays Bruce Richardson
                   ` (5 preceding siblings ...)
  2022-06-02 15:35 ` Stephen Hemminger
@ 2022-06-02 16:13 ` Bruce Richardson
  2022-06-02 16:13   ` [PATCH v2 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
                     ` (4 more replies)
  2022-06-03 10:13 ` [PATCH v3 " Bruce Richardson
                   ` (2 subsequent siblings)
  9 siblings, 5 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-02 16:13 UTC (permalink / raw)
  To: dev; +Cc: david.marchand, Bruce Richardson

This patchset adds a coccinelle script to clean-up zero-length
arrays in structures. The final patches are the result of running
that script on the DPDK repository.

V2: rebased to fix apply conflict

Bruce Richardson (4):
  cocci: add script for zero-length arrays in structs
  drivers: replace zero-length arrays with undimensioned ones
  lib: replace zero-length arrays with undimensioned ones
  app: examples: replace zero-length arrays with undimensioned ones

 app/test/test_table_tables.c                  |  2 +-
 devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++++++
 drivers/bus/dpaa/include/netcfg.h             |  4 ++--
 drivers/bus/vmbus/rte_vmbus_reg.h             |  4 ++--
 drivers/common/cnxk/roc_se.h                  |  2 +-
 drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
 drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
 drivers/common/mlx5/mlx5_prm.h                | 10 ++++-----
 drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 ++--
 drivers/crypto/virtio/virtio_ring.h           |  4 ++--
 drivers/crypto/virtio/virtqueue.h             |  2 +-
 drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
 drivers/net/cxgbe/clip_tbl.h                  |  2 +-
 drivers/net/cxgbe/l2t.h                       |  2 +-
 drivers/net/cxgbe/mps_tcam.h                  |  2 +-
 drivers/net/cxgbe/smt.h                       |  2 +-
 drivers/net/enic/base/vnic_devcmd.h           |  2 +-
 drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
 drivers/net/mlx5/mlx5_tx.h                    |  2 +-
 drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
 drivers/net/virtio/virtio_ring.h              |  4 ++--
 drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
 drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
 drivers/net/virtio/virtqueue.h                |  2 +-
 drivers/regex/mlx5/mlx5_rxp.h                 |  4 ++--
 examples/ip_reassembly/main.c                 |  2 +-
 examples/ptpclient/ptpclient.c                |  4 ++--
 lib/cryptodev/cryptodev_pmd.h                 |  2 +-
 lib/cryptodev/rte_cryptodev.h                 |  2 +-
 lib/eventdev/rte_event_timer_adapter.h        |  2 +-
 lib/ip_frag/ip_reassembly.h                   |  2 +-
 lib/ipsec/sa.h                                |  2 +-
 lib/rib/rte_rib.c                             |  2 +-
 lib/rib/rte_rib6.c                            |  2 +-
 lib/table/rte_swx_table_learner.c             |  4 ++--
 lib/table/rte_table_hash_key16.c              |  4 ++--
 lib/table/rte_table_hash_key32.c              |  4 ++--
 lib/table/rte_table_hash_key8.c               |  4 ++--
 lib/vhost/rte_vhost.h                         |  4 ++--
 39 files changed, 75 insertions(+), 54 deletions(-)
 create mode 100644 devtools/cocci/zero_length_array.cocci

--
2.34.1


^ permalink raw reply	[flat|nested] 34+ messages in thread

* [PATCH v2 1/4] cocci: add script for zero-length arrays in structs
  2022-06-02 16:13 ` [PATCH v2 " Bruce Richardson
@ 2022-06-02 16:13   ` Bruce Richardson
  2022-06-02 16:13   ` [PATCH v2 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-02 16:13 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson, Morten Brørup, Stephen Hemminger

Add script to replace [0] with [] when used at the end of a struct.
The script also includes an additional struct member to match against so
as to avoid issues with arrays with only a single zero-length element.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 devtools/cocci/zero_length_array.cocci | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 devtools/cocci/zero_length_array.cocci

diff --git a/devtools/cocci/zero_length_array.cocci b/devtools/cocci/zero_length_array.cocci
new file mode 100644
index 0000000000..de8783bc7a
--- /dev/null
+++ b/devtools/cocci/zero_length_array.cocci
@@ -0,0 +1,21 @@
+// Replace zero-length array members with []
+@@
+identifier st, member, arr;
+type T1, T2;
+@@
+struct st {
+	...
+	T1 member;
+-	T2 arr[0];
++	T2 arr[];
+};
+@@
+identifier st, member, arr, id;
+type T1, T2;
+@@
+struct st {
+	...
+	T1 member;
+-	T2 arr[0];
++	T2 arr[];
+} id;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 2/4] drivers: replace zero-length arrays with undimensioned ones
  2022-06-02 16:13 ` [PATCH v2 " Bruce Richardson
  2022-06-02 16:13   ` [PATCH v2 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
@ 2022-06-02 16:13   ` Bruce Richardson
  2022-06-03  7:19     ` David Marchand
  2022-06-02 16:13   ` [PATCH v2 3/4] lib: " Bruce Richardson
                     ` (2 subsequent siblings)
  4 siblings, 1 reply; 34+ messages in thread
From: Bruce Richardson @ 2022-06-02 16:13 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson, Morten Brørup, Stephen Hemminger

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 drivers/bus/dpaa/include/netcfg.h             |  4 ++--
 drivers/bus/vmbus/rte_vmbus_reg.h             |  4 ++--
 drivers/common/cnxk/roc_se.h                  |  2 +-
 drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
 drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
 drivers/common/mlx5/mlx5_prm.h                | 10 +++++-----
 drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 ++--
 drivers/crypto/virtio/virtio_ring.h           |  4 ++--
 drivers/crypto/virtio/virtqueue.h             |  2 +-
 drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
 drivers/net/cxgbe/clip_tbl.h                  |  2 +-
 drivers/net/cxgbe/l2t.h                       |  2 +-
 drivers/net/cxgbe/mps_tcam.h                  |  2 +-
 drivers/net/cxgbe/smt.h                       |  2 +-
 drivers/net/enic/base/vnic_devcmd.h           |  2 +-
 drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
 drivers/net/mlx5/mlx5_tx.h                    |  2 +-
 drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
 drivers/net/virtio/virtio_ring.h              |  4 ++--
 drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
 drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
 drivers/net/virtio/virtqueue.h                |  2 +-
 drivers/regex/mlx5/mlx5_rxp.h                 |  4 ++--
 23 files changed, 33 insertions(+), 33 deletions(-)

diff --git a/drivers/bus/dpaa/include/netcfg.h b/drivers/bus/dpaa/include/netcfg.h
index bb18a34e3d..43c7e1cfe1 100644
--- a/drivers/bus/dpaa/include/netcfg.h
+++ b/drivers/bus/dpaa/include/netcfg.h
@@ -23,7 +23,7 @@ struct fm_eth_port_cfg {
 struct netcfg_info {
 	uint8_t num_ethports;
 	/**< Number of ports */
-	struct fm_eth_port_cfg port_cfg[0];
+	struct fm_eth_port_cfg port_cfg[];
 	/**< Variable structure array of size num_ethports */
 };
 
@@ -38,7 +38,7 @@ struct interface_info {
 struct netcfg_interface {
 	uint8_t numof_netcfg_interface;
 	uint8_t numof_fman_enabled_macless;
-	struct interface_info interface_info[0];
+	struct interface_info interface_info[];
 };
 
 /* pcd_file: FMC netpcd XML ("policy") file, that contains PCD information.
diff --git a/drivers/bus/vmbus/rte_vmbus_reg.h b/drivers/bus/vmbus/rte_vmbus_reg.h
index 8562672979..a17ce40763 100644
--- a/drivers/bus/vmbus/rte_vmbus_reg.h
+++ b/drivers/bus/vmbus/rte_vmbus_reg.h
@@ -107,7 +107,7 @@ struct vmbus_bufring {
 	 * Ring data starts here + RingDataStartOffset
 	 * !!! DO NOT place any fields below this !!!
 	 */
-	uint8_t data[0];
+	uint8_t data[];
 } __rte_packed;
 
 /*
@@ -140,7 +140,7 @@ vmbus_chanpkt_getlen(uint16_t pktlen)
 struct vmbus_gpa_range {
 	uint32_t       len;
 	uint32_t       ofs;
-	uint64_t       page[0];
+	uint64_t       page[];
 } __rte_packed;
 
 /* This is actually vmbus_gpa_range.gpa_page[1] */
diff --git a/drivers/common/cnxk/roc_se.h b/drivers/common/cnxk/roc_se.h
index 145a1825bd..a1d476a86d 100644
--- a/drivers/common/cnxk/roc_se.h
+++ b/drivers/common/cnxk/roc_se.h
@@ -246,7 +246,7 @@ struct roc_se_buf_ptr {
 /* IOV Pointer */
 struct roc_se_iov_ptr {
 	int buf_cnt;
-	struct roc_se_buf_ptr bufs[0];
+	struct roc_se_buf_ptr bufs[];
 };
 
 struct roc_se_fc_params {
diff --git a/drivers/common/dpaax/caamflib/desc/ipsec.h b/drivers/common/dpaax/caamflib/desc/ipsec.h
index 8ec6aac915..2c9080a1b5 100644
--- a/drivers/common/dpaax/caamflib/desc/ipsec.h
+++ b/drivers/common/dpaax/caamflib/desc/ipsec.h
@@ -350,7 +350,7 @@ struct ipsec_encap_pdb {
 	};
 	uint32_t spi;
 	uint32_t ip_hdr_len;
-	uint8_t ip_hdr[0];
+	uint8_t ip_hdr[];
 };
 
 static inline unsigned int
diff --git a/drivers/common/dpaax/dpaax_iova_table.h b/drivers/common/dpaax/dpaax_iova_table.h
index b1f2300c52..9a18eafca0 100644
--- a/drivers/common/dpaax/dpaax_iova_table.h
+++ b/drivers/common/dpaax/dpaax_iova_table.h
@@ -32,7 +32,7 @@ struct dpaax_iovat_element {
 
 struct dpaax_iova_table {
 	unsigned int count; /**< No. of blocks of contiguous physical pages */
-	struct dpaax_iovat_element entries[0];
+	struct dpaax_iovat_element entries[];
 };
 
 /* Pointer to the table, which is common for DPAA/DPAA2 and only a single
diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h
index bc3e70a1d1..ed0781a560 100644
--- a/drivers/common/mlx5/mlx5_prm.h
+++ b/drivers/common/mlx5/mlx5_prm.h
@@ -560,7 +560,7 @@ struct mlx5_umr_wqe {
 struct mlx5_rdma_write_wqe {
 	struct mlx5_wqe_cseg ctr;
 	struct mlx5_wqe_rseg rseg;
-	struct mlx5_wqe_dseg dseg[0];
+	struct mlx5_wqe_dseg dseg[];
 } __rte_packed;
 
 #ifdef PEDANTIC
@@ -3479,7 +3479,7 @@ struct mlx5_ifc_qpc_pas_list_bits {
 #endif
 struct mlx5_ifc_qpc_extension_and_pas_list_bits {
 	struct mlx5_ifc_qpc_extension_bits qpc_data_extension;
-	u8 pas[0][0x40];
+	u8[0x40] pas[];
 };
 
 
@@ -3703,7 +3703,7 @@ struct mlx5_ifc_query_qp_out_bits {
 	u8 reserved_at_a0[0x20];
 	struct mlx5_ifc_qpc_bits qpc;
 	u8 reserved_at_800[0x80];
-	u8 pas[0][0x40];
+	u8[0x40] pas[];
 };
 #ifdef PEDANTIC
 #pragma GCC diagnostic error "-Wpedantic"
@@ -3743,7 +3743,7 @@ struct mlx5_ifc_access_register_out_bits {
 	u8 reserved_at_8[0x18];
 	u8 syndrome[0x20];
 	u8 reserved_at_40[0x40];
-	u8 register_data[0][0x20];
+	u8[0x20] register_data[];
 };
 
 struct mlx5_ifc_access_register_in_bits {
@@ -3754,7 +3754,7 @@ struct mlx5_ifc_access_register_in_bits {
 	u8 reserved_at_40[0x10];
 	u8 register_id[0x10];
 	u8 argument[0x20];
-	u8 register_data[0][0x20];
+	u8[0x20] register_data[];
 };
 #ifdef PEDANTIC
 #pragma GCC diagnostic error "-Wpedantic"
diff --git a/drivers/crypto/ipsec_mb/ipsec_mb_private.h b/drivers/crypto/ipsec_mb/ipsec_mb_private.h
index e53101acf1..e2c240dfc0 100644
--- a/drivers/crypto/ipsec_mb/ipsec_mb_private.h
+++ b/drivers/crypto/ipsec_mb/ipsec_mb_private.h
@@ -120,7 +120,7 @@ struct ipsec_mb_dev_private {
 	/**< PMD  type */
 	uint32_t max_nb_queue_pairs;
 	/**< Max number of queue pairs supported by device */
-	__extension__ uint8_t priv[0];
+	__extension__ uint8_t priv[];
 };
 
 /** IPSEC Multi buffer queue pair common queue pair data for all PMDs */
@@ -147,7 +147,7 @@ struct ipsec_mb_qp {
 	/* Multi buffer manager */
 	const struct rte_memzone *mb_mgr_mz;
 	/* Shared memzone for storing mb_mgr */
-	__extension__ uint8_t additional_data[0];
+	__extension__ uint8_t additional_data[];
 	/**< Storing PMD specific additional data */
 };
 
diff --git a/drivers/crypto/virtio/virtio_ring.h b/drivers/crypto/virtio/virtio_ring.h
index ee30674566..55839279fd 100644
--- a/drivers/crypto/virtio/virtio_ring.h
+++ b/drivers/crypto/virtio/virtio_ring.h
@@ -40,7 +40,7 @@ struct vring_desc {
 struct vring_avail {
 	uint16_t flags;
 	uint16_t idx;
-	uint16_t ring[0];
+	uint16_t ring[];
 };
 
 /* id is a 16bit index. uint32_t is used here for ids for padding reasons. */
@@ -54,7 +54,7 @@ struct vring_used_elem {
 struct vring_used {
 	uint16_t flags;
 	volatile uint16_t idx;
-	struct vring_used_elem ring[0];
+	struct vring_used_elem ring[];
 };
 
 struct vring {
diff --git a/drivers/crypto/virtio/virtqueue.h b/drivers/crypto/virtio/virtqueue.h
index c96ca62992..cb08bea94f 100644
--- a/drivers/crypto/virtio/virtqueue.h
+++ b/drivers/crypto/virtio/virtqueue.h
@@ -88,7 +88,7 @@ struct virtqueue {
 
 	uint16_t  *notify_addr;
 
-	struct vq_desc_extra vq_descx[0];
+	struct vq_desc_extra vq_descx[];
 };
 
 /**
diff --git a/drivers/net/atlantic/hw_atl/hw_atl_utils.h b/drivers/net/atlantic/hw_atl/hw_atl_utils.h
index d8fab010cf..12ac9b041e 100644
--- a/drivers/net/atlantic/hw_atl/hw_atl_utils.h
+++ b/drivers/net/atlantic/hw_atl/hw_atl_utils.h
@@ -334,7 +334,7 @@ struct offload_info {
 	struct offload_port_info ports;
 	struct offload_ka_info kas;
 	struct offload_rr_info rrs;
-	u8 buf[0];
+	u8 buf[];
 } __rte_packed;
 
 struct smbus_request {
diff --git a/drivers/net/cxgbe/clip_tbl.h b/drivers/net/cxgbe/clip_tbl.h
index d7689f4b7a..3b2be6645f 100644
--- a/drivers/net/cxgbe/clip_tbl.h
+++ b/drivers/net/cxgbe/clip_tbl.h
@@ -20,7 +20,7 @@ struct clip_tbl {
 	unsigned int clipt_start;     /* start index of CLIP table */
 	unsigned int clipt_size;      /* size of CLIP table */
 	rte_rwlock_t lock;            /* table rw lock */
-	struct clip_entry cl_list[0]; /* MUST BE LAST */
+	struct clip_entry cl_list[]; /* MUST BE LAST */
 };
 
 struct clip_tbl *t4_init_clip_tbl(unsigned int clipt_start,
diff --git a/drivers/net/cxgbe/l2t.h b/drivers/net/cxgbe/l2t.h
index 9845c9f981..e4c0ebedec 100644
--- a/drivers/net/cxgbe/l2t.h
+++ b/drivers/net/cxgbe/l2t.h
@@ -37,7 +37,7 @@ struct l2t_data {
 	unsigned int l2t_start;     /* start index of our piece of the L2T */
 	unsigned int l2t_size;      /* number of entries in l2tab */
 	rte_rwlock_t lock;          /* table rw lock */
-	struct l2t_entry l2tab[0];  /* MUST BE LAST */
+	struct l2t_entry l2tab[];  /* MUST BE LAST */
 };
 
 #define L2T_LPBK	true
diff --git a/drivers/net/cxgbe/mps_tcam.h b/drivers/net/cxgbe/mps_tcam.h
index a359f52442..363786bd38 100644
--- a/drivers/net/cxgbe/mps_tcam.h
+++ b/drivers/net/cxgbe/mps_tcam.h
@@ -41,7 +41,7 @@ struct mpstcam_table {
 			 * free_idx cannot alone determine
 			 * if the table is full
 			 */
-	struct mps_tcam_entry entry[0];
+	struct mps_tcam_entry entry[];
 };
 
 struct mpstcam_table *t4_init_mpstcam(struct adapter *adap);
diff --git a/drivers/net/cxgbe/smt.h b/drivers/net/cxgbe/smt.h
index a70e3a2085..531810e695 100644
--- a/drivers/net/cxgbe/smt.h
+++ b/drivers/net/cxgbe/smt.h
@@ -31,7 +31,7 @@ struct smt_data {
 	unsigned int smt_size;
 	unsigned int smt_start;
 	rte_rwlock_t lock;
-	struct smt_entry smtab[0];
+	struct smt_entry smtab[];
 };
 
 struct smt_data *t4_init_smt(u32 smt_start_idx, u32 smt_size);
diff --git a/drivers/net/enic/base/vnic_devcmd.h b/drivers/net/enic/base/vnic_devcmd.h
index 3157bc8cb5..253a791c3f 100644
--- a/drivers/net/enic/base/vnic_devcmd.h
+++ b/drivers/net/enic/base/vnic_devcmd.h
@@ -997,7 +997,7 @@ enum {
 struct filter_tlv {
 	uint32_t type;
 	uint32_t length;
-	uint32_t val[0];
+	uint32_t val[];
 };
 
 /* Data for CMD_ADD_FILTER is 2 TLV and filter + action structs */
diff --git a/drivers/net/hinic/hinic_pmd_tx.h b/drivers/net/hinic/hinic_pmd_tx.h
index a3ec6299fb..152f7abc53 100644
--- a/drivers/net/hinic/hinic_pmd_tx.h
+++ b/drivers/net/hinic/hinic_pmd_tx.h
@@ -81,7 +81,7 @@ struct hinic_sq_wqe {
 	struct hinic_sq_task		task;
 
 	/* sq sge section start address, 1~127 sges */
-	struct hinic_sq_bufdesc     buf_descs[0];
+	struct hinic_sq_bufdesc     buf_descs[];
 };
 
 struct hinic_txq_stats {
diff --git a/drivers/net/mlx5/mlx5_tx.h b/drivers/net/mlx5/mlx5_tx.h
index 20776919c2..defb745906 100644
--- a/drivers/net/mlx5/mlx5_tx.h
+++ b/drivers/net/mlx5/mlx5_tx.h
@@ -166,7 +166,7 @@ struct mlx5_txq_data {
 	struct mlx5_txq_stats stats; /* TX queue counters. */
 	struct mlx5_txq_stats stats_reset; /* stats on last reset. */
 	struct mlx5_uar_data uar_data;
-	struct rte_mbuf *elts[0];
+	struct rte_mbuf *elts[];
 	/* Storage for queued packets, must be the last field. */
 } __rte_cache_aligned;
 
diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.h b/drivers/net/nfp/nfpcore/nfp_nsp.h
index e74cdeb191..2184c15b4c 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.h
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.h
@@ -224,7 +224,7 @@ struct nfp_eth_table {
 		int is_split;
 
 		unsigned int fec_modes_supported;
-	} ports[0];
+	} ports[];
 };
 
 struct nfp_eth_table *nfp_eth_read_ports(struct nfp_cpp *cpp);
diff --git a/drivers/net/virtio/virtio_ring.h b/drivers/net/virtio/virtio_ring.h
index 17a56b0a73..e848c0b73b 100644
--- a/drivers/net/virtio/virtio_ring.h
+++ b/drivers/net/virtio/virtio_ring.h
@@ -46,7 +46,7 @@ struct vring_desc {
 struct vring_avail {
 	uint16_t flags;
 	uint16_t idx;
-	uint16_t ring[0];
+	uint16_t ring[];
 };
 
 /* id is a 16bit index. uint32_t is used here for ids for padding reasons. */
@@ -60,7 +60,7 @@ struct vring_used_elem {
 struct vring_used {
 	uint16_t flags;
 	uint16_t idx;
-	struct vring_used_elem ring[0];
+	struct vring_used_elem ring[];
 };
 
 /* For support of packed virtqueues in Virtio 1.1 the format of descriptors
diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c
index 986b56a7ca..1aed08b2bd 100644
--- a/drivers/net/virtio/virtio_user/vhost_kernel.c
+++ b/drivers/net/virtio/virtio_user/vhost_kernel.c
@@ -22,7 +22,7 @@ struct vhost_kernel_data {
 struct vhost_memory_kernel {
 	uint32_t nregions;
 	uint32_t padding;
-	struct vhost_memory_region regions[0];
+	struct vhost_memory_region regions[];
 };
 
 /* vhost kernel ioctls */
diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c
index 82f25a8674..bd13fe44b4 100644
--- a/drivers/net/virtio/virtio_user/vhost_vdpa.c
+++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c
@@ -70,7 +70,7 @@ struct vhost_iotlb_msg {
 struct vhost_vdpa_config {
 	uint32_t off;
 	uint32_t len;
-	uint8_t buf[0];
+	uint8_t buf[];
 };
 
 struct vhost_msg {
diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
index 99c68cf622..d100ed8762 100644
--- a/drivers/net/virtio/virtqueue.h
+++ b/drivers/net/virtio/virtqueue.h
@@ -309,7 +309,7 @@ struct virtqueue {
 
 	uint16_t  *notify_addr;
 	struct rte_mbuf **sw_ring;  /**< RX software ring. */
-	struct vq_desc_extra vq_descx[0];
+	struct vq_desc_extra vq_descx[];
 };
 
 /* If multiqueue is provided by host, then we support it. */
diff --git a/drivers/regex/mlx5/mlx5_rxp.h b/drivers/regex/mlx5/mlx5_rxp.h
index 315e3b4ca3..eddc577d79 100644
--- a/drivers/regex/mlx5/mlx5_rxp.h
+++ b/drivers/regex/mlx5/mlx5_rxp.h
@@ -64,7 +64,7 @@ struct mlx5_rxp_match_tuple {
 
 struct mlx5_rxp_response {
 	struct mlx5_rxp_response_desc header;
-	struct mlx5_rxp_match_tuple matches[0];
+	struct mlx5_rxp_match_tuple matches[];
 };
 
 #define MLX5_RXP_MAX_MATCHES 254
@@ -114,7 +114,7 @@ struct mlx5_rxp_rof {
 struct mlx5_rxp_ctl_rules_pgm {
 	struct mlx5_rxp_ctl_hdr hdr;
 	uint32_t count;
-	struct mlx5_rxp_rof_entry rules[0];
+	struct mlx5_rxp_rof_entry rules[];
 } __rte_packed;
 
 /* RXP programming mode setting. */
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 3/4] lib: replace zero-length arrays with undimensioned ones
  2022-06-02 16:13 ` [PATCH v2 " Bruce Richardson
  2022-06-02 16:13   ` [PATCH v2 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
  2022-06-02 16:13   ` [PATCH v2 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
@ 2022-06-02 16:13   ` Bruce Richardson
  2022-06-02 16:13   ` [PATCH v2 4/4] app: examples: " Bruce Richardson
  2022-06-03  6:56   ` [PATCH v2 0/4] clean up zero-length arrays Hemant Agrawal
  4 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-02 16:13 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson, Morten Brørup, Stephen Hemminger

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 lib/cryptodev/cryptodev_pmd.h          | 2 +-
 lib/cryptodev/rte_cryptodev.h          | 2 +-
 lib/eventdev/rte_event_timer_adapter.h | 2 +-
 lib/ip_frag/ip_reassembly.h            | 2 +-
 lib/ipsec/sa.h                         | 2 +-
 lib/rib/rte_rib.c                      | 2 +-
 lib/rib/rte_rib6.c                     | 2 +-
 lib/table/rte_swx_table_learner.c      | 4 ++--
 lib/table/rte_table_hash_key16.c       | 4 ++--
 lib/table/rte_table_hash_key32.c       | 4 ++--
 lib/table/rte_table_hash_key8.c        | 4 ++--
 lib/vhost/rte_vhost.h                  | 4 ++--
 12 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/lib/cryptodev/cryptodev_pmd.h b/lib/cryptodev/cryptodev_pmd.h
index 7a7d3ee3f1..3dcc3cb7ed 100644
--- a/lib/cryptodev/cryptodev_pmd.h
+++ b/lib/cryptodev/cryptodev_pmd.h
@@ -673,7 +673,7 @@ RTE_STD_C11 struct rte_cryptodev_asym_session {
 	uint8_t padding[3];
 	void *event_mdata;
 	/**< Event metadata (aka *union rte_event_crypto_metadata*) */
-	uint8_t sess_private_data[0];
+	uint8_t sess_private_data[];
 };
 
 #ifdef __cplusplus
diff --git a/lib/cryptodev/rte_cryptodev.h b/lib/cryptodev/rte_cryptodev.h
index 585cee2727..56f459c6a0 100644
--- a/lib/cryptodev/rte_cryptodev.h
+++ b/lib/cryptodev/rte_cryptodev.h
@@ -918,7 +918,7 @@ struct rte_cryptodev_sym_session {
 	__extension__ struct {
 		void *data;
 		uint16_t refcnt;
-	} sess_data[0];
+	} sess_data[];
 	/**< Driver specific session material, variable size */
 };
 
diff --git a/lib/eventdev/rte_event_timer_adapter.h b/lib/eventdev/rte_event_timer_adapter.h
index 4c91e5516a..eab8e59a57 100644
--- a/lib/eventdev/rte_event_timer_adapter.h
+++ b/lib/eventdev/rte_event_timer_adapter.h
@@ -486,7 +486,7 @@ struct rte_event_timer {
 	 */
 	enum rte_event_timer_state state;
 	/**< State of the event timer. */
-	uint8_t user_meta[0];
+	uint8_t user_meta[];
 	/**< Memory to store user specific metadata.
 	 * The event timer adapter implementation should not modify this area.
 	 */
diff --git a/lib/ip_frag/ip_reassembly.h b/lib/ip_frag/ip_reassembly.h
index 416fb66dd4..ef9d8c0d75 100644
--- a/lib/ip_frag/ip_reassembly.h
+++ b/lib/ip_frag/ip_reassembly.h
@@ -83,7 +83,7 @@ struct rte_ip_frag_tbl {
 	struct ip_frag_pkt *last;     /* last used entry. */
 	struct ip_pkt_list lru;       /* LRU list for table entries. */
 	struct ip_frag_tbl_stat stat; /* statistics counters. */
-	__extension__ struct ip_frag_pkt pkt[0]; /* hash table. */
+	__extension__ struct ip_frag_pkt pkt[]; /* hash table. */
 };
 
 #endif /* _IP_REASSEMBLY_H_ */
diff --git a/lib/ipsec/sa.h b/lib/ipsec/sa.h
index 46f9a4df5b..ce4af8ceb2 100644
--- a/lib/ipsec/sa.h
+++ b/lib/ipsec/sa.h
@@ -59,7 +59,7 @@ union sym_op_data {
 struct replay_sqn {
 	rte_rwlock_t rwl;
 	uint64_t sqn;
-	__extension__ uint64_t window[0];
+	__extension__ uint64_t window[];
 };
 
 /*IPSEC SA supported algorithms */
diff --git a/lib/rib/rte_rib.c b/lib/rib/rte_rib.c
index f1fdddbbb4..b0794edf66 100644
--- a/lib/rib/rte_rib.c
+++ b/lib/rib/rte_rib.c
@@ -35,7 +35,7 @@ struct rte_rib_node {
 	uint8_t		depth;
 	uint8_t		flag;
 	uint64_t	nh;
-	__extension__ uint64_t	ext[0];
+	__extension__ uint64_t ext[];
 };
 
 struct rte_rib {
diff --git a/lib/rib/rte_rib6.c b/lib/rib/rte_rib6.c
index 650bf1b8f6..19e4ff97c4 100644
--- a/lib/rib/rte_rib6.c
+++ b/lib/rib/rte_rib6.c
@@ -34,7 +34,7 @@ struct rte_rib6_node {
 	uint8_t			ip[RTE_RIB6_IPV6_ADDR_SIZE];
 	uint8_t			depth;
 	uint8_t			flag;
-	__extension__ uint64_t		ext[0];
+	__extension__ uint64_t ext[];
 };
 
 struct rte_rib6 {
diff --git a/lib/table/rte_swx_table_learner.c b/lib/table/rte_swx_table_learner.c
index 222acfc962..f7f8e8aea9 100644
--- a/lib/table/rte_swx_table_learner.c
+++ b/lib/table/rte_swx_table_learner.c
@@ -252,7 +252,7 @@ struct table_bucket {
 	uint32_t sig[TABLE_KEYS_PER_BUCKET];
 	uint8_t key_timeout_id[TABLE_KEYS_PER_BUCKET];
 	uint8_t pad[TABLE_BUCKET_PAD_SIZE];
-	uint8_t key[0];
+	uint8_t key[];
 };
 
 struct table_params {
@@ -317,7 +317,7 @@ struct table {
 	uint8_t key_mask0[RTE_CACHE_LINE_SIZE];
 
 	/* Table buckets. */
-	uint8_t buckets[0];
+	uint8_t buckets[];
 } __rte_cache_aligned;
 
 /* The timeout (in cycles) is stored in the table as a 32-bit value by truncating its least
diff --git a/lib/table/rte_table_hash_key16.c b/lib/table/rte_table_hash_key16.c
index ea8195dc17..04d7fd64bd 100644
--- a/lib/table/rte_table_hash_key16.c
+++ b/lib/table/rte_table_hash_key16.c
@@ -43,7 +43,7 @@ struct rte_bucket_4_16 {
 	uint64_t key[4][2];
 
 	/* Cache line 2 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_16 {
@@ -58,7 +58,7 @@ struct rte_bucket_4_16 {
 	uint64_t key[4][2];
 
 	/* Cache line 2 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif
 
diff --git a/lib/table/rte_table_hash_key32.c b/lib/table/rte_table_hash_key32.c
index 87f83ce6f5..88d8f69c72 100644
--- a/lib/table/rte_table_hash_key32.c
+++ b/lib/table/rte_table_hash_key32.c
@@ -43,7 +43,7 @@ struct rte_bucket_4_32 {
 	uint64_t key[4][4];
 
 	/* Cache line 3 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_32 {
@@ -58,7 +58,7 @@ struct rte_bucket_4_32 {
 	uint64_t key[4][4];
 
 	/* Cache line 3 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif
 
diff --git a/lib/table/rte_table_hash_key8.c b/lib/table/rte_table_hash_key8.c
index 7779a9d1a3..035d242769 100644
--- a/lib/table/rte_table_hash_key8.c
+++ b/lib/table/rte_table_hash_key8.c
@@ -40,7 +40,7 @@ struct rte_bucket_4_8 {
 	uint64_t key[4];
 
 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_8 {
@@ -54,7 +54,7 @@ struct rte_bucket_4_8 {
 	uint64_t key[4];
 
 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif
 
diff --git a/lib/vhost/rte_vhost.h b/lib/vhost/rte_vhost.h
index c733f857c6..99be18ceef 100644
--- a/lib/vhost/rte_vhost.h
+++ b/lib/vhost/rte_vhost.h
@@ -154,7 +154,7 @@ struct rte_vhost_inflight_info_split {
 	uint16_t desc_num;
 	uint16_t last_inflight_io;
 	uint16_t used_idx;
-	struct rte_vhost_inflight_desc_split desc[0];
+	struct rte_vhost_inflight_desc_split desc[];
 };
 
 struct rte_vhost_inflight_desc_packed {
@@ -181,7 +181,7 @@ struct rte_vhost_inflight_info_packed {
 	uint8_t used_wrap_counter;
 	uint8_t old_used_wrap_counter;
 	uint8_t padding[7];
-	struct rte_vhost_inflight_desc_packed desc[0];
+	struct rte_vhost_inflight_desc_packed desc[];
 };
 
 struct rte_vhost_resubmit_desc {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 4/4] app: examples: replace zero-length arrays with undimensioned ones
  2022-06-02 16:13 ` [PATCH v2 " Bruce Richardson
                     ` (2 preceding siblings ...)
  2022-06-02 16:13   ` [PATCH v2 3/4] lib: " Bruce Richardson
@ 2022-06-02 16:13   ` Bruce Richardson
  2022-06-03  6:56   ` [PATCH v2 0/4] clean up zero-length arrays Hemant Agrawal
  4 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-02 16:13 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson, Morten Brørup, Stephen Hemminger

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test/test_table_tables.c   | 2 +-
 examples/ip_reassembly/main.c  | 2 +-
 examples/ptpclient/ptpclient.c | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/test/test_table_tables.c b/app/test/test_table_tables.c
index 010dd5a794..26908e6112 100644
--- a/app/test/test_table_tables.c
+++ b/app/test/test_table_tables.c
@@ -53,7 +53,7 @@ struct rte_bucket_4_8 {
 	uint64_t next_valid;
 	uint64_t key[4];
 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 
 #if RTE_TABLE_HASH_LRU_STRATEGY == 3
diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c
index 6e4c11c3c7..3ebf895aa0 100644
--- a/examples/ip_reassembly/main.c
+++ b/examples/ip_reassembly/main.c
@@ -126,7 +126,7 @@ struct mbuf_table {
 	uint32_t len;
 	uint32_t head;
 	uint32_t tail;
-	struct rte_mbuf *m_table[0];
+	struct rte_mbuf *m_table[];
 };
 
 struct rx_queue {
diff --git a/examples/ptpclient/ptpclient.c b/examples/ptpclient/ptpclient.c
index de799f698b..1f1c9c9c52 100644
--- a/examples/ptpclient/ptpclient.c
+++ b/examples/ptpclient/ptpclient.c
@@ -90,7 +90,7 @@ struct sync_msg {
 struct follow_up_msg {
 	struct ptp_header   hdr;
 	struct tstamp       precise_origin_tstamp;
-	uint8_t             suffix[0];
+	uint8_t             suffix[];
 } __rte_packed;
 
 struct delay_req_msg {
@@ -102,7 +102,7 @@ struct delay_resp_msg {
 	struct ptp_header    hdr;
 	struct tstamp        rx_tstamp;
 	struct port_id       req_port_id;
-	uint8_t              suffix[0];
+	uint8_t              suffix[];
 } __rte_packed;
 
 struct ptp_message {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* Re: [PATCH v2 0/4] clean up zero-length arrays
  2022-06-02 16:13 ` [PATCH v2 " Bruce Richardson
                     ` (3 preceding siblings ...)
  2022-06-02 16:13   ` [PATCH v2 4/4] app: examples: " Bruce Richardson
@ 2022-06-03  6:56   ` Hemant Agrawal
  4 siblings, 0 replies; 34+ messages in thread
From: Hemant Agrawal @ 2022-06-03  6:56 UTC (permalink / raw)
  To: Bruce Richardson, dev; +Cc: david.marchand

Series-

Acked-by:  Hemant Agrawal <hemant.agrawal@nxp.com>

On 6/2/2022 9:43 PM, Bruce Richardson wrote:
> This patchset adds a coccinelle script to clean-up zero-length
> arrays in structures. The final patches are the result of running
> that script on the DPDK repository.
>
> V2: rebased to fix apply conflict
>
> Bruce Richardson (4):
>    cocci: add script for zero-length arrays in structs
>    drivers: replace zero-length arrays with undimensioned ones
>    lib: replace zero-length arrays with undimensioned ones
>    app: examples: replace zero-length arrays with undimensioned ones
>
>   app/test/test_table_tables.c                  |  2 +-
>   devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++++++
>   drivers/bus/dpaa/include/netcfg.h             |  4 ++--
>   drivers/bus/vmbus/rte_vmbus_reg.h             |  4 ++--
>   drivers/common/cnxk/roc_se.h                  |  2 +-
>   drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
>   drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
>   drivers/common/mlx5/mlx5_prm.h                | 10 ++++-----
>   drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 ++--
>   drivers/crypto/virtio/virtio_ring.h           |  4 ++--
>   drivers/crypto/virtio/virtqueue.h             |  2 +-
>   drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
>   drivers/net/cxgbe/clip_tbl.h                  |  2 +-
>   drivers/net/cxgbe/l2t.h                       |  2 +-
>   drivers/net/cxgbe/mps_tcam.h                  |  2 +-
>   drivers/net/cxgbe/smt.h                       |  2 +-
>   drivers/net/enic/base/vnic_devcmd.h           |  2 +-
>   drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
>   drivers/net/mlx5/mlx5_tx.h                    |  2 +-
>   drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
>   drivers/net/virtio/virtio_ring.h              |  4 ++--
>   drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
>   drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
>   drivers/net/virtio/virtqueue.h                |  2 +-
>   drivers/regex/mlx5/mlx5_rxp.h                 |  4 ++--
>   examples/ip_reassembly/main.c                 |  2 +-
>   examples/ptpclient/ptpclient.c                |  4 ++--
>   lib/cryptodev/cryptodev_pmd.h                 |  2 +-
>   lib/cryptodev/rte_cryptodev.h                 |  2 +-
>   lib/eventdev/rte_event_timer_adapter.h        |  2 +-
>   lib/ip_frag/ip_reassembly.h                   |  2 +-
>   lib/ipsec/sa.h                                |  2 +-
>   lib/rib/rte_rib.c                             |  2 +-
>   lib/rib/rte_rib6.c                            |  2 +-
>   lib/table/rte_swx_table_learner.c             |  4 ++--
>   lib/table/rte_table_hash_key16.c              |  4 ++--
>   lib/table/rte_table_hash_key32.c              |  4 ++--
>   lib/table/rte_table_hash_key8.c               |  4 ++--
>   lib/vhost/rte_vhost.h                         |  4 ++--
>   39 files changed, 75 insertions(+), 54 deletions(-)
>   create mode 100644 devtools/cocci/zero_length_array.cocci
>
> --
> 2.34.1
>

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v2 2/4] drivers: replace zero-length arrays with undimensioned ones
  2022-06-02 16:13   ` [PATCH v2 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
@ 2022-06-03  7:19     ` David Marchand
  2022-06-03  7:36       ` Bruce Richardson
  2022-06-03  9:18       ` Bruce Richardson
  0 siblings, 2 replies; 34+ messages in thread
From: David Marchand @ 2022-06-03  7:19 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, Morten Brørup, Stephen Hemminger

Hello Bruce,

On Thu, Jun 2, 2022 at 6:14 PM Bruce Richardson
<bruce.richardson@intel.com> wrote:
> diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h
> index bc3e70a1d1..ed0781a560 100644
> --- a/drivers/common/mlx5/mlx5_prm.h
> +++ b/drivers/common/mlx5/mlx5_prm.h
> @@ -560,7 +560,7 @@ struct mlx5_umr_wqe {
>  struct mlx5_rdma_write_wqe {
>         struct mlx5_wqe_cseg ctr;
>         struct mlx5_wqe_rseg rseg;
> -       struct mlx5_wqe_dseg dseg[0];
> +       struct mlx5_wqe_dseg dseg[];
>  } __rte_packed;
>
>  #ifdef PEDANTIC
> @@ -3479,7 +3479,7 @@ struct mlx5_ifc_qpc_pas_list_bits {
>  #endif
>  struct mlx5_ifc_qpc_extension_and_pas_list_bits {
>         struct mlx5_ifc_qpc_extension_bits qpc_data_extension;
> -       u8 pas[0][0x40];
> +       u8[0x40] pas[];

Gcc and clang seem to agree they disagree with coccinelle.
clang suggests using u8 pas[][0x40].


-- 
David Marchand


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v2 2/4] drivers: replace zero-length arrays with undimensioned ones
  2022-06-03  7:19     ` David Marchand
@ 2022-06-03  7:36       ` Bruce Richardson
  2022-06-03  9:18       ` Bruce Richardson
  1 sibling, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03  7:36 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, Morten Brørup, Stephen Hemminger

On Fri, Jun 03, 2022 at 09:19:35AM +0200, David Marchand wrote:
> Hello Bruce,
> 
> On Thu, Jun 2, 2022 at 6:14 PM Bruce Richardson
> <bruce.richardson@intel.com> wrote:
> > diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h
> > index bc3e70a1d1..ed0781a560 100644
> > --- a/drivers/common/mlx5/mlx5_prm.h
> > +++ b/drivers/common/mlx5/mlx5_prm.h
> > @@ -560,7 +560,7 @@ struct mlx5_umr_wqe {
> >  struct mlx5_rdma_write_wqe {
> >         struct mlx5_wqe_cseg ctr;
> >         struct mlx5_wqe_rseg rseg;
> > -       struct mlx5_wqe_dseg dseg[0];
> > +       struct mlx5_wqe_dseg dseg[];
> >  } __rte_packed;
> >
> >  #ifdef PEDANTIC
> > @@ -3479,7 +3479,7 @@ struct mlx5_ifc_qpc_pas_list_bits {
> >  #endif
> >  struct mlx5_ifc_qpc_extension_and_pas_list_bits {
> >         struct mlx5_ifc_qpc_extension_bits qpc_data_extension;
> > -       u8 pas[0][0x40];
> > +       u8[0x40] pas[];
> 
> Gcc and clang seem to agree they disagree with coccinelle.
> clang suggests using u8 pas[][0x40].
> 

Will fix in v3.

> 
> -- 
> David Marchand
> 

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v2 2/4] drivers: replace zero-length arrays with undimensioned ones
  2022-06-03  7:19     ` David Marchand
  2022-06-03  7:36       ` Bruce Richardson
@ 2022-06-03  9:18       ` Bruce Richardson
  1 sibling, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03  9:18 UTC (permalink / raw)
  To: David Marchand; +Cc: dev, Morten Brørup, Stephen Hemminger

On Fri, Jun 03, 2022 at 09:19:35AM +0200, David Marchand wrote:
> Hello Bruce,
> 
> On Thu, Jun 2, 2022 at 6:14 PM Bruce Richardson
> <bruce.richardson@intel.com> wrote:
> > diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h
> > index bc3e70a1d1..ed0781a560 100644
> > --- a/drivers/common/mlx5/mlx5_prm.h
> > +++ b/drivers/common/mlx5/mlx5_prm.h
> > @@ -560,7 +560,7 @@ struct mlx5_umr_wqe {
> >  struct mlx5_rdma_write_wqe {
> >         struct mlx5_wqe_cseg ctr;
> >         struct mlx5_wqe_rseg rseg;
> > -       struct mlx5_wqe_dseg dseg[0];
> > +       struct mlx5_wqe_dseg dseg[];
> >  } __rte_packed;
> >
> >  #ifdef PEDANTIC
> > @@ -3479,7 +3479,7 @@ struct mlx5_ifc_qpc_pas_list_bits {
> >  #endif
> >  struct mlx5_ifc_qpc_extension_and_pas_list_bits {
> >         struct mlx5_ifc_qpc_extension_bits qpc_data_extension;
> > -       u8 pas[0][0x40];
> > +       u8[0x40] pas[];
> 
> Gcc and clang seem to agree they disagree with coccinelle.
> clang suggests using u8 pas[][0x40].
> 

Changing this as suggested gives further errors in builds (now that I have
the correct dependencies for the mlx5 driver installed on my system!)

In file included from ../../drivers/net/mlx5/mlx5_tx_empw.c:6:
../../drivers/net/mlx5/mlx5_tx.h:187:30: error: invalid use of structure with flexible array member [-Werror=pedantic]
  187 |         struct mlx5_txq_data txq; /* Data path structure. */
      |                              ^~~
cc1: all warnings being treated as errors

Therefore, I'll just drop the cleanup of these structures from V3.

/Bruce

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [PATCH v3 0/4] clean up zero-length arrays
  2022-06-02 15:08 [PATCH 0/4] clean up zero-length arrays Bruce Richardson
                   ` (6 preceding siblings ...)
  2022-06-02 16:13 ` [PATCH v2 " Bruce Richardson
@ 2022-06-03 10:13 ` Bruce Richardson
  2022-06-03 10:13   ` [PATCH v3 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
                     ` (4 more replies)
  2022-06-03 11:16 ` [PATCH v4 " Bruce Richardson
  2022-06-08 15:23 ` [PATCH " Stephen Hemminger
  9 siblings, 5 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 10:13 UTC (permalink / raw)
  To: dev; +Cc: david.marchand, Bruce Richardson

This patchset adds a coccinelle script to clean-up zero-length
arrays in structures. The final patches are the result of running
that script on the DPDK repository.

V3: Fixed issues in mlx5 drivers:
  * fixed incorrect coccinelle replacement of 2-D zero-length arrays
  * undid removal of "0" in tx elts[] which caused issues with Werror-pedantic

V2: rebased to fix apply conflict

Bruce Richardson (4):
  cocci: add script for zero-length arrays in structs
  drivers: replace zero-length arrays with undimensioned ones
  lib: replace zero-length arrays with undimensioned ones
  app: examples: replace zero-length arrays with undimensioned ones

 app/test/test_table_tables.c                  |  2 +-
 devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++++++
 drivers/bus/dpaa/include/netcfg.h             |  4 ++--
 drivers/bus/vmbus/rte_vmbus_reg.h             |  4 ++--
 drivers/common/cnxk/roc_se.h                  |  2 +-
 drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
 drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
 drivers/common/mlx5/mlx5_prm.h                | 10 ++++-----
 drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 ++--
 drivers/crypto/virtio/virtio_ring.h           |  4 ++--
 drivers/crypto/virtio/virtqueue.h             |  2 +-
 drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
 drivers/net/cxgbe/clip_tbl.h                  |  2 +-
 drivers/net/cxgbe/l2t.h                       |  2 +-
 drivers/net/cxgbe/mps_tcam.h                  |  2 +-
 drivers/net/cxgbe/smt.h                       |  2 +-
 drivers/net/enic/base/vnic_devcmd.h           |  2 +-
 drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
 drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
 drivers/net/virtio/virtio_ring.h              |  4 ++--
 drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
 drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
 drivers/net/virtio/virtqueue.h                |  2 +-
 drivers/regex/mlx5/mlx5_rxp.h                 |  4 ++--
 examples/ip_reassembly/main.c                 |  2 +-
 examples/ptpclient/ptpclient.c                |  4 ++--
 lib/cryptodev/cryptodev_pmd.h                 |  2 +-
 lib/cryptodev/rte_cryptodev.h                 |  2 +-
 lib/eventdev/rte_event_timer_adapter.h        |  2 +-
 lib/ip_frag/ip_reassembly.h                   |  2 +-
 lib/ipsec/sa.h                                |  2 +-
 lib/rib/rte_rib.c                             |  2 +-
 lib/rib/rte_rib6.c                            |  2 +-
 lib/table/rte_swx_table_learner.c             |  4 ++--
 lib/table/rte_table_hash_key16.c              |  4 ++--
 lib/table/rte_table_hash_key32.c              |  4 ++--
 lib/table/rte_table_hash_key8.c               |  4 ++--
 lib/vhost/rte_vhost.h                         |  4 ++--
 38 files changed, 74 insertions(+), 53 deletions(-)
 create mode 100644 devtools/cocci/zero_length_array.cocci

--
2.34.1


^ permalink raw reply	[flat|nested] 34+ messages in thread

* [PATCH v3 1/4] cocci: add script for zero-length arrays in structs
  2022-06-03 10:13 ` [PATCH v3 " Bruce Richardson
@ 2022-06-03 10:13   ` Bruce Richardson
  2022-06-03 10:30     ` Morten Brørup
  2022-06-03 10:13   ` [PATCH v3 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
                     ` (3 subsequent siblings)
  4 siblings, 1 reply; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 10:13 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson, Morten Brørup,
	Stephen Hemminger, Hemant Agrawal

Add script to replace [0] with [] when used at the end of a struct.
The script also includes an additional struct member to match against so
as to avoid issues with arrays with only a single zero-length element.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 devtools/cocci/zero_length_array.cocci | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 devtools/cocci/zero_length_array.cocci

diff --git a/devtools/cocci/zero_length_array.cocci b/devtools/cocci/zero_length_array.cocci
new file mode 100644
index 0000000000..de8783bc7a
--- /dev/null
+++ b/devtools/cocci/zero_length_array.cocci
@@ -0,0 +1,21 @@
+// Replace zero-length array members with []
+@@
+identifier st, member, arr;
+type T1, T2;
+@@
+struct st {
+	...
+	T1 member;
+-	T2 arr[0];
++	T2 arr[];
+};
+@@
+identifier st, member, arr, id;
+type T1, T2;
+@@
+struct st {
+	...
+	T1 member;
+-	T2 arr[0];
++	T2 arr[];
+} id;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v3 2/4] drivers: replace zero-length arrays with undimensioned ones
  2022-06-03 10:13 ` [PATCH v3 " Bruce Richardson
  2022-06-03 10:13   ` [PATCH v3 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
@ 2022-06-03 10:13   ` Bruce Richardson
  2022-06-03 10:13   ` [PATCH v3 3/4] lib: " Bruce Richardson
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 10:13 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson,
	Morten Brørup,
	Stephen Hemminger, Hemant Agrawal

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
V3: Fixed issues in mlx5 drivers:
  * fixed incorrect coccinelle replacement of 2-D zero-length arrays
  * undid removal of "0" in tx elts[] which caused issues with Werror-pedantic

 drivers/bus/dpaa/include/netcfg.h             |  4 ++--
 drivers/bus/vmbus/rte_vmbus_reg.h             |  4 ++--
 drivers/common/cnxk/roc_se.h                  |  2 +-
 drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
 drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
 drivers/common/mlx5/mlx5_prm.h                | 10 +++++-----
 drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 ++--
 drivers/crypto/virtio/virtio_ring.h           |  4 ++--
 drivers/crypto/virtio/virtqueue.h             |  2 +-
 drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
 drivers/net/cxgbe/clip_tbl.h                  |  2 +-
 drivers/net/cxgbe/l2t.h                       |  2 +-
 drivers/net/cxgbe/mps_tcam.h                  |  2 +-
 drivers/net/cxgbe/smt.h                       |  2 +-
 drivers/net/enic/base/vnic_devcmd.h           |  2 +-
 drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
 drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
 drivers/net/virtio/virtio_ring.h              |  4 ++--
 drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
 drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
 drivers/net/virtio/virtqueue.h                |  2 +-
 drivers/regex/mlx5/mlx5_rxp.h                 |  4 ++--
 22 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/drivers/bus/dpaa/include/netcfg.h b/drivers/bus/dpaa/include/netcfg.h
index bb18a34e3d..43c7e1cfe1 100644
--- a/drivers/bus/dpaa/include/netcfg.h
+++ b/drivers/bus/dpaa/include/netcfg.h
@@ -23,7 +23,7 @@ struct fm_eth_port_cfg {
 struct netcfg_info {
 	uint8_t num_ethports;
 	/**< Number of ports */
-	struct fm_eth_port_cfg port_cfg[0];
+	struct fm_eth_port_cfg port_cfg[];
 	/**< Variable structure array of size num_ethports */
 };

@@ -38,7 +38,7 @@ struct interface_info {
 struct netcfg_interface {
 	uint8_t numof_netcfg_interface;
 	uint8_t numof_fman_enabled_macless;
-	struct interface_info interface_info[0];
+	struct interface_info interface_info[];
 };

 /* pcd_file: FMC netpcd XML ("policy") file, that contains PCD information.
diff --git a/drivers/bus/vmbus/rte_vmbus_reg.h b/drivers/bus/vmbus/rte_vmbus_reg.h
index 8562672979..a17ce40763 100644
--- a/drivers/bus/vmbus/rte_vmbus_reg.h
+++ b/drivers/bus/vmbus/rte_vmbus_reg.h
@@ -107,7 +107,7 @@ struct vmbus_bufring {
 	 * Ring data starts here + RingDataStartOffset
 	 * !!! DO NOT place any fields below this !!!
 	 */
-	uint8_t data[0];
+	uint8_t data[];
 } __rte_packed;

 /*
@@ -140,7 +140,7 @@ vmbus_chanpkt_getlen(uint16_t pktlen)
 struct vmbus_gpa_range {
 	uint32_t       len;
 	uint32_t       ofs;
-	uint64_t       page[0];
+	uint64_t       page[];
 } __rte_packed;

 /* This is actually vmbus_gpa_range.gpa_page[1] */
diff --git a/drivers/common/cnxk/roc_se.h b/drivers/common/cnxk/roc_se.h
index 145a1825bd..a1d476a86d 100644
--- a/drivers/common/cnxk/roc_se.h
+++ b/drivers/common/cnxk/roc_se.h
@@ -246,7 +246,7 @@ struct roc_se_buf_ptr {
 /* IOV Pointer */
 struct roc_se_iov_ptr {
 	int buf_cnt;
-	struct roc_se_buf_ptr bufs[0];
+	struct roc_se_buf_ptr bufs[];
 };

 struct roc_se_fc_params {
diff --git a/drivers/common/dpaax/caamflib/desc/ipsec.h b/drivers/common/dpaax/caamflib/desc/ipsec.h
index 8ec6aac915..2c9080a1b5 100644
--- a/drivers/common/dpaax/caamflib/desc/ipsec.h
+++ b/drivers/common/dpaax/caamflib/desc/ipsec.h
@@ -350,7 +350,7 @@ struct ipsec_encap_pdb {
 	};
 	uint32_t spi;
 	uint32_t ip_hdr_len;
-	uint8_t ip_hdr[0];
+	uint8_t ip_hdr[];
 };

 static inline unsigned int
diff --git a/drivers/common/dpaax/dpaax_iova_table.h b/drivers/common/dpaax/dpaax_iova_table.h
index b1f2300c52..9a18eafca0 100644
--- a/drivers/common/dpaax/dpaax_iova_table.h
+++ b/drivers/common/dpaax/dpaax_iova_table.h
@@ -32,7 +32,7 @@ struct dpaax_iovat_element {

 struct dpaax_iova_table {
 	unsigned int count; /**< No. of blocks of contiguous physical pages */
-	struct dpaax_iovat_element entries[0];
+	struct dpaax_iovat_element entries[];
 };

 /* Pointer to the table, which is common for DPAA/DPAA2 and only a single
diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h
index bc3e70a1d1..654e5f44ee 100644
--- a/drivers/common/mlx5/mlx5_prm.h
+++ b/drivers/common/mlx5/mlx5_prm.h
@@ -560,7 +560,7 @@ struct mlx5_umr_wqe {
 struct mlx5_rdma_write_wqe {
 	struct mlx5_wqe_cseg ctr;
 	struct mlx5_wqe_rseg rseg;
-	struct mlx5_wqe_dseg dseg[0];
+	struct mlx5_wqe_dseg dseg[];
 } __rte_packed;

 #ifdef PEDANTIC
@@ -3479,7 +3479,7 @@ struct mlx5_ifc_qpc_pas_list_bits {
 #endif
 struct mlx5_ifc_qpc_extension_and_pas_list_bits {
 	struct mlx5_ifc_qpc_extension_bits qpc_data_extension;
-	u8 pas[0][0x40];
+	u8 pas[][0x40];
 };


@@ -3703,7 +3703,7 @@ struct mlx5_ifc_query_qp_out_bits {
 	u8 reserved_at_a0[0x20];
 	struct mlx5_ifc_qpc_bits qpc;
 	u8 reserved_at_800[0x80];
-	u8 pas[0][0x40];
+	u8 pas[][0x40];
 };
 #ifdef PEDANTIC
 #pragma GCC diagnostic error "-Wpedantic"
@@ -3743,7 +3743,7 @@ struct mlx5_ifc_access_register_out_bits {
 	u8 reserved_at_8[0x18];
 	u8 syndrome[0x20];
 	u8 reserved_at_40[0x40];
-	u8 register_data[0][0x20];
+	u8 register_data[][0x20];
 };

 struct mlx5_ifc_access_register_in_bits {
@@ -3754,7 +3754,7 @@ struct mlx5_ifc_access_register_in_bits {
 	u8 reserved_at_40[0x10];
 	u8 register_id[0x10];
 	u8 argument[0x20];
-	u8 register_data[0][0x20];
+	u8 register_data[][0x20];
 };
 #ifdef PEDANTIC
 #pragma GCC diagnostic error "-Wpedantic"
diff --git a/drivers/crypto/ipsec_mb/ipsec_mb_private.h b/drivers/crypto/ipsec_mb/ipsec_mb_private.h
index e53101acf1..e2c240dfc0 100644
--- a/drivers/crypto/ipsec_mb/ipsec_mb_private.h
+++ b/drivers/crypto/ipsec_mb/ipsec_mb_private.h
@@ -120,7 +120,7 @@ struct ipsec_mb_dev_private {
 	/**< PMD  type */
 	uint32_t max_nb_queue_pairs;
 	/**< Max number of queue pairs supported by device */
-	__extension__ uint8_t priv[0];
+	__extension__ uint8_t priv[];
 };

 /** IPSEC Multi buffer queue pair common queue pair data for all PMDs */
@@ -147,7 +147,7 @@ struct ipsec_mb_qp {
 	/* Multi buffer manager */
 	const struct rte_memzone *mb_mgr_mz;
 	/* Shared memzone for storing mb_mgr */
-	__extension__ uint8_t additional_data[0];
+	__extension__ uint8_t additional_data[];
 	/**< Storing PMD specific additional data */
 };

diff --git a/drivers/crypto/virtio/virtio_ring.h b/drivers/crypto/virtio/virtio_ring.h
index ee30674566..55839279fd 100644
--- a/drivers/crypto/virtio/virtio_ring.h
+++ b/drivers/crypto/virtio/virtio_ring.h
@@ -40,7 +40,7 @@ struct vring_desc {
 struct vring_avail {
 	uint16_t flags;
 	uint16_t idx;
-	uint16_t ring[0];
+	uint16_t ring[];
 };

 /* id is a 16bit index. uint32_t is used here for ids for padding reasons. */
@@ -54,7 +54,7 @@ struct vring_used_elem {
 struct vring_used {
 	uint16_t flags;
 	volatile uint16_t idx;
-	struct vring_used_elem ring[0];
+	struct vring_used_elem ring[];
 };

 struct vring {
diff --git a/drivers/crypto/virtio/virtqueue.h b/drivers/crypto/virtio/virtqueue.h
index c96ca62992..cb08bea94f 100644
--- a/drivers/crypto/virtio/virtqueue.h
+++ b/drivers/crypto/virtio/virtqueue.h
@@ -88,7 +88,7 @@ struct virtqueue {

 	uint16_t  *notify_addr;

-	struct vq_desc_extra vq_descx[0];
+	struct vq_desc_extra vq_descx[];
 };

 /**
diff --git a/drivers/net/atlantic/hw_atl/hw_atl_utils.h b/drivers/net/atlantic/hw_atl/hw_atl_utils.h
index d8fab010cf..12ac9b041e 100644
--- a/drivers/net/atlantic/hw_atl/hw_atl_utils.h
+++ b/drivers/net/atlantic/hw_atl/hw_atl_utils.h
@@ -334,7 +334,7 @@ struct offload_info {
 	struct offload_port_info ports;
 	struct offload_ka_info kas;
 	struct offload_rr_info rrs;
-	u8 buf[0];
+	u8 buf[];
 } __rte_packed;

 struct smbus_request {
diff --git a/drivers/net/cxgbe/clip_tbl.h b/drivers/net/cxgbe/clip_tbl.h
index d7689f4b7a..3b2be6645f 100644
--- a/drivers/net/cxgbe/clip_tbl.h
+++ b/drivers/net/cxgbe/clip_tbl.h
@@ -20,7 +20,7 @@ struct clip_tbl {
 	unsigned int clipt_start;     /* start index of CLIP table */
 	unsigned int clipt_size;      /* size of CLIP table */
 	rte_rwlock_t lock;            /* table rw lock */
-	struct clip_entry cl_list[0]; /* MUST BE LAST */
+	struct clip_entry cl_list[]; /* MUST BE LAST */
 };

 struct clip_tbl *t4_init_clip_tbl(unsigned int clipt_start,
diff --git a/drivers/net/cxgbe/l2t.h b/drivers/net/cxgbe/l2t.h
index 9845c9f981..e4c0ebedec 100644
--- a/drivers/net/cxgbe/l2t.h
+++ b/drivers/net/cxgbe/l2t.h
@@ -37,7 +37,7 @@ struct l2t_data {
 	unsigned int l2t_start;     /* start index of our piece of the L2T */
 	unsigned int l2t_size;      /* number of entries in l2tab */
 	rte_rwlock_t lock;          /* table rw lock */
-	struct l2t_entry l2tab[0];  /* MUST BE LAST */
+	struct l2t_entry l2tab[];  /* MUST BE LAST */
 };

 #define L2T_LPBK	true
diff --git a/drivers/net/cxgbe/mps_tcam.h b/drivers/net/cxgbe/mps_tcam.h
index a359f52442..363786bd38 100644
--- a/drivers/net/cxgbe/mps_tcam.h
+++ b/drivers/net/cxgbe/mps_tcam.h
@@ -41,7 +41,7 @@ struct mpstcam_table {
 			 * free_idx cannot alone determine
 			 * if the table is full
 			 */
-	struct mps_tcam_entry entry[0];
+	struct mps_tcam_entry entry[];
 };

 struct mpstcam_table *t4_init_mpstcam(struct adapter *adap);
diff --git a/drivers/net/cxgbe/smt.h b/drivers/net/cxgbe/smt.h
index a70e3a2085..531810e695 100644
--- a/drivers/net/cxgbe/smt.h
+++ b/drivers/net/cxgbe/smt.h
@@ -31,7 +31,7 @@ struct smt_data {
 	unsigned int smt_size;
 	unsigned int smt_start;
 	rte_rwlock_t lock;
-	struct smt_entry smtab[0];
+	struct smt_entry smtab[];
 };

 struct smt_data *t4_init_smt(u32 smt_start_idx, u32 smt_size);
diff --git a/drivers/net/enic/base/vnic_devcmd.h b/drivers/net/enic/base/vnic_devcmd.h
index 3157bc8cb5..253a791c3f 100644
--- a/drivers/net/enic/base/vnic_devcmd.h
+++ b/drivers/net/enic/base/vnic_devcmd.h
@@ -997,7 +997,7 @@ enum {
 struct filter_tlv {
 	uint32_t type;
 	uint32_t length;
-	uint32_t val[0];
+	uint32_t val[];
 };

 /* Data for CMD_ADD_FILTER is 2 TLV and filter + action structs */
diff --git a/drivers/net/hinic/hinic_pmd_tx.h b/drivers/net/hinic/hinic_pmd_tx.h
index a3ec6299fb..152f7abc53 100644
--- a/drivers/net/hinic/hinic_pmd_tx.h
+++ b/drivers/net/hinic/hinic_pmd_tx.h
@@ -81,7 +81,7 @@ struct hinic_sq_wqe {
 	struct hinic_sq_task		task;

 	/* sq sge section start address, 1~127 sges */
-	struct hinic_sq_bufdesc     buf_descs[0];
+	struct hinic_sq_bufdesc     buf_descs[];
 };

 struct hinic_txq_stats {
diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.h b/drivers/net/nfp/nfpcore/nfp_nsp.h
index e74cdeb191..2184c15b4c 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.h
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.h
@@ -224,7 +224,7 @@ struct nfp_eth_table {
 		int is_split;

 		unsigned int fec_modes_supported;
-	} ports[0];
+	} ports[];
 };

 struct nfp_eth_table *nfp_eth_read_ports(struct nfp_cpp *cpp);
diff --git a/drivers/net/virtio/virtio_ring.h b/drivers/net/virtio/virtio_ring.h
index 17a56b0a73..e848c0b73b 100644
--- a/drivers/net/virtio/virtio_ring.h
+++ b/drivers/net/virtio/virtio_ring.h
@@ -46,7 +46,7 @@ struct vring_desc {
 struct vring_avail {
 	uint16_t flags;
 	uint16_t idx;
-	uint16_t ring[0];
+	uint16_t ring[];
 };

 /* id is a 16bit index. uint32_t is used here for ids for padding reasons. */
@@ -60,7 +60,7 @@ struct vring_used_elem {
 struct vring_used {
 	uint16_t flags;
 	uint16_t idx;
-	struct vring_used_elem ring[0];
+	struct vring_used_elem ring[];
 };

 /* For support of packed virtqueues in Virtio 1.1 the format of descriptors
diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c
index 986b56a7ca..1aed08b2bd 100644
--- a/drivers/net/virtio/virtio_user/vhost_kernel.c
+++ b/drivers/net/virtio/virtio_user/vhost_kernel.c
@@ -22,7 +22,7 @@ struct vhost_kernel_data {
 struct vhost_memory_kernel {
 	uint32_t nregions;
 	uint32_t padding;
-	struct vhost_memory_region regions[0];
+	struct vhost_memory_region regions[];
 };

 /* vhost kernel ioctls */
diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c
index 82f25a8674..bd13fe44b4 100644
--- a/drivers/net/virtio/virtio_user/vhost_vdpa.c
+++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c
@@ -70,7 +70,7 @@ struct vhost_iotlb_msg {
 struct vhost_vdpa_config {
 	uint32_t off;
 	uint32_t len;
-	uint8_t buf[0];
+	uint8_t buf[];
 };

 struct vhost_msg {
diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
index 99c68cf622..d100ed8762 100644
--- a/drivers/net/virtio/virtqueue.h
+++ b/drivers/net/virtio/virtqueue.h
@@ -309,7 +309,7 @@ struct virtqueue {

 	uint16_t  *notify_addr;
 	struct rte_mbuf **sw_ring;  /**< RX software ring. */
-	struct vq_desc_extra vq_descx[0];
+	struct vq_desc_extra vq_descx[];
 };

 /* If multiqueue is provided by host, then we support it. */
diff --git a/drivers/regex/mlx5/mlx5_rxp.h b/drivers/regex/mlx5/mlx5_rxp.h
index 315e3b4ca3..eddc577d79 100644
--- a/drivers/regex/mlx5/mlx5_rxp.h
+++ b/drivers/regex/mlx5/mlx5_rxp.h
@@ -64,7 +64,7 @@ struct mlx5_rxp_match_tuple {

 struct mlx5_rxp_response {
 	struct mlx5_rxp_response_desc header;
-	struct mlx5_rxp_match_tuple matches[0];
+	struct mlx5_rxp_match_tuple matches[];
 };

 #define MLX5_RXP_MAX_MATCHES 254
@@ -114,7 +114,7 @@ struct mlx5_rxp_rof {
 struct mlx5_rxp_ctl_rules_pgm {
 	struct mlx5_rxp_ctl_hdr hdr;
 	uint32_t count;
-	struct mlx5_rxp_rof_entry rules[0];
+	struct mlx5_rxp_rof_entry rules[];
 } __rte_packed;

 /* RXP programming mode setting. */
--
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v3 3/4] lib: replace zero-length arrays with undimensioned ones
  2022-06-03 10:13 ` [PATCH v3 " Bruce Richardson
  2022-06-03 10:13   ` [PATCH v3 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
  2022-06-03 10:13   ` [PATCH v3 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
@ 2022-06-03 10:13   ` Bruce Richardson
  2022-06-03 10:13   ` [PATCH v3 4/4] app: examples: " Bruce Richardson
  2022-06-03 11:13   ` [PATCH v3 0/4] clean up zero-length arrays Bruce Richardson
  4 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 10:13 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson, Morten Brørup,
	Stephen Hemminger, Hemant Agrawal

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 lib/cryptodev/cryptodev_pmd.h          | 2 +-
 lib/cryptodev/rte_cryptodev.h          | 2 +-
 lib/eventdev/rte_event_timer_adapter.h | 2 +-
 lib/ip_frag/ip_reassembly.h            | 2 +-
 lib/ipsec/sa.h                         | 2 +-
 lib/rib/rte_rib.c                      | 2 +-
 lib/rib/rte_rib6.c                     | 2 +-
 lib/table/rte_swx_table_learner.c      | 4 ++--
 lib/table/rte_table_hash_key16.c       | 4 ++--
 lib/table/rte_table_hash_key32.c       | 4 ++--
 lib/table/rte_table_hash_key8.c        | 4 ++--
 lib/vhost/rte_vhost.h                  | 4 ++--
 12 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/lib/cryptodev/cryptodev_pmd.h b/lib/cryptodev/cryptodev_pmd.h
index 7a7d3ee3f1..3dcc3cb7ed 100644
--- a/lib/cryptodev/cryptodev_pmd.h
+++ b/lib/cryptodev/cryptodev_pmd.h
@@ -673,7 +673,7 @@ RTE_STD_C11 struct rte_cryptodev_asym_session {
 	uint8_t padding[3];
 	void *event_mdata;
 	/**< Event metadata (aka *union rte_event_crypto_metadata*) */
-	uint8_t sess_private_data[0];
+	uint8_t sess_private_data[];
 };
 
 #ifdef __cplusplus
diff --git a/lib/cryptodev/rte_cryptodev.h b/lib/cryptodev/rte_cryptodev.h
index 585cee2727..56f459c6a0 100644
--- a/lib/cryptodev/rte_cryptodev.h
+++ b/lib/cryptodev/rte_cryptodev.h
@@ -918,7 +918,7 @@ struct rte_cryptodev_sym_session {
 	__extension__ struct {
 		void *data;
 		uint16_t refcnt;
-	} sess_data[0];
+	} sess_data[];
 	/**< Driver specific session material, variable size */
 };
 
diff --git a/lib/eventdev/rte_event_timer_adapter.h b/lib/eventdev/rte_event_timer_adapter.h
index 4c91e5516a..eab8e59a57 100644
--- a/lib/eventdev/rte_event_timer_adapter.h
+++ b/lib/eventdev/rte_event_timer_adapter.h
@@ -486,7 +486,7 @@ struct rte_event_timer {
 	 */
 	enum rte_event_timer_state state;
 	/**< State of the event timer. */
-	uint8_t user_meta[0];
+	uint8_t user_meta[];
 	/**< Memory to store user specific metadata.
 	 * The event timer adapter implementation should not modify this area.
 	 */
diff --git a/lib/ip_frag/ip_reassembly.h b/lib/ip_frag/ip_reassembly.h
index 416fb66dd4..ef9d8c0d75 100644
--- a/lib/ip_frag/ip_reassembly.h
+++ b/lib/ip_frag/ip_reassembly.h
@@ -83,7 +83,7 @@ struct rte_ip_frag_tbl {
 	struct ip_frag_pkt *last;     /* last used entry. */
 	struct ip_pkt_list lru;       /* LRU list for table entries. */
 	struct ip_frag_tbl_stat stat; /* statistics counters. */
-	__extension__ struct ip_frag_pkt pkt[0]; /* hash table. */
+	__extension__ struct ip_frag_pkt pkt[]; /* hash table. */
 };
 
 #endif /* _IP_REASSEMBLY_H_ */
diff --git a/lib/ipsec/sa.h b/lib/ipsec/sa.h
index 46f9a4df5b..ce4af8ceb2 100644
--- a/lib/ipsec/sa.h
+++ b/lib/ipsec/sa.h
@@ -59,7 +59,7 @@ union sym_op_data {
 struct replay_sqn {
 	rte_rwlock_t rwl;
 	uint64_t sqn;
-	__extension__ uint64_t window[0];
+	__extension__ uint64_t window[];
 };
 
 /*IPSEC SA supported algorithms */
diff --git a/lib/rib/rte_rib.c b/lib/rib/rte_rib.c
index f1fdddbbb4..b0794edf66 100644
--- a/lib/rib/rte_rib.c
+++ b/lib/rib/rte_rib.c
@@ -35,7 +35,7 @@ struct rte_rib_node {
 	uint8_t		depth;
 	uint8_t		flag;
 	uint64_t	nh;
-	__extension__ uint64_t	ext[0];
+	__extension__ uint64_t ext[];
 };
 
 struct rte_rib {
diff --git a/lib/rib/rte_rib6.c b/lib/rib/rte_rib6.c
index 650bf1b8f6..19e4ff97c4 100644
--- a/lib/rib/rte_rib6.c
+++ b/lib/rib/rte_rib6.c
@@ -34,7 +34,7 @@ struct rte_rib6_node {
 	uint8_t			ip[RTE_RIB6_IPV6_ADDR_SIZE];
 	uint8_t			depth;
 	uint8_t			flag;
-	__extension__ uint64_t		ext[0];
+	__extension__ uint64_t ext[];
 };
 
 struct rte_rib6 {
diff --git a/lib/table/rte_swx_table_learner.c b/lib/table/rte_swx_table_learner.c
index 222acfc962..f7f8e8aea9 100644
--- a/lib/table/rte_swx_table_learner.c
+++ b/lib/table/rte_swx_table_learner.c
@@ -252,7 +252,7 @@ struct table_bucket {
 	uint32_t sig[TABLE_KEYS_PER_BUCKET];
 	uint8_t key_timeout_id[TABLE_KEYS_PER_BUCKET];
 	uint8_t pad[TABLE_BUCKET_PAD_SIZE];
-	uint8_t key[0];
+	uint8_t key[];
 };
 
 struct table_params {
@@ -317,7 +317,7 @@ struct table {
 	uint8_t key_mask0[RTE_CACHE_LINE_SIZE];
 
 	/* Table buckets. */
-	uint8_t buckets[0];
+	uint8_t buckets[];
 } __rte_cache_aligned;
 
 /* The timeout (in cycles) is stored in the table as a 32-bit value by truncating its least
diff --git a/lib/table/rte_table_hash_key16.c b/lib/table/rte_table_hash_key16.c
index ea8195dc17..04d7fd64bd 100644
--- a/lib/table/rte_table_hash_key16.c
+++ b/lib/table/rte_table_hash_key16.c
@@ -43,7 +43,7 @@ struct rte_bucket_4_16 {
 	uint64_t key[4][2];
 
 	/* Cache line 2 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_16 {
@@ -58,7 +58,7 @@ struct rte_bucket_4_16 {
 	uint64_t key[4][2];
 
 	/* Cache line 2 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif
 
diff --git a/lib/table/rte_table_hash_key32.c b/lib/table/rte_table_hash_key32.c
index 87f83ce6f5..88d8f69c72 100644
--- a/lib/table/rte_table_hash_key32.c
+++ b/lib/table/rte_table_hash_key32.c
@@ -43,7 +43,7 @@ struct rte_bucket_4_32 {
 	uint64_t key[4][4];
 
 	/* Cache line 3 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_32 {
@@ -58,7 +58,7 @@ struct rte_bucket_4_32 {
 	uint64_t key[4][4];
 
 	/* Cache line 3 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif
 
diff --git a/lib/table/rte_table_hash_key8.c b/lib/table/rte_table_hash_key8.c
index 7779a9d1a3..035d242769 100644
--- a/lib/table/rte_table_hash_key8.c
+++ b/lib/table/rte_table_hash_key8.c
@@ -40,7 +40,7 @@ struct rte_bucket_4_8 {
 	uint64_t key[4];
 
 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_8 {
@@ -54,7 +54,7 @@ struct rte_bucket_4_8 {
 	uint64_t key[4];
 
 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif
 
diff --git a/lib/vhost/rte_vhost.h b/lib/vhost/rte_vhost.h
index c733f857c6..99be18ceef 100644
--- a/lib/vhost/rte_vhost.h
+++ b/lib/vhost/rte_vhost.h
@@ -154,7 +154,7 @@ struct rte_vhost_inflight_info_split {
 	uint16_t desc_num;
 	uint16_t last_inflight_io;
 	uint16_t used_idx;
-	struct rte_vhost_inflight_desc_split desc[0];
+	struct rte_vhost_inflight_desc_split desc[];
 };
 
 struct rte_vhost_inflight_desc_packed {
@@ -181,7 +181,7 @@ struct rte_vhost_inflight_info_packed {
 	uint8_t used_wrap_counter;
 	uint8_t old_used_wrap_counter;
 	uint8_t padding[7];
-	struct rte_vhost_inflight_desc_packed desc[0];
+	struct rte_vhost_inflight_desc_packed desc[];
 };
 
 struct rte_vhost_resubmit_desc {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v3 4/4] app: examples: replace zero-length arrays with undimensioned ones
  2022-06-03 10:13 ` [PATCH v3 " Bruce Richardson
                     ` (2 preceding siblings ...)
  2022-06-03 10:13   ` [PATCH v3 3/4] lib: " Bruce Richardson
@ 2022-06-03 10:13   ` Bruce Richardson
  2022-06-03 11:13   ` [PATCH v3 0/4] clean up zero-length arrays Bruce Richardson
  4 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 10:13 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson, Morten Brørup,
	Stephen Hemminger, Hemant Agrawal

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 app/test/test_table_tables.c   | 2 +-
 examples/ip_reassembly/main.c  | 2 +-
 examples/ptpclient/ptpclient.c | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/test/test_table_tables.c b/app/test/test_table_tables.c
index 010dd5a794..26908e6112 100644
--- a/app/test/test_table_tables.c
+++ b/app/test/test_table_tables.c
@@ -53,7 +53,7 @@ struct rte_bucket_4_8 {
 	uint64_t next_valid;
 	uint64_t key[4];
 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 
 #if RTE_TABLE_HASH_LRU_STRATEGY == 3
diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c
index 6e4c11c3c7..3ebf895aa0 100644
--- a/examples/ip_reassembly/main.c
+++ b/examples/ip_reassembly/main.c
@@ -126,7 +126,7 @@ struct mbuf_table {
 	uint32_t len;
 	uint32_t head;
 	uint32_t tail;
-	struct rte_mbuf *m_table[0];
+	struct rte_mbuf *m_table[];
 };
 
 struct rx_queue {
diff --git a/examples/ptpclient/ptpclient.c b/examples/ptpclient/ptpclient.c
index de799f698b..1f1c9c9c52 100644
--- a/examples/ptpclient/ptpclient.c
+++ b/examples/ptpclient/ptpclient.c
@@ -90,7 +90,7 @@ struct sync_msg {
 struct follow_up_msg {
 	struct ptp_header   hdr;
 	struct tstamp       precise_origin_tstamp;
-	uint8_t             suffix[0];
+	uint8_t             suffix[];
 } __rte_packed;
 
 struct delay_req_msg {
@@ -102,7 +102,7 @@ struct delay_resp_msg {
 	struct ptp_header    hdr;
 	struct tstamp        rx_tstamp;
 	struct port_id       req_port_id;
-	uint8_t              suffix[0];
+	uint8_t              suffix[];
 } __rte_packed;
 
 struct ptp_message {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* RE: [PATCH v3 1/4] cocci: add script for zero-length arrays in structs
  2022-06-03 10:13   ` [PATCH v3 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
@ 2022-06-03 10:30     ` Morten Brørup
  2022-06-03 10:38       ` Bruce Richardson
  0 siblings, 1 reply; 34+ messages in thread
From: Morten Brørup @ 2022-06-03 10:30 UTC (permalink / raw)
  To: Bruce Richardson, dev; +Cc: david.marchand, Stephen Hemminger, Hemant Agrawal

> From: Bruce Richardson [mailto:bruce.richardson@intel.com]
> Sent: Friday, 3 June 2022 12.13
> 
> Add script to replace [0] with [] when used at the end of a struct.
> The script also includes an additional struct member to match against
> so
> as to avoid issues with arrays with only a single zero-length element.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> Acked-by: Morten Brørup <mb@smartsharesystems.com>
> Acked-by: Stephen Hemminger <stephen@networkplumber.org>
> Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> ---
>  devtools/cocci/zero_length_array.cocci | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
>  create mode 100644 devtools/cocci/zero_length_array.cocci
> 
> diff --git a/devtools/cocci/zero_length_array.cocci
> b/devtools/cocci/zero_length_array.cocci
> new file mode 100644
> index 0000000000..de8783bc7a
> --- /dev/null
> +++ b/devtools/cocci/zero_length_array.cocci
> @@ -0,0 +1,21 @@
> +// Replace zero-length array members with []
> +@@
> +identifier st, member, arr;
> +type T1, T2;
> +@@
> +struct st {
> +	...
> +	T1 member;
> +-	T2 arr[0];
> ++	T2 arr[];
> +};
> +@@
> +identifier st, member, arr, id;
> +type T1, T2;
> +@@
> +struct st {
> +	...
> +	T1 member;
> +-	T2 arr[0];
> ++	T2 arr[];
> +} id;
> --
> 2.34.1
> 

Formally, arr[0] could be the only field in the structure, i.e. with no preceding fields. It would be silly, but consider checking for that too.

PS: No worries about the name. Scandinavian letters can cause all sorts of problems.


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v3 1/4] cocci: add script for zero-length arrays in structs
  2022-06-03 10:30     ` Morten Brørup
@ 2022-06-03 10:38       ` Bruce Richardson
  0 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 10:38 UTC (permalink / raw)
  To: Morten Brørup; +Cc: dev, david.marchand, Stephen Hemminger, Hemant Agrawal

On Fri, Jun 03, 2022 at 12:30:25PM +0200, Morten Brørup wrote:
> > From: Bruce Richardson [mailto:bruce.richardson@intel.com]
> > Sent: Friday, 3 June 2022 12.13
> > 
> > Add script to replace [0] with [] when used at the end of a struct.
> > The script also includes an additional struct member to match against
> > so
> > as to avoid issues with arrays with only a single zero-length element.
> > 
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > Acked-by: Morten Brørup <mb@smartsharesystems.com>
> > Acked-by: Stephen Hemminger <stephen@networkplumber.org>
> > Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> > ---
> >  devtools/cocci/zero_length_array.cocci | 21 +++++++++++++++++++++
> >  1 file changed, 21 insertions(+)
> >  create mode 100644 devtools/cocci/zero_length_array.cocci
> > 
> > diff --git a/devtools/cocci/zero_length_array.cocci
> > b/devtools/cocci/zero_length_array.cocci
> > new file mode 100644
> > index 0000000000..de8783bc7a
> > --- /dev/null
> > +++ b/devtools/cocci/zero_length_array.cocci
> > @@ -0,0 +1,21 @@
> > +// Replace zero-length array members with []
> > +@@
> > +identifier st, member, arr;
> > +type T1, T2;
> > +@@
> > +struct st {
> > +	...
> > +	T1 member;
> > +-	T2 arr[0];
> > ++	T2 arr[];
> > +};
> > +@@
> > +identifier st, member, arr, id;
> > +type T1, T2;
> > +@@
> > +struct st {
> > +	...
> > +	T1 member;
> > +-	T2 arr[0];
> > ++	T2 arr[];
> > +} id;
> > --
> > 2.34.1
> > 
> 
> Formally, arr[0] could be the only field in the structure, i.e. with no preceding fields. It would be silly, but consider checking for that too.
> 

I actually had that originally, but the compiler will complain on
structures where there is only an unsized element. Therefore, I made the
script only do replacements on structs which had at least one other
element.


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v3 0/4] clean up zero-length arrays
  2022-06-03 10:13 ` [PATCH v3 " Bruce Richardson
                     ` (3 preceding siblings ...)
  2022-06-03 10:13   ` [PATCH v3 4/4] app: examples: " Bruce Richardson
@ 2022-06-03 11:13   ` Bruce Richardson
  4 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 11:13 UTC (permalink / raw)
  To: dev; +Cc: david.marchand

On Fri, Jun 03, 2022 at 11:13:27AM +0100, Bruce Richardson wrote:
> This patchset adds a coccinelle script to clean-up zero-length
> arrays in structures. The final patches are the result of running
> that script on the DPDK repository.
> 
> V3: Fixed issues in mlx5 drivers:
>   * fixed incorrect coccinelle replacement of 2-D zero-length arrays
>   * undid removal of "0" in tx elts[] which caused issues with Werror-pedantic
> 
> V2: rebased to fix apply conflict
> 
Still more build errors with these changes reported, V4 to follow...

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [PATCH v4 0/4] clean up zero-length arrays
  2022-06-02 15:08 [PATCH 0/4] clean up zero-length arrays Bruce Richardson
                   ` (7 preceding siblings ...)
  2022-06-03 10:13 ` [PATCH v3 " Bruce Richardson
@ 2022-06-03 11:16 ` Bruce Richardson
  2022-06-03 11:16   ` [PATCH v4 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
                     ` (5 more replies)
  2022-06-08 15:23 ` [PATCH " Stephen Hemminger
  9 siblings, 6 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 11:16 UTC (permalink / raw)
  To: dev; +Cc: david.marchand, Bruce Richardson

This patchset adds a coccinelle script to clean-up zero-length
arrays in structures. The final patches are the result of running
that script on the DPDK repository.

V4: removed change from struct ipsec_encap_pdb in common/dpaax, which
    caused build errors

V3: Fixed issues in mlx5 drivers:
  * fixed incorrect coccinelle replacement of 2-D zero-length arrays
  * undid removal of "0" in tx elts[] which caused issues with Werror-pedantic

V2: rebased to fix apply conflict

Bruce Richardson (4):
  cocci: add script for zero-length arrays in structs
  drivers: replace zero-length arrays with undimensioned ones
  lib: replace zero-length arrays with undimensioned ones
  app: examples: replace zero-length arrays with undimensioned ones

 app/test/test_table_tables.c                  |  2 +-
 devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++++++
 drivers/bus/dpaa/include/netcfg.h             |  4 ++--
 drivers/bus/vmbus/rte_vmbus_reg.h             |  4 ++--
 drivers/common/cnxk/roc_se.h                  |  2 +-
 drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
 drivers/common/mlx5/mlx5_prm.h                | 10 ++++-----
 drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 ++--
 drivers/crypto/virtio/virtio_ring.h           |  4 ++--
 drivers/crypto/virtio/virtqueue.h             |  2 +-
 drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
 drivers/net/cxgbe/clip_tbl.h                  |  2 +-
 drivers/net/cxgbe/l2t.h                       |  2 +-
 drivers/net/cxgbe/mps_tcam.h                  |  2 +-
 drivers/net/cxgbe/smt.h                       |  2 +-
 drivers/net/enic/base/vnic_devcmd.h           |  2 +-
 drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
 drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
 drivers/net/virtio/virtio_ring.h              |  4 ++--
 drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
 drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
 drivers/net/virtio/virtqueue.h                |  2 +-
 drivers/regex/mlx5/mlx5_rxp.h                 |  4 ++--
 examples/ip_reassembly/main.c                 |  2 +-
 examples/ptpclient/ptpclient.c                |  4 ++--
 lib/cryptodev/cryptodev_pmd.h                 |  2 +-
 lib/cryptodev/rte_cryptodev.h                 |  2 +-
 lib/eventdev/rte_event_timer_adapter.h        |  2 +-
 lib/ip_frag/ip_reassembly.h                   |  2 +-
 lib/ipsec/sa.h                                |  2 +-
 lib/rib/rte_rib.c                             |  2 +-
 lib/rib/rte_rib6.c                            |  2 +-
 lib/table/rte_swx_table_learner.c             |  4 ++--
 lib/table/rte_table_hash_key16.c              |  4 ++--
 lib/table/rte_table_hash_key32.c              |  4 ++--
 lib/table/rte_table_hash_key8.c               |  4 ++--
 lib/vhost/rte_vhost.h                         |  4 ++--
 37 files changed, 73 insertions(+), 52 deletions(-)
 create mode 100644 devtools/cocci/zero_length_array.cocci

--
2.34.1


^ permalink raw reply	[flat|nested] 34+ messages in thread

* [PATCH v4 1/4] cocci: add script for zero-length arrays in structs
  2022-06-03 11:16 ` [PATCH v4 " Bruce Richardson
@ 2022-06-03 11:16   ` Bruce Richardson
  2022-06-03 11:16   ` [PATCH v4 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
                     ` (4 subsequent siblings)
  5 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 11:16 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson, Morten Brørup,
	Stephen Hemminger, Hemant Agrawal

Add script to replace [0] with [] when used at the end of a struct.
The script also includes an additional struct member to match against so
as to avoid issues with arrays with only a single zero-length element.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 devtools/cocci/zero_length_array.cocci | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 devtools/cocci/zero_length_array.cocci

diff --git a/devtools/cocci/zero_length_array.cocci b/devtools/cocci/zero_length_array.cocci
new file mode 100644
index 0000000000..de8783bc7a
--- /dev/null
+++ b/devtools/cocci/zero_length_array.cocci
@@ -0,0 +1,21 @@
+// Replace zero-length array members with []
+@@
+identifier st, member, arr;
+type T1, T2;
+@@
+struct st {
+	...
+	T1 member;
+-	T2 arr[0];
++	T2 arr[];
+};
+@@
+identifier st, member, arr, id;
+type T1, T2;
+@@
+struct st {
+	...
+	T1 member;
+-	T2 arr[0];
++	T2 arr[];
+} id;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v4 2/4] drivers: replace zero-length arrays with undimensioned ones
  2022-06-03 11:16 ` [PATCH v4 " Bruce Richardson
  2022-06-03 11:16   ` [PATCH v4 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
@ 2022-06-03 11:16   ` Bruce Richardson
  2022-06-03 11:16   ` [PATCH v4 3/4] lib: " Bruce Richardson
                     ` (3 subsequent siblings)
  5 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 11:16 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson, Morten Brørup,
	Stephen Hemminger, Hemant Agrawal

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 drivers/bus/dpaa/include/netcfg.h             |  4 ++--
 drivers/bus/vmbus/rte_vmbus_reg.h             |  4 ++--
 drivers/common/cnxk/roc_se.h                  |  2 +-
 drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
 drivers/common/mlx5/mlx5_prm.h                | 10 +++++-----
 drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 ++--
 drivers/crypto/virtio/virtio_ring.h           |  4 ++--
 drivers/crypto/virtio/virtqueue.h             |  2 +-
 drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
 drivers/net/cxgbe/clip_tbl.h                  |  2 +-
 drivers/net/cxgbe/l2t.h                       |  2 +-
 drivers/net/cxgbe/mps_tcam.h                  |  2 +-
 drivers/net/cxgbe/smt.h                       |  2 +-
 drivers/net/enic/base/vnic_devcmd.h           |  2 +-
 drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
 drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
 drivers/net/virtio/virtio_ring.h              |  4 ++--
 drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
 drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
 drivers/net/virtio/virtqueue.h                |  2 +-
 drivers/regex/mlx5/mlx5_rxp.h                 |  4 ++--
 21 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/drivers/bus/dpaa/include/netcfg.h b/drivers/bus/dpaa/include/netcfg.h
index bb18a34e3d..43c7e1cfe1 100644
--- a/drivers/bus/dpaa/include/netcfg.h
+++ b/drivers/bus/dpaa/include/netcfg.h
@@ -23,7 +23,7 @@ struct fm_eth_port_cfg {
 struct netcfg_info {
 	uint8_t num_ethports;
 	/**< Number of ports */
-	struct fm_eth_port_cfg port_cfg[0];
+	struct fm_eth_port_cfg port_cfg[];
 	/**< Variable structure array of size num_ethports */
 };
 
@@ -38,7 +38,7 @@ struct interface_info {
 struct netcfg_interface {
 	uint8_t numof_netcfg_interface;
 	uint8_t numof_fman_enabled_macless;
-	struct interface_info interface_info[0];
+	struct interface_info interface_info[];
 };
 
 /* pcd_file: FMC netpcd XML ("policy") file, that contains PCD information.
diff --git a/drivers/bus/vmbus/rte_vmbus_reg.h b/drivers/bus/vmbus/rte_vmbus_reg.h
index 8562672979..a17ce40763 100644
--- a/drivers/bus/vmbus/rte_vmbus_reg.h
+++ b/drivers/bus/vmbus/rte_vmbus_reg.h
@@ -107,7 +107,7 @@ struct vmbus_bufring {
 	 * Ring data starts here + RingDataStartOffset
 	 * !!! DO NOT place any fields below this !!!
 	 */
-	uint8_t data[0];
+	uint8_t data[];
 } __rte_packed;
 
 /*
@@ -140,7 +140,7 @@ vmbus_chanpkt_getlen(uint16_t pktlen)
 struct vmbus_gpa_range {
 	uint32_t       len;
 	uint32_t       ofs;
-	uint64_t       page[0];
+	uint64_t       page[];
 } __rte_packed;
 
 /* This is actually vmbus_gpa_range.gpa_page[1] */
diff --git a/drivers/common/cnxk/roc_se.h b/drivers/common/cnxk/roc_se.h
index 145a1825bd..a1d476a86d 100644
--- a/drivers/common/cnxk/roc_se.h
+++ b/drivers/common/cnxk/roc_se.h
@@ -246,7 +246,7 @@ struct roc_se_buf_ptr {
 /* IOV Pointer */
 struct roc_se_iov_ptr {
 	int buf_cnt;
-	struct roc_se_buf_ptr bufs[0];
+	struct roc_se_buf_ptr bufs[];
 };
 
 struct roc_se_fc_params {
diff --git a/drivers/common/dpaax/dpaax_iova_table.h b/drivers/common/dpaax/dpaax_iova_table.h
index b1f2300c52..9a18eafca0 100644
--- a/drivers/common/dpaax/dpaax_iova_table.h
+++ b/drivers/common/dpaax/dpaax_iova_table.h
@@ -32,7 +32,7 @@ struct dpaax_iovat_element {
 
 struct dpaax_iova_table {
 	unsigned int count; /**< No. of blocks of contiguous physical pages */
-	struct dpaax_iovat_element entries[0];
+	struct dpaax_iovat_element entries[];
 };
 
 /* Pointer to the table, which is common for DPAA/DPAA2 and only a single
diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h
index bc3e70a1d1..654e5f44ee 100644
--- a/drivers/common/mlx5/mlx5_prm.h
+++ b/drivers/common/mlx5/mlx5_prm.h
@@ -560,7 +560,7 @@ struct mlx5_umr_wqe {
 struct mlx5_rdma_write_wqe {
 	struct mlx5_wqe_cseg ctr;
 	struct mlx5_wqe_rseg rseg;
-	struct mlx5_wqe_dseg dseg[0];
+	struct mlx5_wqe_dseg dseg[];
 } __rte_packed;
 
 #ifdef PEDANTIC
@@ -3479,7 +3479,7 @@ struct mlx5_ifc_qpc_pas_list_bits {
 #endif
 struct mlx5_ifc_qpc_extension_and_pas_list_bits {
 	struct mlx5_ifc_qpc_extension_bits qpc_data_extension;
-	u8 pas[0][0x40];
+	u8 pas[][0x40];
 };
 
 
@@ -3703,7 +3703,7 @@ struct mlx5_ifc_query_qp_out_bits {
 	u8 reserved_at_a0[0x20];
 	struct mlx5_ifc_qpc_bits qpc;
 	u8 reserved_at_800[0x80];
-	u8 pas[0][0x40];
+	u8 pas[][0x40];
 };
 #ifdef PEDANTIC
 #pragma GCC diagnostic error "-Wpedantic"
@@ -3743,7 +3743,7 @@ struct mlx5_ifc_access_register_out_bits {
 	u8 reserved_at_8[0x18];
 	u8 syndrome[0x20];
 	u8 reserved_at_40[0x40];
-	u8 register_data[0][0x20];
+	u8 register_data[][0x20];
 };
 
 struct mlx5_ifc_access_register_in_bits {
@@ -3754,7 +3754,7 @@ struct mlx5_ifc_access_register_in_bits {
 	u8 reserved_at_40[0x10];
 	u8 register_id[0x10];
 	u8 argument[0x20];
-	u8 register_data[0][0x20];
+	u8 register_data[][0x20];
 };
 #ifdef PEDANTIC
 #pragma GCC diagnostic error "-Wpedantic"
diff --git a/drivers/crypto/ipsec_mb/ipsec_mb_private.h b/drivers/crypto/ipsec_mb/ipsec_mb_private.h
index e53101acf1..e2c240dfc0 100644
--- a/drivers/crypto/ipsec_mb/ipsec_mb_private.h
+++ b/drivers/crypto/ipsec_mb/ipsec_mb_private.h
@@ -120,7 +120,7 @@ struct ipsec_mb_dev_private {
 	/**< PMD  type */
 	uint32_t max_nb_queue_pairs;
 	/**< Max number of queue pairs supported by device */
-	__extension__ uint8_t priv[0];
+	__extension__ uint8_t priv[];
 };
 
 /** IPSEC Multi buffer queue pair common queue pair data for all PMDs */
@@ -147,7 +147,7 @@ struct ipsec_mb_qp {
 	/* Multi buffer manager */
 	const struct rte_memzone *mb_mgr_mz;
 	/* Shared memzone for storing mb_mgr */
-	__extension__ uint8_t additional_data[0];
+	__extension__ uint8_t additional_data[];
 	/**< Storing PMD specific additional data */
 };
 
diff --git a/drivers/crypto/virtio/virtio_ring.h b/drivers/crypto/virtio/virtio_ring.h
index ee30674566..55839279fd 100644
--- a/drivers/crypto/virtio/virtio_ring.h
+++ b/drivers/crypto/virtio/virtio_ring.h
@@ -40,7 +40,7 @@ struct vring_desc {
 struct vring_avail {
 	uint16_t flags;
 	uint16_t idx;
-	uint16_t ring[0];
+	uint16_t ring[];
 };
 
 /* id is a 16bit index. uint32_t is used here for ids for padding reasons. */
@@ -54,7 +54,7 @@ struct vring_used_elem {
 struct vring_used {
 	uint16_t flags;
 	volatile uint16_t idx;
-	struct vring_used_elem ring[0];
+	struct vring_used_elem ring[];
 };
 
 struct vring {
diff --git a/drivers/crypto/virtio/virtqueue.h b/drivers/crypto/virtio/virtqueue.h
index c96ca62992..cb08bea94f 100644
--- a/drivers/crypto/virtio/virtqueue.h
+++ b/drivers/crypto/virtio/virtqueue.h
@@ -88,7 +88,7 @@ struct virtqueue {
 
 	uint16_t  *notify_addr;
 
-	struct vq_desc_extra vq_descx[0];
+	struct vq_desc_extra vq_descx[];
 };
 
 /**
diff --git a/drivers/net/atlantic/hw_atl/hw_atl_utils.h b/drivers/net/atlantic/hw_atl/hw_atl_utils.h
index d8fab010cf..12ac9b041e 100644
--- a/drivers/net/atlantic/hw_atl/hw_atl_utils.h
+++ b/drivers/net/atlantic/hw_atl/hw_atl_utils.h
@@ -334,7 +334,7 @@ struct offload_info {
 	struct offload_port_info ports;
 	struct offload_ka_info kas;
 	struct offload_rr_info rrs;
-	u8 buf[0];
+	u8 buf[];
 } __rte_packed;
 
 struct smbus_request {
diff --git a/drivers/net/cxgbe/clip_tbl.h b/drivers/net/cxgbe/clip_tbl.h
index d7689f4b7a..3b2be6645f 100644
--- a/drivers/net/cxgbe/clip_tbl.h
+++ b/drivers/net/cxgbe/clip_tbl.h
@@ -20,7 +20,7 @@ struct clip_tbl {
 	unsigned int clipt_start;     /* start index of CLIP table */
 	unsigned int clipt_size;      /* size of CLIP table */
 	rte_rwlock_t lock;            /* table rw lock */
-	struct clip_entry cl_list[0]; /* MUST BE LAST */
+	struct clip_entry cl_list[]; /* MUST BE LAST */
 };
 
 struct clip_tbl *t4_init_clip_tbl(unsigned int clipt_start,
diff --git a/drivers/net/cxgbe/l2t.h b/drivers/net/cxgbe/l2t.h
index 9845c9f981..e4c0ebedec 100644
--- a/drivers/net/cxgbe/l2t.h
+++ b/drivers/net/cxgbe/l2t.h
@@ -37,7 +37,7 @@ struct l2t_data {
 	unsigned int l2t_start;     /* start index of our piece of the L2T */
 	unsigned int l2t_size;      /* number of entries in l2tab */
 	rte_rwlock_t lock;          /* table rw lock */
-	struct l2t_entry l2tab[0];  /* MUST BE LAST */
+	struct l2t_entry l2tab[];  /* MUST BE LAST */
 };
 
 #define L2T_LPBK	true
diff --git a/drivers/net/cxgbe/mps_tcam.h b/drivers/net/cxgbe/mps_tcam.h
index a359f52442..363786bd38 100644
--- a/drivers/net/cxgbe/mps_tcam.h
+++ b/drivers/net/cxgbe/mps_tcam.h
@@ -41,7 +41,7 @@ struct mpstcam_table {
 			 * free_idx cannot alone determine
 			 * if the table is full
 			 */
-	struct mps_tcam_entry entry[0];
+	struct mps_tcam_entry entry[];
 };
 
 struct mpstcam_table *t4_init_mpstcam(struct adapter *adap);
diff --git a/drivers/net/cxgbe/smt.h b/drivers/net/cxgbe/smt.h
index a70e3a2085..531810e695 100644
--- a/drivers/net/cxgbe/smt.h
+++ b/drivers/net/cxgbe/smt.h
@@ -31,7 +31,7 @@ struct smt_data {
 	unsigned int smt_size;
 	unsigned int smt_start;
 	rte_rwlock_t lock;
-	struct smt_entry smtab[0];
+	struct smt_entry smtab[];
 };
 
 struct smt_data *t4_init_smt(u32 smt_start_idx, u32 smt_size);
diff --git a/drivers/net/enic/base/vnic_devcmd.h b/drivers/net/enic/base/vnic_devcmd.h
index 3157bc8cb5..253a791c3f 100644
--- a/drivers/net/enic/base/vnic_devcmd.h
+++ b/drivers/net/enic/base/vnic_devcmd.h
@@ -997,7 +997,7 @@ enum {
 struct filter_tlv {
 	uint32_t type;
 	uint32_t length;
-	uint32_t val[0];
+	uint32_t val[];
 };
 
 /* Data for CMD_ADD_FILTER is 2 TLV and filter + action structs */
diff --git a/drivers/net/hinic/hinic_pmd_tx.h b/drivers/net/hinic/hinic_pmd_tx.h
index a3ec6299fb..152f7abc53 100644
--- a/drivers/net/hinic/hinic_pmd_tx.h
+++ b/drivers/net/hinic/hinic_pmd_tx.h
@@ -81,7 +81,7 @@ struct hinic_sq_wqe {
 	struct hinic_sq_task		task;
 
 	/* sq sge section start address, 1~127 sges */
-	struct hinic_sq_bufdesc     buf_descs[0];
+	struct hinic_sq_bufdesc     buf_descs[];
 };
 
 struct hinic_txq_stats {
diff --git a/drivers/net/nfp/nfpcore/nfp_nsp.h b/drivers/net/nfp/nfpcore/nfp_nsp.h
index e74cdeb191..2184c15b4c 100644
--- a/drivers/net/nfp/nfpcore/nfp_nsp.h
+++ b/drivers/net/nfp/nfpcore/nfp_nsp.h
@@ -224,7 +224,7 @@ struct nfp_eth_table {
 		int is_split;
 
 		unsigned int fec_modes_supported;
-	} ports[0];
+	} ports[];
 };
 
 struct nfp_eth_table *nfp_eth_read_ports(struct nfp_cpp *cpp);
diff --git a/drivers/net/virtio/virtio_ring.h b/drivers/net/virtio/virtio_ring.h
index 17a56b0a73..e848c0b73b 100644
--- a/drivers/net/virtio/virtio_ring.h
+++ b/drivers/net/virtio/virtio_ring.h
@@ -46,7 +46,7 @@ struct vring_desc {
 struct vring_avail {
 	uint16_t flags;
 	uint16_t idx;
-	uint16_t ring[0];
+	uint16_t ring[];
 };
 
 /* id is a 16bit index. uint32_t is used here for ids for padding reasons. */
@@ -60,7 +60,7 @@ struct vring_used_elem {
 struct vring_used {
 	uint16_t flags;
 	uint16_t idx;
-	struct vring_used_elem ring[0];
+	struct vring_used_elem ring[];
 };
 
 /* For support of packed virtqueues in Virtio 1.1 the format of descriptors
diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c
index 986b56a7ca..1aed08b2bd 100644
--- a/drivers/net/virtio/virtio_user/vhost_kernel.c
+++ b/drivers/net/virtio/virtio_user/vhost_kernel.c
@@ -22,7 +22,7 @@ struct vhost_kernel_data {
 struct vhost_memory_kernel {
 	uint32_t nregions;
 	uint32_t padding;
-	struct vhost_memory_region regions[0];
+	struct vhost_memory_region regions[];
 };
 
 /* vhost kernel ioctls */
diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c
index 82f25a8674..bd13fe44b4 100644
--- a/drivers/net/virtio/virtio_user/vhost_vdpa.c
+++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c
@@ -70,7 +70,7 @@ struct vhost_iotlb_msg {
 struct vhost_vdpa_config {
 	uint32_t off;
 	uint32_t len;
-	uint8_t buf[0];
+	uint8_t buf[];
 };
 
 struct vhost_msg {
diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
index 99c68cf622..d100ed8762 100644
--- a/drivers/net/virtio/virtqueue.h
+++ b/drivers/net/virtio/virtqueue.h
@@ -309,7 +309,7 @@ struct virtqueue {
 
 	uint16_t  *notify_addr;
 	struct rte_mbuf **sw_ring;  /**< RX software ring. */
-	struct vq_desc_extra vq_descx[0];
+	struct vq_desc_extra vq_descx[];
 };
 
 /* If multiqueue is provided by host, then we support it. */
diff --git a/drivers/regex/mlx5/mlx5_rxp.h b/drivers/regex/mlx5/mlx5_rxp.h
index 315e3b4ca3..eddc577d79 100644
--- a/drivers/regex/mlx5/mlx5_rxp.h
+++ b/drivers/regex/mlx5/mlx5_rxp.h
@@ -64,7 +64,7 @@ struct mlx5_rxp_match_tuple {
 
 struct mlx5_rxp_response {
 	struct mlx5_rxp_response_desc header;
-	struct mlx5_rxp_match_tuple matches[0];
+	struct mlx5_rxp_match_tuple matches[];
 };
 
 #define MLX5_RXP_MAX_MATCHES 254
@@ -114,7 +114,7 @@ struct mlx5_rxp_rof {
 struct mlx5_rxp_ctl_rules_pgm {
 	struct mlx5_rxp_ctl_hdr hdr;
 	uint32_t count;
-	struct mlx5_rxp_rof_entry rules[0];
+	struct mlx5_rxp_rof_entry rules[];
 } __rte_packed;
 
 /* RXP programming mode setting. */
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v4 3/4] lib: replace zero-length arrays with undimensioned ones
  2022-06-03 11:16 ` [PATCH v4 " Bruce Richardson
  2022-06-03 11:16   ` [PATCH v4 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
  2022-06-03 11:16   ` [PATCH v4 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
@ 2022-06-03 11:16   ` Bruce Richardson
  2022-06-03 11:16   ` [PATCH v4 4/4] app: examples: " Bruce Richardson
                     ` (2 subsequent siblings)
  5 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 11:16 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson, Morten Brørup,
	Stephen Hemminger, Hemant Agrawal

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 lib/cryptodev/cryptodev_pmd.h          | 2 +-
 lib/cryptodev/rte_cryptodev.h          | 2 +-
 lib/eventdev/rte_event_timer_adapter.h | 2 +-
 lib/ip_frag/ip_reassembly.h            | 2 +-
 lib/ipsec/sa.h                         | 2 +-
 lib/rib/rte_rib.c                      | 2 +-
 lib/rib/rte_rib6.c                     | 2 +-
 lib/table/rte_swx_table_learner.c      | 4 ++--
 lib/table/rte_table_hash_key16.c       | 4 ++--
 lib/table/rte_table_hash_key32.c       | 4 ++--
 lib/table/rte_table_hash_key8.c        | 4 ++--
 lib/vhost/rte_vhost.h                  | 4 ++--
 12 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/lib/cryptodev/cryptodev_pmd.h b/lib/cryptodev/cryptodev_pmd.h
index 7a7d3ee3f1..3dcc3cb7ed 100644
--- a/lib/cryptodev/cryptodev_pmd.h
+++ b/lib/cryptodev/cryptodev_pmd.h
@@ -673,7 +673,7 @@ RTE_STD_C11 struct rte_cryptodev_asym_session {
 	uint8_t padding[3];
 	void *event_mdata;
 	/**< Event metadata (aka *union rte_event_crypto_metadata*) */
-	uint8_t sess_private_data[0];
+	uint8_t sess_private_data[];
 };
 
 #ifdef __cplusplus
diff --git a/lib/cryptodev/rte_cryptodev.h b/lib/cryptodev/rte_cryptodev.h
index 585cee2727..56f459c6a0 100644
--- a/lib/cryptodev/rte_cryptodev.h
+++ b/lib/cryptodev/rte_cryptodev.h
@@ -918,7 +918,7 @@ struct rte_cryptodev_sym_session {
 	__extension__ struct {
 		void *data;
 		uint16_t refcnt;
-	} sess_data[0];
+	} sess_data[];
 	/**< Driver specific session material, variable size */
 };
 
diff --git a/lib/eventdev/rte_event_timer_adapter.h b/lib/eventdev/rte_event_timer_adapter.h
index 4c91e5516a..eab8e59a57 100644
--- a/lib/eventdev/rte_event_timer_adapter.h
+++ b/lib/eventdev/rte_event_timer_adapter.h
@@ -486,7 +486,7 @@ struct rte_event_timer {
 	 */
 	enum rte_event_timer_state state;
 	/**< State of the event timer. */
-	uint8_t user_meta[0];
+	uint8_t user_meta[];
 	/**< Memory to store user specific metadata.
 	 * The event timer adapter implementation should not modify this area.
 	 */
diff --git a/lib/ip_frag/ip_reassembly.h b/lib/ip_frag/ip_reassembly.h
index 416fb66dd4..ef9d8c0d75 100644
--- a/lib/ip_frag/ip_reassembly.h
+++ b/lib/ip_frag/ip_reassembly.h
@@ -83,7 +83,7 @@ struct rte_ip_frag_tbl {
 	struct ip_frag_pkt *last;     /* last used entry. */
 	struct ip_pkt_list lru;       /* LRU list for table entries. */
 	struct ip_frag_tbl_stat stat; /* statistics counters. */
-	__extension__ struct ip_frag_pkt pkt[0]; /* hash table. */
+	__extension__ struct ip_frag_pkt pkt[]; /* hash table. */
 };
 
 #endif /* _IP_REASSEMBLY_H_ */
diff --git a/lib/ipsec/sa.h b/lib/ipsec/sa.h
index 46f9a4df5b..ce4af8ceb2 100644
--- a/lib/ipsec/sa.h
+++ b/lib/ipsec/sa.h
@@ -59,7 +59,7 @@ union sym_op_data {
 struct replay_sqn {
 	rte_rwlock_t rwl;
 	uint64_t sqn;
-	__extension__ uint64_t window[0];
+	__extension__ uint64_t window[];
 };
 
 /*IPSEC SA supported algorithms */
diff --git a/lib/rib/rte_rib.c b/lib/rib/rte_rib.c
index f1fdddbbb4..b0794edf66 100644
--- a/lib/rib/rte_rib.c
+++ b/lib/rib/rte_rib.c
@@ -35,7 +35,7 @@ struct rte_rib_node {
 	uint8_t		depth;
 	uint8_t		flag;
 	uint64_t	nh;
-	__extension__ uint64_t	ext[0];
+	__extension__ uint64_t ext[];
 };
 
 struct rte_rib {
diff --git a/lib/rib/rte_rib6.c b/lib/rib/rte_rib6.c
index 650bf1b8f6..19e4ff97c4 100644
--- a/lib/rib/rte_rib6.c
+++ b/lib/rib/rte_rib6.c
@@ -34,7 +34,7 @@ struct rte_rib6_node {
 	uint8_t			ip[RTE_RIB6_IPV6_ADDR_SIZE];
 	uint8_t			depth;
 	uint8_t			flag;
-	__extension__ uint64_t		ext[0];
+	__extension__ uint64_t ext[];
 };
 
 struct rte_rib6 {
diff --git a/lib/table/rte_swx_table_learner.c b/lib/table/rte_swx_table_learner.c
index 222acfc962..f7f8e8aea9 100644
--- a/lib/table/rte_swx_table_learner.c
+++ b/lib/table/rte_swx_table_learner.c
@@ -252,7 +252,7 @@ struct table_bucket {
 	uint32_t sig[TABLE_KEYS_PER_BUCKET];
 	uint8_t key_timeout_id[TABLE_KEYS_PER_BUCKET];
 	uint8_t pad[TABLE_BUCKET_PAD_SIZE];
-	uint8_t key[0];
+	uint8_t key[];
 };
 
 struct table_params {
@@ -317,7 +317,7 @@ struct table {
 	uint8_t key_mask0[RTE_CACHE_LINE_SIZE];
 
 	/* Table buckets. */
-	uint8_t buckets[0];
+	uint8_t buckets[];
 } __rte_cache_aligned;
 
 /* The timeout (in cycles) is stored in the table as a 32-bit value by truncating its least
diff --git a/lib/table/rte_table_hash_key16.c b/lib/table/rte_table_hash_key16.c
index ea8195dc17..04d7fd64bd 100644
--- a/lib/table/rte_table_hash_key16.c
+++ b/lib/table/rte_table_hash_key16.c
@@ -43,7 +43,7 @@ struct rte_bucket_4_16 {
 	uint64_t key[4][2];
 
 	/* Cache line 2 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_16 {
@@ -58,7 +58,7 @@ struct rte_bucket_4_16 {
 	uint64_t key[4][2];
 
 	/* Cache line 2 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif
 
diff --git a/lib/table/rte_table_hash_key32.c b/lib/table/rte_table_hash_key32.c
index 87f83ce6f5..88d8f69c72 100644
--- a/lib/table/rte_table_hash_key32.c
+++ b/lib/table/rte_table_hash_key32.c
@@ -43,7 +43,7 @@ struct rte_bucket_4_32 {
 	uint64_t key[4][4];
 
 	/* Cache line 3 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_32 {
@@ -58,7 +58,7 @@ struct rte_bucket_4_32 {
 	uint64_t key[4][4];
 
 	/* Cache line 3 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif
 
diff --git a/lib/table/rte_table_hash_key8.c b/lib/table/rte_table_hash_key8.c
index 7779a9d1a3..035d242769 100644
--- a/lib/table/rte_table_hash_key8.c
+++ b/lib/table/rte_table_hash_key8.c
@@ -40,7 +40,7 @@ struct rte_bucket_4_8 {
 	uint64_t key[4];
 
 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #else
 struct rte_bucket_4_8 {
@@ -54,7 +54,7 @@ struct rte_bucket_4_8 {
 	uint64_t key[4];
 
 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 #endif
 
diff --git a/lib/vhost/rte_vhost.h b/lib/vhost/rte_vhost.h
index c733f857c6..99be18ceef 100644
--- a/lib/vhost/rte_vhost.h
+++ b/lib/vhost/rte_vhost.h
@@ -154,7 +154,7 @@ struct rte_vhost_inflight_info_split {
 	uint16_t desc_num;
 	uint16_t last_inflight_io;
 	uint16_t used_idx;
-	struct rte_vhost_inflight_desc_split desc[0];
+	struct rte_vhost_inflight_desc_split desc[];
 };
 
 struct rte_vhost_inflight_desc_packed {
@@ -181,7 +181,7 @@ struct rte_vhost_inflight_info_packed {
 	uint8_t used_wrap_counter;
 	uint8_t old_used_wrap_counter;
 	uint8_t padding[7];
-	struct rte_vhost_inflight_desc_packed desc[0];
+	struct rte_vhost_inflight_desc_packed desc[];
 };
 
 struct rte_vhost_resubmit_desc {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v4 4/4] app: examples: replace zero-length arrays with undimensioned ones
  2022-06-03 11:16 ` [PATCH v4 " Bruce Richardson
                     ` (2 preceding siblings ...)
  2022-06-03 11:16   ` [PATCH v4 3/4] lib: " Bruce Richardson
@ 2022-06-03 11:16   ` Bruce Richardson
  2022-06-07 14:16   ` [PATCH v4 0/4] clean up zero-length arrays David Marchand
  2022-06-09 15:19   ` Tyler Retzlaff
  5 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-03 11:16 UTC (permalink / raw)
  To: dev
  Cc: david.marchand, Bruce Richardson, Morten Brørup,
	Stephen Hemminger, Hemant Agrawal

This patch replaces instances of zero-sized arrays i.e. those at the end
of structures with "[0]" with the more standard syntax of "[]".
Replacement was done using coccinelle script, with some cleanup of
whitespace afterwards.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 app/test/test_table_tables.c   | 2 +-
 examples/ip_reassembly/main.c  | 2 +-
 examples/ptpclient/ptpclient.c | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/test/test_table_tables.c b/app/test/test_table_tables.c
index 010dd5a794..26908e6112 100644
--- a/app/test/test_table_tables.c
+++ b/app/test/test_table_tables.c
@@ -53,7 +53,7 @@ struct rte_bucket_4_8 {
 	uint64_t next_valid;
 	uint64_t key[4];
 	/* Cache line 1 */
-	uint8_t data[0];
+	uint8_t data[];
 };
 
 #if RTE_TABLE_HASH_LRU_STRATEGY == 3
diff --git a/examples/ip_reassembly/main.c b/examples/ip_reassembly/main.c
index 6e4c11c3c7..3ebf895aa0 100644
--- a/examples/ip_reassembly/main.c
+++ b/examples/ip_reassembly/main.c
@@ -126,7 +126,7 @@ struct mbuf_table {
 	uint32_t len;
 	uint32_t head;
 	uint32_t tail;
-	struct rte_mbuf *m_table[0];
+	struct rte_mbuf *m_table[];
 };
 
 struct rx_queue {
diff --git a/examples/ptpclient/ptpclient.c b/examples/ptpclient/ptpclient.c
index de799f698b..1f1c9c9c52 100644
--- a/examples/ptpclient/ptpclient.c
+++ b/examples/ptpclient/ptpclient.c
@@ -90,7 +90,7 @@ struct sync_msg {
 struct follow_up_msg {
 	struct ptp_header   hdr;
 	struct tstamp       precise_origin_tstamp;
-	uint8_t             suffix[0];
+	uint8_t             suffix[];
 } __rte_packed;
 
 struct delay_req_msg {
@@ -102,7 +102,7 @@ struct delay_resp_msg {
 	struct ptp_header    hdr;
 	struct tstamp        rx_tstamp;
 	struct port_id       req_port_id;
-	uint8_t              suffix[0];
+	uint8_t              suffix[];
 } __rte_packed;
 
 struct ptp_message {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 34+ messages in thread

* Re: [PATCH v4 0/4] clean up zero-length arrays
  2022-06-03 11:16 ` [PATCH v4 " Bruce Richardson
                     ` (3 preceding siblings ...)
  2022-06-03 11:16   ` [PATCH v4 4/4] app: examples: " Bruce Richardson
@ 2022-06-07 14:16   ` David Marchand
  2022-06-09 15:19   ` Tyler Retzlaff
  5 siblings, 0 replies; 34+ messages in thread
From: David Marchand @ 2022-06-07 14:16 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev

On Fri, Jun 3, 2022 at 1:16 PM Bruce Richardson
<bruce.richardson@intel.com> wrote:
>
> This patchset adds a coccinelle script to clean-up zero-length
> arrays in structures. The final patches are the result of running
> that script on the DPDK repository.
>
>
> Bruce Richardson (4):
>   cocci: add script for zero-length arrays in structs
>   drivers: replace zero-length arrays with undimensioned ones
>   lib: replace zero-length arrays with undimensioned ones
>   app: examples: replace zero-length arrays with undimensioned ones
>
>  app/test/test_table_tables.c                  |  2 +-
>  devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++++++
>  drivers/bus/dpaa/include/netcfg.h             |  4 ++--
>  drivers/bus/vmbus/rte_vmbus_reg.h             |  4 ++--
>  drivers/common/cnxk/roc_se.h                  |  2 +-
>  drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
>  drivers/common/mlx5/mlx5_prm.h                | 10 ++++-----
>  drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 ++--
>  drivers/crypto/virtio/virtio_ring.h           |  4 ++--
>  drivers/crypto/virtio/virtqueue.h             |  2 +-
>  drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
>  drivers/net/cxgbe/clip_tbl.h                  |  2 +-
>  drivers/net/cxgbe/l2t.h                       |  2 +-
>  drivers/net/cxgbe/mps_tcam.h                  |  2 +-
>  drivers/net/cxgbe/smt.h                       |  2 +-
>  drivers/net/enic/base/vnic_devcmd.h           |  2 +-
>  drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
>  drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
>  drivers/net/virtio/virtio_ring.h              |  4 ++--
>  drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
>  drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
>  drivers/net/virtio/virtqueue.h                |  2 +-
>  drivers/regex/mlx5/mlx5_rxp.h                 |  4 ++--
>  examples/ip_reassembly/main.c                 |  2 +-
>  examples/ptpclient/ptpclient.c                |  4 ++--
>  lib/cryptodev/cryptodev_pmd.h                 |  2 +-
>  lib/cryptodev/rte_cryptodev.h                 |  2 +-
>  lib/eventdev/rte_event_timer_adapter.h        |  2 +-
>  lib/ip_frag/ip_reassembly.h                   |  2 +-
>  lib/ipsec/sa.h                                |  2 +-
>  lib/rib/rte_rib.c                             |  2 +-
>  lib/rib/rte_rib6.c                            |  2 +-
>  lib/table/rte_swx_table_learner.c             |  4 ++--
>  lib/table/rte_table_hash_key16.c              |  4 ++--
>  lib/table/rte_table_hash_key32.c              |  4 ++--
>  lib/table/rte_table_hash_key8.c               |  4 ++--
>  lib/vhost/rte_vhost.h                         |  4 ++--
>  37 files changed, 73 insertions(+), 52 deletions(-)
>  create mode 100644 devtools/cocci/zero_length_array.cocci

Series applied, thanks for the cleanup.


-- 
David Marchand


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH 0/4] clean up zero-length arrays
  2022-06-02 15:08 [PATCH 0/4] clean up zero-length arrays Bruce Richardson
                   ` (8 preceding siblings ...)
  2022-06-03 11:16 ` [PATCH v4 " Bruce Richardson
@ 2022-06-08 15:23 ` Stephen Hemminger
  2022-06-14  9:40   ` Bruce Richardson
  9 siblings, 1 reply; 34+ messages in thread
From: Stephen Hemminger @ 2022-06-08 15:23 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, david.marchand, ktraynor

On Thu,  2 Jun 2022 16:08:30 +0100
Bruce Richardson <bruce.richardson@intel.com> wrote:

> This patchset adds a coccinelle script to clean-up zero-length
> arrays in structures. The final patches are the result of running
> that script on the DPDK repository.
> 
> Bruce Richardson (4):
>   cocci: add script for zero-length arrays in structs
>   drivers: replace zero-length arrays with undimensioned ones
>   lib: replace zero-length arrays with undimensioned ones
>   app: examples: replace zero-length arrays with undimensioned ones
> 
>  app/test/test_table_tables.c                  |  2 +-
>  devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++
>  drivers/bus/dpaa/include/netcfg.h             |  4 +--
>  drivers/bus/vmbus/rte_vmbus_reg.h             |  4 +--
>  drivers/common/cnxk/roc_se.h                  |  2 +-
>  drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
>  drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
>  drivers/common/mlx5/mlx5_prm.h                | 10 +++----
>  drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 +--
>  drivers/crypto/virtio/virtio_ring.h           |  4 +--
>  drivers/crypto/virtio/virtqueue.h             |  2 +-
>  drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
>  drivers/net/cxgbe/clip_tbl.h                  |  2 +-
>  drivers/net/cxgbe/l2t.h                       |  2 +-
>  drivers/net/cxgbe/mps_tcam.h                  |  2 +-
>  drivers/net/cxgbe/smt.h                       |  2 +-
>  drivers/net/enic/base/vnic_devcmd.h           |  2 +-
>  drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
>  drivers/net/mlx5/mlx5_tx.h                    |  2 +-
>  drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
>  drivers/net/virtio/virtio_ring.h              |  4 +--
>  drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
>  drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
>  drivers/net/virtio/virtqueue.h                |  2 +-
>  drivers/regex/mlx5/mlx5_rxp.h                 |  4 +--
>  examples/ip_reassembly/main.c                 |  2 +-
>  examples/ptpclient/ptpclient.c                |  4 +--
>  lib/cryptodev/cryptodev_pmd.h                 |  2 +-
>  lib/cryptodev/rte_cryptodev.h                 |  2 +-
>  lib/eventdev/rte_event_timer_adapter.h        |  2 +-
>  lib/ip_frag/ip_reassembly.h                   |  2 +-
>  lib/ipsec/sa.h                                |  2 +-
>  lib/rib/rte_rib.c                             |  2 +-
>  lib/rib/rte_rib6.c                            |  2 +-
>  lib/table/rte_swx_table_learner.c             |  4 +--
>  lib/table/rte_table_hash_key16.c              |  4 +--
>  lib/table/rte_table_hash_key32.c              |  4 +--
>  lib/table/rte_table_hash_key8.c               |  4 +--
>  lib/vhost/rte_vhost.h                         |  4 +--
>  40 files changed, 101 insertions(+), 54 deletions(-)
>  create mode 100644 devtools/cocci/zero_length_array.cocci
>  create mode 100644 lib/count_comments.py
> 
> --
> 2.34.1
> 

Bruce, looking at this commit, it looks like the underlying cause
of the problem with iavf was it is using array size of one
when flex array should be used:

commit b5b3ea803e4741ad6a46a38d8227c78226d9054d
Author: Kevin Traynor <ktraynor@redhat.com>
Date:   Fri Apr 17 16:43:35 2020 +0100

    eal/x86: ignore gcc 10 stringop-overflow warnings
    
    stringop-overflow warns when it sees a possible overflow
    in a string operation.
    
    In the rte_memcpy functions different branches are taken
    depending on the size. stringop-overflow is raised for the
    branches in the function where it sees the static size of the
    src could be overflowed.
    
    However, in reality a correct size argument and in some cases
    dynamic allocation would ensure that this does not happen.
    
    For example, in the case below for key, the correct path will be
    chosen in rte_memcpy_generic at runtime based on the size argument
    but as some paths in the function could lead to a cast to 32 bytes
    a warning is raised.
    
    In function ‘_mm256_storeu_si256’,
    inlined from ‘rte_memcpy_generic’
    at ../lib/librte_eal/common/include/arch/x86/rte_memcpy.h:315:2,
    inlined from ‘iavf_configure_rss_key’
    at ../lib/librte_eal/common/include/arch/x86/rte_memcpy.h:869:10:
    
    /usr/lib/gcc/x86_64-redhat-linux/10/include/avxintrin.h:928:8:
    warning: writing 32 bytes into a region of size 1 [-Wstringop-overflow=]
      928 |   *__P = __A;
          |   ~~~~~^~~~~
    In file included
    from ../drivers/net/iavf/../../common/iavf/iavf_prototype.h:10,
    from ../drivers/net/iavf/iavf.h:9,
    from ../drivers/net/iavf/iavf_vchnl.c:22:
    
    ../drivers/net/iavf/iavf_vchnl.c:
    In function ‘iavf_configure_rss_key’:
    
    ../drivers/net/iavf/../../common/iavf/virtchnl.h:508:5:
    note: at offset 0 to object ‘key’ with size 1 declared here
      508 |  u8 key[1];         /* RSS hash key, packed bytes */
          |     ^~~
    
    Ignore the stringop-overflow warnings for rte_memcpy.h functions.
    
    Bugzilla ID: 394
    Bugzilla ID: 421
    Cc: stable@dpdk.org
    
    Signed-off-by: Kevin Traynor <ktraynor@redhat.com>
    Acked-by: Bruce Richardson <bruce.richardson@intel.com>
    Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>






^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v4 0/4] clean up zero-length arrays
  2022-06-03 11:16 ` [PATCH v4 " Bruce Richardson
                     ` (4 preceding siblings ...)
  2022-06-07 14:16   ` [PATCH v4 0/4] clean up zero-length arrays David Marchand
@ 2022-06-09 15:19   ` Tyler Retzlaff
  5 siblings, 0 replies; 34+ messages in thread
From: Tyler Retzlaff @ 2022-06-09 15:19 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: dev, david.marchand

does this mean we now *require* a C99 compiler?

(which i have no problem with)

Series-acked-by: Tyler Retzlaff <roretzla@linux.microsoft.com>

On Fri, Jun 03, 2022 at 12:16:21PM +0100, Bruce Richardson wrote:
> This patchset adds a coccinelle script to clean-up zero-length
> arrays in structures. The final patches are the result of running
> that script on the DPDK repository.
> 
> V4: removed change from struct ipsec_encap_pdb in common/dpaax, which
>     caused build errors
> 
> V3: Fixed issues in mlx5 drivers:
>   * fixed incorrect coccinelle replacement of 2-D zero-length arrays
>   * undid removal of "0" in tx elts[] which caused issues with Werror-pedantic
> 
> V2: rebased to fix apply conflict
> 
> Bruce Richardson (4):
>   cocci: add script for zero-length arrays in structs
>   drivers: replace zero-length arrays with undimensioned ones
>   lib: replace zero-length arrays with undimensioned ones
>   app: examples: replace zero-length arrays with undimensioned ones
> 
>  app/test/test_table_tables.c                  |  2 +-
>  devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++++++
>  drivers/bus/dpaa/include/netcfg.h             |  4 ++--
>  drivers/bus/vmbus/rte_vmbus_reg.h             |  4 ++--
>  drivers/common/cnxk/roc_se.h                  |  2 +-
>  drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
>  drivers/common/mlx5/mlx5_prm.h                | 10 ++++-----
>  drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 ++--
>  drivers/crypto/virtio/virtio_ring.h           |  4 ++--
>  drivers/crypto/virtio/virtqueue.h             |  2 +-
>  drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
>  drivers/net/cxgbe/clip_tbl.h                  |  2 +-
>  drivers/net/cxgbe/l2t.h                       |  2 +-
>  drivers/net/cxgbe/mps_tcam.h                  |  2 +-
>  drivers/net/cxgbe/smt.h                       |  2 +-
>  drivers/net/enic/base/vnic_devcmd.h           |  2 +-
>  drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
>  drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
>  drivers/net/virtio/virtio_ring.h              |  4 ++--
>  drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
>  drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
>  drivers/net/virtio/virtqueue.h                |  2 +-
>  drivers/regex/mlx5/mlx5_rxp.h                 |  4 ++--
>  examples/ip_reassembly/main.c                 |  2 +-
>  examples/ptpclient/ptpclient.c                |  4 ++--
>  lib/cryptodev/cryptodev_pmd.h                 |  2 +-
>  lib/cryptodev/rte_cryptodev.h                 |  2 +-
>  lib/eventdev/rte_event_timer_adapter.h        |  2 +-
>  lib/ip_frag/ip_reassembly.h                   |  2 +-
>  lib/ipsec/sa.h                                |  2 +-
>  lib/rib/rte_rib.c                             |  2 +-
>  lib/rib/rte_rib6.c                            |  2 +-
>  lib/table/rte_swx_table_learner.c             |  4 ++--
>  lib/table/rte_table_hash_key16.c              |  4 ++--
>  lib/table/rte_table_hash_key32.c              |  4 ++--
>  lib/table/rte_table_hash_key8.c               |  4 ++--
>  lib/vhost/rte_vhost.h                         |  4 ++--
>  37 files changed, 73 insertions(+), 52 deletions(-)
>  create mode 100644 devtools/cocci/zero_length_array.cocci
> 
> --
> 2.34.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH 0/4] clean up zero-length arrays
  2022-06-08 15:23 ` [PATCH " Stephen Hemminger
@ 2022-06-14  9:40   ` Bruce Richardson
  2022-06-14  9:45     ` Bruce Richardson
  0 siblings, 1 reply; 34+ messages in thread
From: Bruce Richardson @ 2022-06-14  9:40 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev, david.marchand, ktraynor, jingjing.wu, beilei.xing

On Wed, Jun 08, 2022 at 08:23:02AM -0700, Stephen Hemminger wrote:
> On Thu,  2 Jun 2022 16:08:30 +0100
> Bruce Richardson <bruce.richardson@intel.com> wrote:
> 
> > This patchset adds a coccinelle script to clean-up zero-length
> > arrays in structures. The final patches are the result of running
> > that script on the DPDK repository.
> > 
> > Bruce Richardson (4):
> >   cocci: add script for zero-length arrays in structs
> >   drivers: replace zero-length arrays with undimensioned ones
> >   lib: replace zero-length arrays with undimensioned ones
> >   app: examples: replace zero-length arrays with undimensioned ones
> > 
> >  app/test/test_table_tables.c                  |  2 +-
> >  devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++
> >  drivers/bus/dpaa/include/netcfg.h             |  4 +--
> >  drivers/bus/vmbus/rte_vmbus_reg.h             |  4 +--
> >  drivers/common/cnxk/roc_se.h                  |  2 +-
> >  drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
> >  drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
> >  drivers/common/mlx5/mlx5_prm.h                | 10 +++----
> >  drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 +--
> >  drivers/crypto/virtio/virtio_ring.h           |  4 +--
> >  drivers/crypto/virtio/virtqueue.h             |  2 +-
> >  drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
> >  drivers/net/cxgbe/clip_tbl.h                  |  2 +-
> >  drivers/net/cxgbe/l2t.h                       |  2 +-
> >  drivers/net/cxgbe/mps_tcam.h                  |  2 +-
> >  drivers/net/cxgbe/smt.h                       |  2 +-
> >  drivers/net/enic/base/vnic_devcmd.h           |  2 +-
> >  drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
> >  drivers/net/mlx5/mlx5_tx.h                    |  2 +-
> >  drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
> >  drivers/net/virtio/virtio_ring.h              |  4 +--
> >  drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
> >  drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
> >  drivers/net/virtio/virtqueue.h                |  2 +-
> >  drivers/regex/mlx5/mlx5_rxp.h                 |  4 +--
> >  examples/ip_reassembly/main.c                 |  2 +-
> >  examples/ptpclient/ptpclient.c                |  4 +--
> >  lib/cryptodev/cryptodev_pmd.h                 |  2 +-
> >  lib/cryptodev/rte_cryptodev.h                 |  2 +-
> >  lib/eventdev/rte_event_timer_adapter.h        |  2 +-
> >  lib/ip_frag/ip_reassembly.h                   |  2 +-
> >  lib/ipsec/sa.h                                |  2 +-
> >  lib/rib/rte_rib.c                             |  2 +-
> >  lib/rib/rte_rib6.c                            |  2 +-
> >  lib/table/rte_swx_table_learner.c             |  4 +--
> >  lib/table/rte_table_hash_key16.c              |  4 +--
> >  lib/table/rte_table_hash_key32.c              |  4 +--
> >  lib/table/rte_table_hash_key8.c               |  4 +--
> >  lib/vhost/rte_vhost.h                         |  4 +--
> >  40 files changed, 101 insertions(+), 54 deletions(-)
> >  create mode 100644 devtools/cocci/zero_length_array.cocci
> >  create mode 100644 lib/count_comments.py
> > 
> > --
> > 2.34.1
> > 
> 
> Bruce, looking at this commit, it looks like the underlying cause
> of the problem with iavf was it is using array size of one
> when flex array should be used:
> 
> commit b5b3ea803e4741ad6a46a38d8227c78226d9054d
> Author: Kevin Traynor <ktraynor@redhat.com>
> Date:   Fri Apr 17 16:43:35 2020 +0100
> 
>     eal/x86: ignore gcc 10 stringop-overflow warnings
>     
>     stringop-overflow warns when it sees a possible overflow
>     in a string operation.
>     
>     In the rte_memcpy functions different branches are taken
>     depending on the size. stringop-overflow is raised for the
>     branches in the function where it sees the static size of the
>     src could be overflowed.
>     
>     However, in reality a correct size argument and in some cases
>     dynamic allocation would ensure that this does not happen.
>     
>     For example, in the case below for key, the correct path will be
>     chosen in rte_memcpy_generic at runtime based on the size argument
>     but as some paths in the function could lead to a cast to 32 bytes
>     a warning is raised.
>     
>     In function ‘_mm256_storeu_si256’,
>     inlined from ‘rte_memcpy_generic’
>     at ../lib/librte_eal/common/include/arch/x86/rte_memcpy.h:315:2,
>     inlined from ‘iavf_configure_rss_key’
>     at ../lib/librte_eal/common/include/arch/x86/rte_memcpy.h:869:10:
>     
>     /usr/lib/gcc/x86_64-redhat-linux/10/include/avxintrin.h:928:8:
>     warning: writing 32 bytes into a region of size 1 [-Wstringop-overflow=]
>       928 |   *__P = __A;
>           |   ~~~~~^~~~~
>     In file included
>     from ../drivers/net/iavf/../../common/iavf/iavf_prototype.h:10,
>     from ../drivers/net/iavf/iavf.h:9,
>     from ../drivers/net/iavf/iavf_vchnl.c:22:
>     
>     ../drivers/net/iavf/iavf_vchnl.c:
>     In function ‘iavf_configure_rss_key’:
>     
>     ../drivers/net/iavf/../../common/iavf/virtchnl.h:508:5:
>     note: at offset 0 to object ‘key’ with size 1 declared here
>       508 |  u8 key[1];         /* RSS hash key, packed bytes */
>           |     ^~~
>     

I would tend to agree with your assessment. It looks like the "u8 key[1]"
value should probably be "u8 key[]", and also in the following structure in
the file, "u8 lut[1]" should probably be "u8 lut[]".

Adding maintainers for driver on CC

Beilei, Jingjing, 

in "common/iavf/virtchnl.h", there are quite a number of values at the end
of structs which are defined as arrays of size 1. We suspect that many of
these are placeholder arrays which should be given as unsigned arrays. Is
this assessment correct?

/Bruce

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH 0/4] clean up zero-length arrays
  2022-06-14  9:40   ` Bruce Richardson
@ 2022-06-14  9:45     ` Bruce Richardson
  0 siblings, 0 replies; 34+ messages in thread
From: Bruce Richardson @ 2022-06-14  9:45 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev, david.marchand, ktraynor, jingjing.wu, beilei.xing

On Tue, Jun 14, 2022 at 10:40:50AM +0100, Bruce Richardson wrote:
> On Wed, Jun 08, 2022 at 08:23:02AM -0700, Stephen Hemminger wrote:
> > On Thu,  2 Jun 2022 16:08:30 +0100
> > Bruce Richardson <bruce.richardson@intel.com> wrote:
> > 
> > > This patchset adds a coccinelle script to clean-up zero-length
> > > arrays in structures. The final patches are the result of running
> > > that script on the DPDK repository.
> > > 
> > > Bruce Richardson (4):
> > >   cocci: add script for zero-length arrays in structs
> > >   drivers: replace zero-length arrays with undimensioned ones
> > >   lib: replace zero-length arrays with undimensioned ones
> > >   app: examples: replace zero-length arrays with undimensioned ones
> > > 
> > >  app/test/test_table_tables.c                  |  2 +-
> > >  devtools/cocci/zero_length_array.cocci        | 21 +++++++++++++++
> > >  drivers/bus/dpaa/include/netcfg.h             |  4 +--
> > >  drivers/bus/vmbus/rte_vmbus_reg.h             |  4 +--
> > >  drivers/common/cnxk/roc_se.h                  |  2 +-
> > >  drivers/common/dpaax/caamflib/desc/ipsec.h    |  2 +-
> > >  drivers/common/dpaax/dpaax_iova_table.h       |  2 +-
> > >  drivers/common/mlx5/mlx5_prm.h                | 10 +++----
> > >  drivers/crypto/ipsec_mb/ipsec_mb_private.h    |  4 +--
> > >  drivers/crypto/virtio/virtio_ring.h           |  4 +--
> > >  drivers/crypto/virtio/virtqueue.h             |  2 +-
> > >  drivers/net/atlantic/hw_atl/hw_atl_utils.h    |  2 +-
> > >  drivers/net/cxgbe/clip_tbl.h                  |  2 +-
> > >  drivers/net/cxgbe/l2t.h                       |  2 +-
> > >  drivers/net/cxgbe/mps_tcam.h                  |  2 +-
> > >  drivers/net/cxgbe/smt.h                       |  2 +-
> > >  drivers/net/enic/base/vnic_devcmd.h           |  2 +-
> > >  drivers/net/hinic/hinic_pmd_tx.h              |  2 +-
> > >  drivers/net/mlx5/mlx5_tx.h                    |  2 +-
> > >  drivers/net/nfp/nfpcore/nfp_nsp.h             |  2 +-
> > >  drivers/net/virtio/virtio_ring.h              |  4 +--
> > >  drivers/net/virtio/virtio_user/vhost_kernel.c |  2 +-
> > >  drivers/net/virtio/virtio_user/vhost_vdpa.c   |  2 +-
> > >  drivers/net/virtio/virtqueue.h                |  2 +-
> > >  drivers/regex/mlx5/mlx5_rxp.h                 |  4 +--
> > >  examples/ip_reassembly/main.c                 |  2 +-
> > >  examples/ptpclient/ptpclient.c                |  4 +--
> > >  lib/cryptodev/cryptodev_pmd.h                 |  2 +-
> > >  lib/cryptodev/rte_cryptodev.h                 |  2 +-
> > >  lib/eventdev/rte_event_timer_adapter.h        |  2 +-
> > >  lib/ip_frag/ip_reassembly.h                   |  2 +-
> > >  lib/ipsec/sa.h                                |  2 +-
> > >  lib/rib/rte_rib.c                             |  2 +-
> > >  lib/rib/rte_rib6.c                            |  2 +-
> > >  lib/table/rte_swx_table_learner.c             |  4 +--
> > >  lib/table/rte_table_hash_key16.c              |  4 +--
> > >  lib/table/rte_table_hash_key32.c              |  4 +--
> > >  lib/table/rte_table_hash_key8.c               |  4 +--
> > >  lib/vhost/rte_vhost.h                         |  4 +--
> > >  40 files changed, 101 insertions(+), 54 deletions(-)
> > >  create mode 100644 devtools/cocci/zero_length_array.cocci
> > >  create mode 100644 lib/count_comments.py
> > > 
> > > --
> > > 2.34.1
> > > 
> > 
> > Bruce, looking at this commit, it looks like the underlying cause
> > of the problem with iavf was it is using array size of one
> > when flex array should be used:
> > 
> > commit b5b3ea803e4741ad6a46a38d8227c78226d9054d
> > Author: Kevin Traynor <ktraynor@redhat.com>
> > Date:   Fri Apr 17 16:43:35 2020 +0100
> > 
> >     eal/x86: ignore gcc 10 stringop-overflow warnings
> >     
> >     stringop-overflow warns when it sees a possible overflow
> >     in a string operation.
> >     
> >     In the rte_memcpy functions different branches are taken
> >     depending on the size. stringop-overflow is raised for the
> >     branches in the function where it sees the static size of the
> >     src could be overflowed.
> >     
> >     However, in reality a correct size argument and in some cases
> >     dynamic allocation would ensure that this does not happen.
> >     
> >     For example, in the case below for key, the correct path will be
> >     chosen in rte_memcpy_generic at runtime based on the size argument
> >     but as some paths in the function could lead to a cast to 32 bytes
> >     a warning is raised.
> >     
> >     In function ‘_mm256_storeu_si256’,
> >     inlined from ‘rte_memcpy_generic’
> >     at ../lib/librte_eal/common/include/arch/x86/rte_memcpy.h:315:2,
> >     inlined from ‘iavf_configure_rss_key’
> >     at ../lib/librte_eal/common/include/arch/x86/rte_memcpy.h:869:10:
> >     
> >     /usr/lib/gcc/x86_64-redhat-linux/10/include/avxintrin.h:928:8:
> >     warning: writing 32 bytes into a region of size 1 [-Wstringop-overflow=]
> >       928 |   *__P = __A;
> >           |   ~~~~~^~~~~
> >     In file included
> >     from ../drivers/net/iavf/../../common/iavf/iavf_prototype.h:10,
> >     from ../drivers/net/iavf/iavf.h:9,
> >     from ../drivers/net/iavf/iavf_vchnl.c:22:
> >     
> >     ../drivers/net/iavf/iavf_vchnl.c:
> >     In function ‘iavf_configure_rss_key’:
> >     
> >     ../drivers/net/iavf/../../common/iavf/virtchnl.h:508:5:
> >     note: at offset 0 to object ‘key’ with size 1 declared here
> >       508 |  u8 key[1];         /* RSS hash key, packed bytes */
> >           |     ^~~
> >     
> 
> I would tend to agree with your assessment. It looks like the "u8 key[1]"
> value should probably be "u8 key[]", and also in the following structure in
> the file, "u8 lut[1]" should probably be "u8 lut[]".
> 
> Adding maintainers for driver on CC
> 
> Beilei, Jingjing, 
> 
> in "common/iavf/virtchnl.h", there are quite a number of values at the end
> of structs which are defined as arrays of size 1. We suspect that many of
> these are placeholder arrays which should be given as unsigned arrays. Is
> this assessment correct?
>
s/unsigned arrays/flexible array members/ 

i.e. arrays without a given size "[]" 

^ permalink raw reply	[flat|nested] 34+ messages in thread

end of thread, other threads:[~2022-06-14  9:45 UTC | newest]

Thread overview: 34+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-02 15:08 [PATCH 0/4] clean up zero-length arrays Bruce Richardson
2022-06-02 15:08 ` [PATCH 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
2022-06-02 15:08 ` [PATCH 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
2022-06-02 15:08 ` [PATCH 3/4] lib: " Bruce Richardson
2022-06-02 15:08 ` [PATCH 4/4] app: examples: " Bruce Richardson
2022-06-02 15:20 ` [PATCH 0/4] clean up zero-length arrays Morten Brørup
2022-06-02 15:35 ` Stephen Hemminger
2022-06-02 16:13 ` [PATCH v2 " Bruce Richardson
2022-06-02 16:13   ` [PATCH v2 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
2022-06-02 16:13   ` [PATCH v2 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
2022-06-03  7:19     ` David Marchand
2022-06-03  7:36       ` Bruce Richardson
2022-06-03  9:18       ` Bruce Richardson
2022-06-02 16:13   ` [PATCH v2 3/4] lib: " Bruce Richardson
2022-06-02 16:13   ` [PATCH v2 4/4] app: examples: " Bruce Richardson
2022-06-03  6:56   ` [PATCH v2 0/4] clean up zero-length arrays Hemant Agrawal
2022-06-03 10:13 ` [PATCH v3 " Bruce Richardson
2022-06-03 10:13   ` [PATCH v3 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
2022-06-03 10:30     ` Morten Brørup
2022-06-03 10:38       ` Bruce Richardson
2022-06-03 10:13   ` [PATCH v3 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
2022-06-03 10:13   ` [PATCH v3 3/4] lib: " Bruce Richardson
2022-06-03 10:13   ` [PATCH v3 4/4] app: examples: " Bruce Richardson
2022-06-03 11:13   ` [PATCH v3 0/4] clean up zero-length arrays Bruce Richardson
2022-06-03 11:16 ` [PATCH v4 " Bruce Richardson
2022-06-03 11:16   ` [PATCH v4 1/4] cocci: add script for zero-length arrays in structs Bruce Richardson
2022-06-03 11:16   ` [PATCH v4 2/4] drivers: replace zero-length arrays with undimensioned ones Bruce Richardson
2022-06-03 11:16   ` [PATCH v4 3/4] lib: " Bruce Richardson
2022-06-03 11:16   ` [PATCH v4 4/4] app: examples: " Bruce Richardson
2022-06-07 14:16   ` [PATCH v4 0/4] clean up zero-length arrays David Marchand
2022-06-09 15:19   ` Tyler Retzlaff
2022-06-08 15:23 ` [PATCH " Stephen Hemminger
2022-06-14  9:40   ` Bruce Richardson
2022-06-14  9:45     ` Bruce Richardson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.