diff --git a/verfahren.pdf b/verfahren.pdf index 5271813..c31b1d3 100644 Binary files a/verfahren.pdf and b/verfahren.pdf differ diff --git a/verfahren.tex b/verfahren.tex index bdc2414..73315e1 100644 --- a/verfahren.tex +++ b/verfahren.tex @@ -354,7 +354,103 @@ \end{itemize} \end{itemize} -\section{Aliasanalyse} +\section{Alias-Analyse} +\begin{itemize} + \item Aliase: Verschiedene Möglichkeiten auf gleiche Speicherstelle zuzugreifen + \item Sprachabhängige Quellen von Aliasen: \begin{itemize} + \item dynamisch allokierte Datenstrukturen + \item Zeiger + \item überlappende Speicherbereiche + \item Referenzen auf Arrays, -Abschnitte, -Dimensionen und -Elemente + \item Prozedurparameter + \item Zeigerarithmetik + \end{itemize} + \item Sprachunabhängige Quellen wie Transitivität ($a$ zeigt auf $b$ und $b$ zeigt auf $c$ $\rightarrow$ $c$ ist von $a$ erreichbar) + \item TODO: Aliase in Fortran, Pascal, C und Java (VL-07) + \item mögliche Aliase (may) müssen nur in einem Pfad Aliase sein + \item sichere Aliase (must) müssen in allen Pfaden Aliase sein + \item Fluss-ignorierende Analyse bestimmt, ob Namen irgendwo im KFG Aliase sein können: \begin{itemize} + \item vergleichsweise einfach berechenbar + \item oft für interprozedurale Analyse eingesetzt + \item Relation $\mathrm{Alias}(a, b)$ gibt an, dass $a$ und $b$ für ganze Prozedur Aliase sind, ist reflexiv, symmetrisch und bei must-Analyse auch transitiv + \end{itemize} + \item Fluss-sensitive Analyse bestimmt, ob Namen in einem Basisblock Aliase sein können: \begin{itemize} + \item aufwändige Berechnung + \item oft für intraprozedurale Analyse eingesetzt + \item Funktion $\mathrm{Alias}(P, v) = S$ gibt an, dass $v$ an Programmpunkt $P$ auf Speicherstelle $S$ zeigen kann + \item Bei may-Analyse: \begin{itemize} + \item $\mathrm{Alias}(P, v_1) \cap \mathrm{Alias}(P, v_2) \neq \emptyset \Leftrightarrow$ $v_1, v_2$ sind in $P$ Aliase + \item nicht transitiv + \end{itemize} + \item Bei must-Analyse: \begin{itemize} + \item $\vert \mathrm{Alias}(P, v)\vert = 1$, Aliase wenn Speicherstelle gleich + \item transitiv + \end{itemize} + \end{itemize} + \item intraprozedurale Analyse: \begin{itemize} + \item Betrachtung einer einzelnen Prozedur + \item Worst-Case-Annahmen bei Aufruf anderer Prozedur + \item häufig auf Datenflussproblem zurückgeführt + \end{itemize} + \item interprozedurale Analyse: \begin{itemize} + \item Standard-Verfahren + \item Andersens Algorithmus + \item Steensgards Algorithmus + \end{itemize} +\end{itemize} + +\subsection{DFA-Ansatz zur intraprozeduralen, fluss-sensitiven may-Analyse nach Muchnick} +\begin{itemize} + \item Vorwärtsproblem mit minimalen Grundblöcken + \item Sprachabhängige lokale Flussfunktionen für unmittelbare Auswirkungen pro Instruktion (Sammler/Gatherer): \begin{itemize} + \item TODO (VL-07) + \end{itemize} + \item Sprachunabhängiger Fixpunktpunktalgorithmus (Verbreiter/Propagator): \begin{itemize} + \item TODO (VL-07) + \end{itemize} +\end{itemize} + +\subsection{Standard-Verfahren zur interprozeduralen, fluss-insensitiven may-Analyse mit $\mathcal{O}(n^2 + n \cdot e)$} +\begin{itemize} + \item Alias-Quellen in Sprachen ohne \&-Operator: \begin{itemize} + \item Übergabe globaler Variable an Funktion + \item Übergabe der gleichen Variable an mehrere formale Parameter einer Funktion + \item Zugriff auf umgebende Variablen/formale Parameter bei geschachtelten Prozeduren (vgl. globale Variablen) + \end{itemize} + \item Prozeduraufrufgraph (PCG): \begin{itemize} + \item Knoten: Prozeduren des Programms + \item Gerichtete Kante von $p$ nach $q$ wenn $p$ $q$ aufrufen kann + \end{itemize} + \item Variablenbindungsgraph: \begin{itemize} + \item Knoten: formale Parameter + \item Gerichtete Kante von $x$ nach $y$ wenn $(p, q)$ in PCG, $x$ formaler Parameter von $p$ und $x$ Argument für formalen Parameter $y$ von $q$ + \item transitiver Abschluss liefert Alias-Menge der formalen Parameter (aber globale Variablen sind nicht berücksichtigt) + \end{itemize} + \item Paarbindungsgraph: \begin{itemize} + \item Knoten: alle Paare formaler Parameter + \item Gerichtete Kante von $(x, y)$ nach $(X, Y)$, wenn \begin{itemize} + \item $(x,y)$ bei einem Anruf an $(X,Y)$ gebunden werden oder + \item $(x,y)$ bei einem Aufruf im Inneren einer geschachtelten Prozedur an $(X, Y)$ gebunden werden, wobei ggf. Aliase von $x$ oder $y$ verwendet werden + \end{itemize} + \end{itemize} +\end{itemize}\begin{enumerate} + \item Aliase globaler Variablen: \begin{enumerate} + \item Bindungen von globalen Variablen an formalen Parametern entdecken + \item Aus Pfaden in Variablenbindungsgraph zusätzliche formale Parameter, an die globale Variable weitergegeben werden können, bestimmen (in topologischer Reihenfolge durchlaufen; bei Zyklen bis Fixpunkt erreicht) + \item Aliase der globalen Variablen ablesen + \end{enumerate} + \item Parameterpaare als Aliase: Zwei formale Parameter sind Aliase, wenn \begin{itemize} + \item die gleiche Variable an beide übergeben wird + \item eine globale Variable und einer ihrer Aliase übergeben wird + \end{itemize}\begin{enumerate} + \item Betrachtung aller Paare formaler Parameter + \item Markierung der Paare, die beim Aufruf zu Alias-Paaren werden können + \item Propagation von Alias-Informationen durch den PCG + \item Ablesen der Aliase formaler Parameter + \end{enumerate} +\end{enumerate} + +\subsection{Steensgards Algorithmus} \section{Induktionsvarianten und schleifeninvarianter Code}