Open
Description
Maybe I'm missing something but shouldn't the assignments inside assign
state be always defined since I'm checking for validity?
parser MyParser(packet_in pkt,
out headers hdr,
inout metadata meta,
inout standard_metadata_t ig_intr_md)
{
state start {
transition parse_ethernet;
}
state parse_ethernet {
pkt.extract(hdr.ethernet);
transition select(hdr.ethernet.ether_type) {
TYPE_IPV4: parse_ipv4;
default: assign;
}
}
state parse_ipv4 {
pkt.extract(hdr.ipv4);
transition select(hdr.ipv4.protocol) {
TYPE_TCP: parse_tcp;
TYPE_UDP: parse_udp;
default: assign;
}
}
state parse_tcp {
pkt.extract(hdr.tcp);
transition assign;
}
state parse_udp {
pkt.extract(hdr.udp);
transition assign;
}
state assign {
meta.var1 = (hdr.ipv4.isValid()) ? hdr.ipv4.total_len : 0;
if (hdr.tcp.isValid()) {
meta.var2 = hdr.tcp.dst_port;
} else if (hdr.udp.isValid()) {
meta.var2 = hdr.udp.dst_port;
} else {
meta.var2 = 0;
}
transition accept;
}
}
This is the compiler output
./include/parser.p4(38): [--Wwarn=uninitialized_use] warning: hdr.ipv4.total_len may be uninitialized
meta.var1 = (hdr.ipv4.isValid()) ? hdr.ipv4.total_len : 0;
^^^^^^^^^^^^^^^^^^
./include/parser.p4(41): [--Wwarn=uninitialized_use] warning: hdr.tcp.dst_port may be uninitialized
meta.var2 = hdr.tcp.dst_port;
^^^^^^^^^^^^^^^^
./include/parser.p4(43): [--Wwarn=uninitialized_use] warning: hdr.udp.dst_port may be uninitialized
meta.var2 = hdr.udp.dst_port;
^^^^^^^^^^^^^^^^
./include/parser.p4(41): [--Wwarn=invalid_header] warning: accessing a field of a potentially invalid header hdr.tcp
meta.var2 = hdr.tcp.dst_port;
^^^^^^^
./include/parser.p4(43): [--Wwarn=invalid_header] warning: accessing a field of a potentially invalid header hdr.udp
meta.var2 = hdr.udp.dst_port;
^^^^^^^
./include/parser.p4(38): [--Wwarn=invalid_header] warning: accessing a field of a potentially invalid header hdr.ipv4
meta.var1 = (hdr.ipv4.isValid()) ? hdr.ipv4.total_len : 0;
^^^^^^^^
I can get the uninitialized_use
warning since it is specified that isValid()
returns true when at least one of the header fields is set, but why does the compiler complain about the header being potentially invalid?