From mboxrd@z Thu Jan 1 00:00:00 1970 From: bjorn@mork.no (=?utf-8?Q?Bj=C3=B8rn_Mork?=) Date: Tue, 05 Apr 2016 22:00:47 +0200 Subject: variant length array? In-Reply-To: (Robert P. J. Day's message of "Tue, 5 Apr 2016 12:43:48 -0700 (PDT)") References: Message-ID: <8760vvygeo.fsf@nemi.mork.no> To: kernelnewbies@lists.kernelnewbies.org List-Id: kernelnewbies.lists.kernelnewbies.org "Robert P. J. Day" writes: > On Tue, 5 Apr 2016, Wenda Ni wrote: > >> Hi all, >> >> I come across the following code in a kernel module code. It defines >> an array whose length is variant at runtime, depending on the actual >> inputs. It seems that kernel compiler supports this, which is >> obvious an error in the standard ANSI C. Do I have the correct >> understanding on it? >> >> Thank you. >> >> >> u32 rxe_icrc_hdr(struct rxe_pkt_info *pkt, struct sk_buff *skb) >> { >> ???????? ... >> ???????? int hdr_size = sizeof(struct udphdr) + >> ???????????????? (skb->protocol == htons(ETH_P_IP) ? >> ???????????????? sizeof(struct iphdr) : sizeof(struct ipv6hdr)); >> ???????? u8 tmp[hdr_size + RXE_BTH_BYTES]; >> ???????? ... >> } > > pretty sure "sizeof" can be calculated at compile time so i don't > see a problem here. Yes, but skb->protocol is variable and sizeof(struct iphdr) != sizeof(struct ipv6hdr)). Is the compiler smart enough to just use the largest possible value? The logic here is pretty similar to a union, which it of course wouldn't have any problems calculating the size of. Bj?rn