Steensgards Algorithmus zusammengefasst (VL-08)

This commit is contained in:
Marco Ammon 2020-08-11 21:09:56 +02:00
parent e7dfdc35af
commit 66b3b16f04
2 changed files with 38 additions and 1 deletions

Binary file not shown.

View File

@ -450,7 +450,44 @@
\end{enumerate} \end{enumerate}
\end{enumerate} \end{enumerate}
\subsection{Steensgards Algorithmus} \subsection{Steensgards Algorithmus für interprozedurale, fluss-insensitive may-Analyse}
\begin{itemize}
\item Speichergraph: \begin{itemize}
\item Knoten: eine oder mehrere Speicherstellen
\item gerichtete Kante: \enquote{zeigt (möglicherweise) auf}-Beziehung, damit Alias: (*start, ziel)
\end{itemize}
\item approximiert Speichergraph: \begin{itemize}
\item Maximal eine abgehende Kante pro Knoten
\item Zusammenfassung mehrerer Speicherstellen, auf die Variable zeigen kann, zu einer Speicherstelle
\end{itemize}
\end{itemize}\begin{enumerate}
\item Einführung eines Knotens im Speichergraph pro Variable, wobei Kanten Zeiger repräsentieren
\item Fluss-ignorierendes, lineares Abarbeiten aller Anweisungen: \begin{itemize}
\item $a = \&b$: Kante zwischen $a$ und $b$ einfügen; sofern bereits Kante zwischen $a$ und $x$ existiert, rekursives Verschmelzen von $x$ und $b$
\item $a = b$:\begin{itemize}
\item $b$ ist Zeiger: Verschmelzen der Ziele von $a$ und $b$, anschließend zeigen beide auf diesen Knoten
\item $b$ ist kein Zeiger bzw. noch nicht erkannt: Annotiere $b$ mit $(a:b)$ (Falls später Zeigerziel $y$ von $b$ entdeckt wird, muss Kante von $a$ nach $y$ ergänzt werden)
\end{itemize}
\item $a = *b$: \begin{itemize}
\item $b$, $*b$ haben bereits ausgehende Kanten: Kante zwischen $a$ und $**b$ ergänzen
\item sonst: analog zu $a = b$ mit adäquaten Annotationen (TODO: Übung)
\end{itemize}
\item $*a = b$: \begin{itemize}
\item $a$, $*a$ mit ausgehenden Kanten: rekursives Verschmelzen von $*b$ und $**a$
\item sonst: TODO (Übung)
\end{itemize}
\item $a = b \oplus c$ mit $\oplus$ binärer Operation: \begin{itemize}
\item $a$, $b$, $c$ keine Zeiger: Annotation von $b$ und $c$ mit $(a:b)$ bzw. $(a:c)$
\item $b$ oder $c$ Zeiger: Kante von $a$ nach $*b$ hinzufügen, $c$ mit $(a:c)$ annotieren
\end{itemize}
\item $x = p(y_1, \textellipsis, y_n)$: \begin{itemize}
\item ggf. Speichergraph für $p$ berechnen
\item Zuweisungsregeln für $x$ und alle $y_i$ verwenden
\end{itemize}
\item Funktionszeiger: Bei Verschmelzen auf Typen achten
\end{itemize}
\end{enumerate}
\section{Induktionsvarianten und schleifeninvarianter Code} \section{Induktionsvarianten und schleifeninvarianter Code}