"Robert P. J. Day" <rpjday@crashcourse.ca> 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