Skip to content

--Wwarn=invalid_header even if checking for validity #5327

Open
@some0necoding

Description

@some0necoding

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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionThis is a topic requesting clarification.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions