  Programmable packet-processing devices such as programmable switches and
network interface cards are becoming mainstream. These devices are configured
in a domain-specific language such as P4, using a compiler to translate
packet-processing programs into instructions for different targets. As networks
with programmable devices become widespread, it is critical that these
compilers be dependable.
  This paper considers the problem of finding bugs in compilers for packet
processing in the context of P4-16. We introduce domain-specific techniques to
induce both abnormal termination of the compiler (crash bugs) and
miscompilation (semantic bugs). We apply these techniques to (1) the
open-source P4 compiler (P4C) infrastructure, which serves as a common base for
different P4 back ends; (2) the P4 back end for the P4 reference software
switch; and (3) the P4 back end for the Barefoot Tofino switch.
  Across the 3 platforms, over 8 months of bug finding, our tool Gauntlet
detected 96 new and distinct bugs (62 crash and 34 semantic), which we
confirmed with the respective compiler developers. 54 have been fixed (31 crash
and 23 semantic); the remaining have been assigned to a developer. Our
bug-finding efforts also led to 6 P4 specification changes. We have open
sourced Gauntlet at p4gauntlet.github.io and it now runs within P4C's
continuous integration pipeline.
