\section{Abstractions} \label{sec:abstractions} DataflowAPI starts from the control flow graphs generated by ParseAPI and the instructions generated by InstructionAPI. From these, it provides dataflow facts in a variety of forms. The key abstractions used by DataflowAPI are: \begin{itemize}[leftmargin=0pt,label=$\circ$] {\item {\scshape Abstract Location} represents a register or memory location in the program. DataflowAPI provides three types of abstract locations: register, stack, and heap. A register abstract location represents a register, and the same register at two different program locations is treated as the same abstract location. A stack abstract location consists of the stack frame to which it belongs and the offset within the stack frame. A heap abstract location consists of the virtual address of the heap variable. } {\item {\scshape Abstract Region} represents a set of abstract locations of the same type. If an abstract region contains only a single abstract location, the abstract location is precisely represented. If an abstract region contains more than one abstract location, the region contains the type of the locations. In the cases where it represents memory (either heap or stack), an abstract region also contains the memory address calculation that gives rise to this region. } {\item {\scshape Abstract Syntax Tree (AST)} represents a symbolic expression of an instruction's semantics. Specifically, an AST specifies how the value of an abstract location is modified by the instruction. } {\item {\scshape Assignment} represents a single data dependency of abstract regions in an instruction. For example, \texttt{xchg eax, ebx} creates two assignments: one from pre-instruction \texttt{eax} to post-instruction \texttt{ebx}, and one from pre-instruction \texttt{ebx} to post-instruction \texttt{eax}. } {\item {\scshape Stack Height} represents the difference between a value in an abstract location and the stack pointer at a function's call site. } \end{itemize}