arcnet: Replace zero-length array with flexible-array member
Subsystems (3)
PATCH 1/1 arcnet: Replace zero-length array with flexible-array member
The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member[1][2], introduced in C99:
struct foo {
int stuff;
struct boo array[];
};By making use of the mechanism above, we will get a compiler warning in case the flexible array does not occur last in the structure, which will help us prevent some kind of undefined behavior bugs from being inadvertently introduced[3] to the codebase from now on.
Also, notice that, dynamic memory allocations won't be affected by this change:
"Flexible array members have incomplete type, and so the sizeof operator may not be applied. As a quirk of the original implementation of zero-length arrays, sizeof evaluates to zero."[1]
This issue was found with the help of Coccinelle.
[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")
--- include/uapi/linux/if_arcnet.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
include/uapi/linux/if_arcnet.h +3 -3
@@ -60,7 +60,7 @@ struct arc_rfc1201 {__u8 proto;/* protocol ID field - varies */ __u8 split_flag;/* for use with split packets */ __be16 sequence;/* sequence number */ -__u8 payload[0 ];/* space remaining in packet (504 bytes)*/ +__u8 payload[];/* space remaining in packet (504 bytes)*/ };#define RFC1201_HDR_SIZE 4
@@ -69,7 +69,7 @@ struct arc_rfc1201 {*/ struct arc_rfc1051 {__u8 proto;/* ARC_P_RFC1051_ARP/RFC1051_IP */ -__u8 payload[0 ];/* 507 bytes */ +__u8 payload[];/* 507 bytes */ };#define RFC1051_HDR_SIZE 1
@@ -80,7 +80,7 @@ struct arc_rfc1051 {struct arc_eth_encap {__u8 proto;/* Always ARC_P_ETHER */ struct ethhdr eth;/* standard ethernet header (yuck!) */ -__u8 payload[0 ];/* 493 bytes */ +__u8 payload[];/* 493 bytes */ };#define ETH_ENCAP_HDR_SIZE 14
Signature · 1 line
2.25.0
From: "Gustavo A. R. Silva" <[email protected]>
Date: Fri, 28 Feb 2020 19:07:01 -0600
Quoted 22 lines
The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member[1][2], introduced in C99:
struct foo { int stuff; struct boo array[]; };By making use of the mechanism above, we will get a compiler warning in case the flexible array does not occur last in the structure, which will help us prevent some kind of undefined behavior bugs from being inadvertently introduced[3] to the codebase from now on.
Also, notice that, dynamic memory allocations won't be affected by this change:
"Flexible array members have incomplete type, and so the sizeof operator may not be applied. As a quirk of the original implementation of zero-length arrays, sizeof evaluates to zero."[1]
Quoted 7 lines
This issue was found with the help of Coccinelle.
[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit76497732932f("cxgb3/l2t: Fix undefined behaviour")Signed-off-by Gustavo A. R. Silva <[email protected]>
Applied.