From cf1594fbd42ec9f9d15e6c4d629d70e97c676229 Mon Sep 17 00:00:00 2001 From: Carlos Galindo Date: Wed, 4 Dec 2019 15:53:32 +0000 Subject: [PATCH] added missing files --- Secciones/conclusion.tex | 7 ++ Secciones/problem_solution.tex | 113 +++++++++++++++++++++++++++++++ img/nested-unconditional-cfg.dot | 22 ++++++ img/nested-unconditional-cfg.pdf | Bin 0 -> 16724 bytes img/nested-unconditional-pdg.dot | 23 +++++++ img/nested-unconditional-pdg.pdf | Bin 0 -> 16253 bytes 6 files changed, 165 insertions(+) create mode 100644 Secciones/conclusion.tex create mode 100644 Secciones/problem_solution.tex create mode 100644 img/nested-unconditional-cfg.dot create mode 100644 img/nested-unconditional-cfg.pdf create mode 100644 img/nested-unconditional-pdg.dot create mode 100644 img/nested-unconditional-pdg.pdf diff --git a/Secciones/conclusion.tex b/Secciones/conclusion.tex new file mode 100644 index 0000000..a661a47 --- /dev/null +++ b/Secciones/conclusion.tex @@ -0,0 +1,7 @@ +% !TEX encoding = UTF-8 +% !TEX spellcheck = en_GB +% !TEX root = ../paper.tex + +\chapter{Conclusion} + +\carlos{todo} \ No newline at end of file diff --git a/Secciones/problem_solution.tex b/Secciones/problem_solution.tex new file mode 100644 index 0000000..8e585a1 --- /dev/null +++ b/Secciones/problem_solution.tex @@ -0,0 +1,113 @@ +% !TEX encoding = UTF-8 +% !TEX spellcheck = en_GB +% !TEX root = ../paper.tex +\chapter{Proposed solution} +\label{cha:solution} + +This solution is an extension of Allen's \cite{AllH03}, with some modifications to solve the problem found \josep{el problem found no ha quedado claro. Se ha diluido entre la maraña abrumadora de casos. debes formular y dejar nitido cristalino cual es el problema y por qué no lo solucinan las dsemás aproximaciones, y poner un ejempllo concreto.}. Before starting, we need to split all instructions in three categories: + +\begin{description} + \item[statement] non-branching instruction, e.g. an assignment or method call. + \item[predicate] conditional branch, e.g. if statements and loops. + \item[pseudo-predicate] unconditional jump, e.g. break, continue, return, goto and throw instructions. +\end{description} + +Pseudo-predicates have been previously use to model unconditional jumps with a counter-intuitive reasoning: the next statement that would be executed were the pseudo-predicate not there would be executed, therefore it is control dependent on it. Going back to the definition of control dependency, one could argue that the real control dependency is on the conditional branch that lead to the \josep{???} + +\begin{figure} +\centering +\begin{lstlisting} +if (a) { + return a; +} +print(a); +\end{lstlisting} +\begin{lstlisting} +if (a) { + +} +print(a); +\end{lstlisting} +\caption{Example of pseudo-predicates control dependencies \josep{no se referencia a esta figura desde ningún sitio}} +\end{figure} + +This is the process used to build the Program Dependence Graph. \josep{Todo lo que sigue es demasiado verbose. No hay definiciones concretas. Es todo muy informal, y no hay un ongoing example que permita ver como las fases van evolucionando paso a paso. Nos reunimos para hablar de esta sección antes de reescribirla...} + +\begin{description} + \item[Step 1 (static analysis):] Identify for each instruction the variables read and defined. Each method is annotated with the global variables that they access or modify. + \item[Step 2 (build CFGs):] Build a CFG for each method of the program. The start of all methods is a vertex labeled \textsl{enter}, which also contains the assignments for parameters and global variables used (\texttt{var = var\_in}). The \textsl{enter} node is connected to the first instruction of the method. In a similar fashion, all methods end in an \textsl{exit} vertex with the corresponding output variables. There exists one \textsl{normal exit} to which the last instruction and all return instructions are connected. If the method can throw any exceptions, there exists one \textsl{error exit} for each type of exception that may be thrown. The normal and erroneous exits are connected to the \textsl{exit} node. + + Every normal statement is connected to the subsequent one by an unlabeled edge. Predicates have two outgoing edges, labeled \textsl{true} and \textsl{false}. Pseudo-predicates also have two outgoing edges. The \textsl{true} edge is connected to the destination of the jump (\textsl{normal exit} in the case of return, the begin or end of the loop in the case of continue and break, etc.). The \textsl{false} edge is a non-executable edge, marked with a dashed line, and it is connected to the next instruction that would be executed if the pseudo-predicate was a \textsl{nop}. + + Nodes that represent a call to a method $M$ include the transfer of parameters and variables that may be read or written to, then execute the call, and finally the extraction of modified variables. Call nodes are an exception to the previous paragraph, as they can have an unlimited amount of outgoing edges. Each outgoing edge lands on a pseudo-predicate which indicates if the execution was correct or an exception was raised. The executable edge of each pseudo-predicate will lead to the next instruction to be executed, whereas the non-executable one will lead to the end of the try-catch block. All call nodes can lead to a \textsl{normal return} node, which is linked to the next instruction, and one error node for each type of exception that may be thrown. The erroneous returns are labeled \textsl{catch ExType}, and lead to the first instruction in the corresponding catch block\footnotemark. Any exception that may not be caught will lead to the erroneous exit node of the method it's in. See the example for more details. + + \footnotetext{A problem presents itself here, as some exceptions may be able to trigger different catch blocks, due to the secuential nature of catches and polymorphism in Java. A way to fix this is to make catch blocks behave as a switch.}. %TODO + + \item[Step 3 (compute dependences):] For each node in the CFG, compute the control and data dependencies. Non-executable edges are only included when computing control dependencies.\\ + \carlos{put inside definition} + A node $a$ is \textsl{control dependent} on node $b$ iff $a$ post-dominates one but not all of $b$'s successors.\\ + A node $a$ is \textsl{data dependent} on node $b$ iff $b$ defines or may define a variable $x$, $a$ uses or may use $x$, and there is an $x$-definition-free path in the CFG from $b$ to $a$.\\ + \item[Step 4 (convert each CFG into a PDG):] each node of the CFG is one node of the PDG, with two exceptions. The first are the \textsl{enter}, \textsl{exit} and method call nodes, where the variable input and output assignments are split and placed as control-dependent on their original node. The second is the \textsl{exit} node, which is to be removed (the control-dependencies from \textsl{exit} to the variable outputs is transferred to the \textsl{enter} node). Then all the dependencies computed in the previous step are drawn. + \item[Step 5 (connect PDGs to form a SDG):] each method call to $M$ must be connected to the \textsl{enter} node in $M$'s PDG, as a control dependence. Each variable input from the method call is connected to a variable input of the method definition via a data dependence. Each variable output from the method definition is connected to the variable output of the method call via a data dependence. Each method exit is connected \carlos{complete}. +\end{description} + +\begin{itemize} + \item An extra type of control dependency represented by an ``exception edge''. It will represent the need to include a \textsl{catch} clause when an exception can be thrown. It is represented with a dotted line (dashed line is for data dependency). These edges have a special characteristic: when one is traversed, only ``exception edges'' may be traversed from the new nodes included in the slice. If the same node is reached by another kind of edge, the restriction is lifted. The behavior is documented in algorithm \ref{alg:2pass}, with changes from the original algorithm are \underline{underlined}. + \item Add an extra ``exception edge'' from each ``exit with exception of type T'' node, where the type of the exception is \texttt{t} to all the corresponding ``\texttt{throw e}'', such that \texttt{e} is or inherits from \texttt{T}. + \item Add an extra ``exception edge'' from each catch statement to every statement that can throw that error. + \item The exception edges will only be placed when the method or the try-catch statement are loop-carrier\footnote{Loop-carrier, when referring to a statement, is the property that in a CFG for the complete program, the node representing the statement is part of a loop, meaning that it could be executed again once it is executed.}. +\end{itemize} + +\begin{algorithm} % generate slice +\caption{Two-pass algorithm to obtain a backward static slice with exceptions} +\label{alg:2pass} +\begin{algorithmic}[1] + \REQUIRE SDG $\mathcal{G}$ representing program P. $\mathcal{G} = \{\mathcal{S}, \mathcal{E}\}$, where $\mathcal{S}$ is a set of states (some are statements) connected by a set of edges $\mathcal{E}$. Each edge, is a triplet composed of the type of edge (control, data or \underline{exception} dependency, summary, param-in, param-out), the source and destination of the edge. + \REQUIRE A slicing criterion, composed of a statement $s \in \mathcal{S}$ and a variable $v$. + \ENSURE $\mathcal{S}' \subseteq \mathcal{S}$, representing the slice of P according to the criterion provided. + + \medskip + \COMMENT{First pass (do not traverse output parameter edges).} + \STATE{$\mathcal{S}' \Leftarrow \emptyset$ (slice), $\mathcal{Q}\Leftarrow\{s\}$ (queue), $\mathcal{S}\Leftarrow \mathcal{S} - \{s\}$ (not visited), $\mathcal{R}\Leftarrow \emptyset$ (only visited via exception edge)} + \WHILE{$\mathcal{Q} \neq \emptyset$} + \STATE{$a \in \mathcal{Q}$} \COMMENT{Select an element from $\mathcal{Q}$} + \STATE{$\mathcal{Q} \Leftarrow \mathcal{Q} - \{a\}$} + \STATE{$\mathcal{S}' \Leftarrow \mathcal{S}' + \{a\}$} + \FORALL{$\mathcal{A}$ in $\{\{type, origin, a\} \in \mathcal{E}\}$} + \IF{$type \neq$ param-out \AND ($origin \notin \mathcal{S}'$ \OR ($origin \in \mathcal{R}$ \AND $a \notin \mathcal{R}$))} \label{line:param-out} + \IF{\underline{$a \in \mathcal{R}$}} + \IF{\underline{$type =$ exception}} + \STATE{\underline{$\mathcal{Q} \Leftarrow \mathcal{Q} + \{origin\}$}} + \STATE{\underline{$\mathcal{R} \Leftarrow \mathcal{R} + \{origin\}$}} + \ENDIF + \ELSE + \STATE{$\mathcal{Q} \Leftarrow \mathcal{Q} + \{origin\}$} + \ENDIF + \ENDIF + \ENDFOR + \ENDWHILE + \\ + \medskip + \COMMENT{Second pass (very similar, do not traverse input parameter edges).} + \STATE $\mathcal{Q} \Leftarrow \mathcal{S}'$ + \WHILE{$\mathcal{Q} \neq \emptyset$} + \STATE{$a \in \mathcal{Q}$} \COMMENT{Select an element from $\mathcal{Q}$} + \STATE{$\mathcal{Q} \Leftarrow \mathcal{Q} - \{a\}$} + \STATE{$\mathcal{S}' \Leftarrow \mathcal{S}' + \{a\}$} + \FORALL{$\mathcal{A}$ in $\{\{type, origin, a\} \in \mathcal{E}\}$} + \IF{$type \neq$ param-in \AND ($origin \notin \mathcal{S}'$ \OR ($origin \in \mathcal{R}$ \AND $a \notin \mathcal{R}$))} + \IF{\underline{$a \in \mathcal{R}$}} + \IF{\underline{$type =$ exception}} + \STATE{\underline{$\mathcal{Q} \Leftarrow \mathcal{Q} + \{origin\}$}} + \STATE{\underline{$\mathcal{R} \Leftarrow \mathcal{R} + \{origin\}$}} + \ENDIF + \ELSE + \STATE{$\mathcal{Q} \Leftarrow \mathcal{Q} + \{origin\}$} + \ENDIF + \ENDIF + \ENDFOR + \ENDWHILE +\end{algorithmic} +\end{algorithm} + +% vim: set noexpandtab:ts=2:sw=2:wrap diff --git a/img/nested-unconditional-cfg.dot b/img/nested-unconditional-cfg.dot new file mode 100644 index 0000000..b213404 --- /dev/null +++ b/img/nested-unconditional-cfg.dot @@ -0,0 +1,22 @@ +digraph cfg { + start -> while [label = T]; + while -> "if (Y)" [label = "T"]; + while -> D [label = "F"]; + D -> end; + "if (Y)" -> "if (Z)" [label=T]; + "if (Y)" -> C [label=F]; + "if (Z)" -> A [label=T]; + "if (Z)" -> B [label=F]; + //node [color="red"]; + A -> break1; + B -> break2; + break1 -> D [label = T]; + break2 -> D [label = T]; + while [label="while (X)"]; + break1 [label = "break"]; + break2 [label = "break"]; + break1 -> B [style=dashed, label = F]; + break2 -> C [style=dashed, label = F]; + C -> while; + start -> end [label = F, style = dashed]; +} \ No newline at end of file diff --git a/img/nested-unconditional-cfg.pdf b/img/nested-unconditional-cfg.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f58a8651d022176c1abcce8e01ff6b95f23ca8ed GIT binary patch literal 16724 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 {while; D}; + entry [style = filled]; + while [label = "while (X)", style = filled]; + while -> {"if (Y)" C}; + C [style = "bold,filled"]; + "if (Y)" -> C [label = 2]; + "if (Y)" [style = filled]; + "if (Y)" -> {"if (Z)" B break2}; + "if (Z)" -> {A break1}; + "if (Z)" [style = filled, color = lightblue]; + "if (Z)" -> {B break2} [label = 1]; + break1 -> {B break2} [label = 1]; + break2 -> {C while} [label = 2]; + {rank=same; A break1 B break2} + break1 [label = "break 1", style = filled, color = lightblue]; + break2 [label = "break 2", style = filled]; + {rank=same; "if (Z)" C} + {rank=same; while D} + {edge [style=invis]; + A -> break1 -> B -> break2; + } +} \ No newline at end of file diff --git a/img/nested-unconditional-pdg.pdf b/img/nested-unconditional-pdg.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a2b82fd53a3f933f8c692a0ae785c0aca0b5cae9 GIT binary patch literal 16253 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 literal 0 HcmV?d00001