  Temporal memory safety bugs, especially use-after-free and double free bugs,
pose a major security threat to C programs. Real-world exploits utilizing these
bugs enable attackers to read and write arbitrary memory locations, causing
disastrous violations of confidentiality, integrity, and availability. Many
previous solutions retrofit temporal memory safety to C, but they all either
incur high performance overhead and/or miss detecting certain types of temporal
memory safety bugs.
  In this paper, we propose a temporal memory safety solution that is both
efficient and comprehensive. Specifically, we extend Checked C, a
spatially-safe extension to C, with temporally-safe pointers. These are
implemented by combining two techniques: fat pointers and dynamic key-lock
checks. We show that the fat-pointer solution significantly improves running
time and memory overhead compared to the disjoint-metadata approach that
provides the same level of protection. With empirical program data and hands-on
experience porting real-world applications, we also show that our solution is
practical in terms of backward compatibility -- one of the major complaints
about fat pointers.
