Zusammenfassung Alias-Analyse begonnen

This commit is contained in:
Marco Ammon 2020-08-11 17:47:43 +02:00
parent 1d4d54f1f2
commit e7dfdc35af
2 changed files with 97 additions and 1 deletions

Binary file not shown.

View File

@ -354,7 +354,103 @@
\end{itemize} \end{itemize}
\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} \section{Induktionsvarianten und schleifeninvarianter Code}