From 80acb5243e3f1d4f8643199c0de69afd2c4e30e9 Mon Sep 17 00:00:00 2001 From: Carlos Galindo Date: Wed, 4 Dec 2019 15:47:37 +0000 Subject: [PATCH] added section 3.2 and part of 3.3; changed language to en-GB --- Secciones/background.tex | 14 ++- Secciones/incremental_slicing.tex | 183 +++++++++++++++++------------- Secciones/motivation.tex | 16 ++- Secciones/solution.tex | 113 ------------------ Secciones/state_of_the_art.tex | 4 +- img/breakpdg.dot | 35 +++--- img/breakpdg.pdf | Bin 13922 -> 13920 bytes img/throw-example-cfg.dot | 17 ++- img/throw-example-cfg.pdf | Bin 15718 -> 17087 bytes incremental_slicing.tex | 2 +- introduction.tex | 2 +- listings-config.tex | 2 +- motivation.tex | 2 +- paper.tex | 15 +-- solution.tex | 2 +- state_of_the_art.tex | 2 +- 16 files changed, 174 insertions(+), 235 deletions(-) delete mode 100644 Secciones/solution.tex diff --git a/Secciones/background.tex b/Secciones/background.tex index b2931c5..f2b7762 100644 --- a/Secciones/background.tex +++ b/Secciones/background.tex @@ -1,11 +1,16 @@ % !TEX encoding = UTF-8 -% !TEX spellcheck = en_US +% !TEX spellcheck = en_GB % !TEX root = ../paper.tex \chapter{Background} \label{cha:background} \section{Program slicing} + +\carlos{citar a Weiser solo hablando del inicio del campo} \\ +\carlos{el resto, utilizar surveys (Tip95, Sil12)} \\ +\carlos{mover párrafo a la intro, aquí poner definiciones formales de program slicing, citar a \cite{AgrH90b}} + \textsl{Program slicing} \cite{Wei81,Sil12}\sergio{hay alguna razon para que \cite{Sil12} no este en la intro?, la unica cita alli es\cite{Wei81}. Propongo eliminar \cite{Sil12} por homogeneidad}\josep{mas bien, tendria que estar 13 tambi\'en en la intro} is a debugging technique that answers the question: ``which parts of a program \josep{do?} affect a given statement and @@ -25,7 +30,7 @@ proposed \cite{Sil12}: statically or dynamically. \textsl{Static slicing} \cite{Wei81} produces slices which\josep{that} consider all possible executions of the program: the slice will be correct regardless of the input supplied. - In contrast, \textsl{dynamic slicing} \cite{KorL88} considers a single execution of the program, thus, limiting the slice to + In contrast, \textsl{dynamic slicing} \cite{KorL88,} considers a single execution of the program, thus, limiting the slice to the statements present in an execution log. The slicing criterion is expanded to include a position in the log\josep{execution history} that corresponds to one instance of the selected statement, making it much more specific. It may @@ -44,11 +49,10 @@ Since the definition of program slicing\sergio{Since Weiser defined program slic been \textsl{static backward slicing}, which obtains the list of statements that affect the value of a variable in a given statement, in all possible executions of the program (i.e., for any input data). -\begin{definition}[Strong static backward slice \cite{Wei81,HorwitzRB88}] +\begin{definition}[Strong static backward slice \cite{Wei81}] \label{def:strong-slice} - \carlos{One of the citations is the correct one.}\josep{la de Weiser} Given a program $P$ and a slicing criterion $C = \langle s,v \rangle$, where - $s$ is a statement and $v$ is a set\sergio{los set no se representan con letras mayusculas?} of variables in $P$ (the variables may + $s$ is a statement and $v$ is a set\sergio{los set no se representan con letras mayusculas?} \carlos{no} of variables in $P$ (the variables may or may not be used in $s$), $S$ is the \textsl{strong slice} of $P$ with respect to $C$ if $S$ has\sergio{fulfils?} the following properties: \begin{enumerate} diff --git a/Secciones/incremental_slicing.tex b/Secciones/incremental_slicing.tex index f396593..a8b31a3 100644 --- a/Secciones/incremental_slicing.tex +++ b/Secciones/incremental_slicing.tex @@ -1,5 +1,5 @@ % !TEX encoding = UTF-8 -% !TEX spellcheck = en_US +% !TEX spellcheck = en_GB % !TEX root = ../paper.tex \chapter{Main explanation?} \label{cha:incremental} @@ -38,6 +38,7 @@ to the result of evaluating the conditional expression in the guard of the predicate. \begin{definition}[Control Flow Graph \carlos{add original citation}] + \label{def:cfg} A \emph{control flow graph} $G$ of a program $P$ is a directed graph, represented as a tuple $\langle N, E \rangle$, where $N$ is a set of nodes, composed of a method's statements plus two special nodes, ``Start'' and ``End''; and $E$ is a set of edges of the form $e = \left(n_1, n_2\right) | n_1, n_2 \in N$. Most algorithms to generate the SDG mandate the ``Start'' node to be the only source and ``End'' to be the only sink in the graph. \carlos{Is it necessary to define source and sink in the context of a graph?}. Edges are created according to the possible execution paths that exist; each statement is connected to any statement that may immediately follow it. Formally, an edge $e = (n_1, n_2)$ exists if and only if there exists an execution of the program where $n_2$ is executed immediately after $n_1$. In general, expressions are not evaluated; so an \texttt{if} instruction has two outgoing edges even if the condition is always true or false, e.g. \texttt{1 == 0}. @@ -46,6 +47,7 @@ predicate. To build the PDG and then the SDG, there are two dependencies based directly on the CFG's structure: data and control dependence. \begin{definition}[Postdominance \carlos{add original citation?}] + \label{def:postdominance} Vertex $b$ \textit{postdominates} vertex $a$ if and only if $b$ is on every path from $a$ to the ``End'' vertex. \end{definition} @@ -55,6 +57,7 @@ To build the PDG and then the SDG, there are two dependencies based directly on \end{definition} \begin{definition}[Data dependency \carlos{add original citation}] + \label{def:data-dep} Vertex $b$ is \textit{data dependent} on vertex $a$ ($a \datadep b$) if and only if $a$ may define a variable $x$, $b$ may use $x$ and there exists a \carlos{could it be ``an''??} $x$-definition free path from $a$ to $b$. Data dependency was originally defined as flow dependency, and split into loop and non--loop related dependencies, but that distinction is no longer useful to compute program slices. @@ -67,6 +70,7 @@ represented as a thin solid line, and the latter as a thick solid line. In the examples, data dependencies will be thin solid red lines. \begin{definition}[Program dependence graph] + \label{def:pdg} The \textsl{program dependence graph} (PDG) is a directed graph (and originally a tree) represented by three elements: a set of nodes $N$, a set of control edges $E_c$ and a set of data edges $E_d$. The set of nodes corresponds to the set of nodes of the CFG, excluding the ``End'' node. @@ -80,6 +84,7 @@ Finally, the SDG is built from the combination of all the PDGs that compose the program. \begin{definition}[System dependence graph] + \label{def:sdg} The \textsl{system dependence graph} (SDG) is a directed graph that represents the control and data dependencies of a whole program. It has three kinds of edges: control, data and function call. The graph is built combining multiple PDGs, with the ``Start'' nodes labeled after the function they begin. There exists one function call edge between each node containing one or more calls and each of the ``Start'' node of the method called. In a programming language where the function call is ambiguous (e.g. with pointers or polymorphism), there exists one edge leading to every possible function called. \end{definition} @@ -138,46 +143,35 @@ To such end, the following modifications are made to the different graphs: \section{Unconditional control flow} Even though the initial definition of the SDG was useful to compute slices, the -language covered was not enough for the typical language of the 1980's, which +language covered was not enough for the typical language of the 1980s, which included (in one form or another) unconditional control flow. Therefore, one of the first additions contributed to the algorithm to build system dependence graphs was the inclusion of unconditional jumps, such as ``break'', -``continue'', ``goto'' and ``return'' statements (or any other equivalent). A +``continue'', ``goto'' and ``return'' statements (or any other equivalent). A naive representation would be to treat them the same as any other statement, but with the outgoing edge landing in the corresponding instruction (outside the -loop, at the loop condition, at the method's end, etc.). An alternative -approach is to represent the instruction as an edge, not a vertex, connecting -the previous statement with the next to be executed. Both of these approaches -fail to generate a control dependence from the unconditional jump, as the -definition of control dependence (see Definition~\ref{def:ctrl-dep}) requires a -vertex to have more than one successor for it to be possible to be a source of -control dependence. From here, there stem two approaches: the first would be to +loop, at the loop condition, at the method's end, etc.). +An alternative approach is to represent the instruction as an edge, not a vertex, connecting the previous statement with the next to be executed. Both of these approaches fail to generate a control dependence from the unconditional jump, as the definition of control dependence (see definition~\ref{def:ctrl-dep}) requires a vertex to have more than one successor for it to be possible to be a source of control dependence. +From here, there stem two approaches: the first would be to redefine control dependency, in order to reflect the real effect of these instructions ---as some authors~\cite{DanBHHKL11} have tried to do--- and the second would be to alter the creation of the SDG to ``create'' those -dependencies, which is the most widely--used solution \added{\cite{pending1,pending2}}. +dependencies, which is the most widely--used solution \cite{BalH93}. -The most popular approach was proposed by Ball and Horwitz\cite{BalH93}, and -represents unconditional jumps as a \textsl{pseudo--predicate}. The true edge -would lead to the next instruction to be executed, and the false edge would be -non-executable or \textit{dummy} edges, connected to the instruction that would -be executed were the unconditional jump a \textit{nop}\josep{esta frase no se entiende}. The consequence of this -solution is that every instruction placed after the unconditional jump is -control dependent on the jump, as can be seen in Figure~\ref{fig:break-graphs}. -In the example \josep{con "the example" te refieres a la figura? Es importante distinguir entre figuras y ejemplos. Lo que este texto te está pidiendo a gritos es que crees un entorno ejemplo, con su identificador. Ese ejemplo muestre y explique la figura, y desde aqui cites el ejemplo, no la figura.}, when slicing with respect to variable $a$ on line 5, every -statement would be included, save for ``print(a)''. Line 4 is not strictly -necessary in this example ---in the context of weak slicing---, but is included -nonetheless. In the original paper\josep{cual? citalo entre parentesis si es un recordatorio}, the transformation is proved to be -complete, but not correct, as for some examples, the slice includes more -unconditional jumps that would be strictly necessary, even for weak slicing. \josep{yo incluiria uno de esos ejemplos aqui} -Ball and Horwitz theorize that a more correct approach would be possible, if it -were \added{not}\deleted{n't} for the limitation of slices to be a subset of statements of the -program, in the same order as in the original. +The most popular approach was proposed by Ball and Horwitz~\cite{BalH93}, classifying instructions into three separate categories: + +\begin{description} + \item[Statement.] Any instruction that is not a conditional or unconditional jump. It has one outgoing edge in the CFG, to the next instruction that follows it in the program. + \item[Predicate.] Any conditional jump instruction, such as \texttt{while}, \texttt{until}, \texttt{do-while}, \texttt{if}, etc. It has two outgoing edges, labeled \textit{true} and \textit{false}; leading to the corresponding instructions. + \item[Pseudo--predicates.] Unconditional jumps (e.g. \texttt{break}, \texttt{goto}, \texttt{continue}, \texttt{return}); are like predicates, with the difference that the outgoing edge labeled \textit{false} is marked as non--executable, and there is no possible execution where such edge would be possible, according to the definition of the CFG (as seen in definition~\ref{def:cfg}). Originally the edges had a specific reasoning backing them up: the \textit{true} edge leads to the jump's destination and the \textit{false} one, to the instruction that would be executed if the unconditional jump was removed, or converted into a \texttt{no op} (a blank operation that performs no change to the program's state). This specific behavior is used with unconditional jumps, but no longer applies to pseudo--predicates, as more instructions have used this category as means of ``artificially'' \carlos{bad word choice} generating control dependencies. +\end{description} + +As a consequence of this classification, every instruction after an unconditional jump $j$ is control--dependent (either directly or indirectly) on $j$ and the structure containing it (a conditional statement or a loop), as can be seen in the following example. \begin{figure} -\centering -\begin{minipage}{0.3\linewidth} - \begin{lstlisting} + \centering + \begin{minipage}{0.3\linewidth} + \begin{lstlisting} static void f() { int a = 1; while (a > 0) { @@ -186,62 +180,97 @@ static void f() { } System.out.println(a); } - \end{lstlisting} -\end{minipage} -\begin{minipage}{0.6\linewidth} - \includegraphics[width=0.4\linewidth]{img/breakcfg} - \includegraphics[width=0.59\linewidth]{img/breakpdg} -\end{minipage} -\caption{A program with unconditional control flow, its CFG (center) and PDG(right).} -\label{fig:break-graphs} -\end{figure} + \end{lstlisting} + \end{minipage} + \begin{minipage}{0.6\linewidth} + \includegraphics[width=0.4\linewidth]{img/breakcfg} + \includegraphics[width=0.59\linewidth]{img/breakpdg} + \end{minipage} + \caption{A program with unconditional control flow, its CFG (center) and PDG(right).} + \label{fig:break-graphs} +\end{figure} + +\begin{example}[Control dependencies generated by unconditional instructions] + \label{exa:unconditional} + Figure~\ref{fig:break-graphs} showcases a small program with a \texttt{break} statement, its CFG and PDG with a slice in gray. The slicing criterion (line 5, variable $a$) is control dependent on both the unconditional jump and its surrounding conditional instruction (both on line 4); even though it is not necessary to include it (in the context of weak slicing). + + Note: the ``Start'' node $S$ is also categorized as a pseudo--statement, with the \textit{false} edge connected to the ``End'' node, therefore generating a dependence from $S$ to all the nodes inside the method. This removes the need to handle $S$ with a special case when converting a CFG to a PDG, but lowers the explainability of non--executable edges as leading to the ``instruction that would be executed if the node was absent or a no--op''. +\end{example} + +The original paper~\cite{BalH93} does prove its completeness, but disproves its correctness by providing a counter--example similar to example~\ref{exa:nested-unconditional}. This proof affects both weak and strong slicing, so improvements can be made on this proposal. The authors postulate that a more correct approach would be achievable if the slice's restriction of being a subset of instructions were lifted. + +\begin{example}[Nested unconditional jumps] + \label{exa:nested-unconditional} + In the case of nested unconditional jumps where both jump to the same destination, only one of them (the out--most one) is needed. Figure~\ref{fig:nested-unconditional} showcases the problem, with the minimal slice \carlos{have not defined this yet} in gray, and the algorithmically computed slice in light blue. Specifically, lines 3 and 5 are included unnecessarily. + + \begin{figure} + \begin{minipage}{0.15\linewidth} + \begin{lstlisting} +while (X) { + if (Y) { + if (Z) { + A; + break; + } + B; + break; + } + C; +} +D; + \end{lstlisting} + \end{minipage} + \begin{minipage}{0.84\linewidth} + \includegraphics[width=0.4\linewidth]{img/nested-unconditional-cfg} + \includegraphics[width=0.59\linewidth]{img/nested-unconditional-pdg} + \end{minipage} + \caption{A program with nested unconditional control flow (left), its CFG (center) and PDG (right).} + \label{fig:nested-unconditional} + \end{figure} +\end{example} + +\carlos{Add proposals to fix both problems showcased.} \section{Exceptions} +Exception handling was first tackled in the context of Java program slicing by Sinha et al. \cite{SinH98}, with later contributions by Allen and Horwitz~\cite{AllH03}. There exist contributions for other programming languages, which will be explored later (chapter~\ref{cha:state-art}) and other small contributions. The following section will explain the treatment of the different elements of exception handling in Java program slicing. + As seen in section~\ref{sec:intro-exception}, exception handling in Java adds -two constructs: the \texttt{throw} and the \texttt{try-catch} statements. The -first one resembles an unconditional control flow statement, with an unknown (on -compile time) destination. The exception will be caught by a \texttt{catch} of -the corresponding type or a supertype ---if it exists. Otherwise, it will crash -the corresponding thread (or in single-threaded programs, stop the Java Virtual -Machine). The second stops the exceptional control flow conditionally, based on -the dynamic typing of the exception thrown. Both introduce challenges that must -be solved. +two constructs: \texttt{throw} and \texttt{try-catch}. Structurally, the +first one resembles an unconditional control flow statement carrying a value ---like \texttt{return} statements--- but its destination is not fixed, as it depends on the dynamic typing of the value. +If there is a compatible \texttt{catch} block, execution will continue inside it, otherwise the method exits with the corresponding value as the error. +The same process is repeated in the method that called the current one, until either the call stack is emptied or the exception is successfully caught. +If the exception is not caught at all, the program exits with an error ---except in multi--threaded programs, in which case the corresponding thread is terminated. +The \texttt{try-catch} statement can be compared to a \texttt{switch} which compares types (with \texttt{instanceof}) instead of constants (with \texttt{==} and \texttt{Object\#equals(Object)}). Both structures require special handling to place the proper dependencies, so that slices are complete and as correct as can be. \subsection{\texttt{throw} statement} -The \texttt{throw} statement represents two elements at the same time: an -unconditional jump and an erroneous exit from its method. The first one has -been extensively covered and solved, but the second \added{one} requires a small addition -to the CFG: instead of having a single ``End'' node, it will be split in two ----normal and error exit---, though the ``End'' cannot be removed, as a restriction -of most slicing algorithms is that the CFG have only one sink node. Therefore all -nodes that connected to the ``End'' will now lead to ``Normal exit'', all throw -statements' true outgoing edges will connect to the ``Error exit'', and both exit -nodes will converge on the ``End'' node. +The \texttt{throw} statement compounds two elements in one instruction: an +unconditional jump with a value attached and a switch to an ``exception mode'', in which the statement's execution order is disregarded. The first one has been extensively covered and solved; as it is equivalent to the \texttt{return} instruction, but the second one requires a small addition to the CFG: there must be an alternative control flow, where the path of the exception is shown. For now, without including \texttt{try-catch} structures, any exception thrown will exit its method with an error; so a new ``Error end'' node is needed. The preexisting ``End'' node is renamed ``Normal end'', but now the CFG has two distinct sink nodes; which is forbidden in most slicing algorithms. To solve that problem, a general ``End'' node is created, with both normal and exit ends connected to it; making it the only sink in the graph. -\texttt{throw} statements in Java take a single value, a subtype of \texttt{Throwable}, -and that value is used to stop the propagation of the exception; which can be handled -as a returned value. This treatment of \texttt{throw} statements only modifies the -structure of the CFG, without altering any other algorithm, nor the basic definitions -for control and data dependencies, making it very easy to incorporate to any existing -slicing software solution that follows the general model described. +In order to properly accomodate a method's output variables (global variables or parameters passed by reference that have been modified), variable unpacking is -\begin{example}[CFG of an uncaught \texttt{throw} statement] \ \\ - \begin{minipage}{0.69\linewidth} - \begin{lstlisting} - double f(int x) { - if (x < 0) - throw new RuntimeException() - return Math.sqrt(x) - } - \end{lstlisting} - By analyzing the CFG, we can see that both exits are control dependent on the \texttt{throw} - statement; data dependencies present no special case in this example. - \end{minipage} - \begin{minipage}{0.3\linewidth} - \includegraphics[width=\linewidth]{img/throw-example-cfg} - \end{minipage} +This treatment of \texttt{throw} statements only modifies the structure of the CFG, without altering the other graphs, the traversal algorithm, or the basic definitions for control and data dependencies. That fact makes it easy to incorporate to any existing program slicer that follows the general model described. Example~\ref{exa:throw} showcases the new exit nodes and the treatment of the \texttt{throw} as if it were an unconditional jump whose destination is the ``Error exit''. + +\begin{example}[CFG of an uncaught \texttt{throw} statement] + Consider the simple Java method on the right of figure~\ref{fig:throw}; which performs a square root if the number is positive, throwing otherwise a \texttt{RuntimeError}. The CFG in the centre illustrates the treatment of \texttt{throw}, ``normal exit'' and ``error exit'' as pseudo--statements, and the PDG on the right describes the + \label{exa:throw} + \begin{figure}[h] + \begin{minipage}{0.3\linewidth} + \begin{lstlisting} +double f(int x) { + if (x < 0) + throw new RuntimeException() + return Math.sqrt(x) +} + \end{lstlisting} + \end{minipage} + \begin{minipage}{0.69\linewidth} + \includegraphics[width=\linewidth]{img/throw-example-cfg} + \end{minipage} + \caption{A simple program with a \texttt{throw} statement, its CFG (centre) and its PDG (left).} + \label{fig:throw} + \end{figure} \end{example} \subsection{\texttt{try-catch} statement} diff --git a/Secciones/motivation.tex b/Secciones/motivation.tex index dac2f1e..d860499 100644 --- a/Secciones/motivation.tex +++ b/Secciones/motivation.tex @@ -1,5 +1,5 @@ % !TEX encoding = UTF-8 -% !TEX spellcheck = en_US +% !TEX spellcheck = en_GB % !TEX root = ../paper.tex \chapter{Introduction} @@ -7,6 +7,8 @@ \section{Motivation} \label{sec:motivation} +\carlos{Presentar más que definir program slicing.} + Program slicing~\cite{Wei81} is a debugging technique that, given a line of code and a set of variables of a program, simplifies such program so that the only parts left of it are those that affect or are affected by the values of the selected variables. \josep{aqui, antes del ejemplo, habria que decir de manera informal que es un slice y que es un SC} @@ -48,7 +50,9 @@ void f(int x) { \end{center} \end{example} -Slices are executable programs whose execution produces the same values \sergio{OJO!, cuidao con ese jardin que luego esta el weak slice.}\josep{puedes evitar el jard\'in empezando la frase así: ``In its more general form, slices are..."} +\carlos{Detallar los distintos usos y evitar relacionar debugging con ejecutable.} + +Slices are executable programs whose execution produces the same values \sergio{OJO!, cuidao con ese jardin que luego esta el weak slice.}\josep{puedes evitar el jard\'in empezando la frase así: ``In its more general form, slices are..."} \carlos{Alternativa: programa que se comporta igual (luego se define mismos valores o lista prefija.)} for the specified line and variable as the original program, and they are used to facilitate debugging of large and complex programs, where the control and data flow may not be easily understandable. \josep{en realidad los executable slices no suelen usarse en debugging. M\'as bien en Program specialization...} @@ -135,13 +139,17 @@ void g(int a) throws Exception { \end{center} \end{example} -Example~\ref{exa:program-slicing2} \josep{is a contribution of this work because it} showcases an important error in the current slicing procedure for programs that handle errors with exceptions\josep{\deleted{; because}\added{where}} the \texttt{catch} block is disregarded. The only way a \texttt{catch} block can be included in the slice is if a statement inside it is needed for another reason. However, Allen and Horwitz did not encounter\josep{tackle? account for?} this problem in their paper~\cite{AllH03}, as the values outputted by method calls are extracted after the \texttt{normal return} and each \texttt{catch}, and in a typical method call with output, the \texttt{catch} is included by default when the outputted value is used. This detail makes the error much smaller, as most \texttt{try-catch} structures are run to obtain a value. \sergio{Anyadir el nodo \textit{out} para que lo que has explicado aqui quede mas comprensible. Viendo que existe el nodo \textit{out}, pero que nadie el SC no lo necesita.} +\carlos{mover todas las imágenes y segmentos de código a figuras separadas} \\ +\carlos{indicar la conexión entre grafos} \\ +\carlos{mover el grafo y la explicación a después del background; el porqué y la solución se presenta en sección X} + +Example~\ref{exa:program-slicing2} \josep{is a contribution of this work because it} showcases an important error in the current slicing procedure for programs that handle errors with exceptions\josep{\deleted{; because}\added{where}} the \texttt{catch} block is disregarded. The only way a \texttt{catch} block can be included in the slice is if a statement inside it is needed for another reason. However, Allen and Horwitz~\cite{AllH03} did not encounter\josep{tackle? account for?} this problem in their paper, as the values outputted by method calls are extracted after the \texttt{normal return} and each \texttt{catch}, and in a typical method call with output, the \texttt{catch} is included by default when the outputted value is used. This detail makes the error much smaller, as most \texttt{try-catch} structures are run to obtain a value. \sergio{Anyadir el nodo \textit{out} para que lo que has explicado aqui quede mas comprensible. Viendo que existe el nodo \textit{out}, pero que nadie el SC no lo necesita.} \added{There is also another }\deleted{A} notable case where a method that may throw an exception is run and no value is recovered (at least from the point of view of program slicing)\added{. It occurs}\deleted{is} when writing to the filesystem or making connections to servers, such as a database or a webservice to store information. In this case, if no confirmation is outputted signaling whether the storage of information was correct, the \texttt{catch} block \deleted{will be}\added{is} omitted, and the \josep{program} slicer \josep{\deleted{software}} \deleted{will} produce\added{s} an incorrect result. \section{Contributions} -The main contribution of this paper\sergio{paper?research?work?}\josep{work o research} is a +The main contribution of this paper\carlos{thesis}\sergio{paper?research?work?}\josep{work o research} is a \added{new approach for program slicing with exception handling for Java programs.} \deleted{complete technique for program slicing programs in the presence of exception handling constructs for Java}. \added{Our approach}\deleted{This technique} extends the previous technique \added{proposed} by Allen et al. \cite{AllH03}. It \added{is able to properly slice}\deleted{considers} all cases considered in \deleted{that}\added{their} work, but it also provides a solution to \sergio{some other} cases not \deleted{considered}\added{contemplated}\josep{considered} by them. For the sake of completeness and in order to understand the process that leaded us to this solution, we \josep{\deleted{will present}\josep{first summarize the fundamentals o background}} a brief history\sergio{background?} of program slicing \added{terminology}, specifically those changes that have affected exception handling.\sergio{delving deeper in the progress of program slicing techniques related to exception handling.?} Furthermore, we provide a summary of the diff --git a/Secciones/solution.tex b/Secciones/solution.tex deleted file mode 100644 index a3c281f..0000000 --- a/Secciones/solution.tex +++ /dev/null @@ -1,113 +0,0 @@ -% !TEX encoding = UTF-8 -% !TEX spellcheck = en_US -% !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/Secciones/state_of_the_art.tex b/Secciones/state_of_the_art.tex index d35e62a..ad0ad24 100644 --- a/Secciones/state_of_the_art.tex +++ b/Secciones/state_of_the_art.tex @@ -1,7 +1,7 @@ % !TEX encoding = UTF-8 -% !TEX spellcheck = en_US +% !TEX spellcheck = en_GB % !TEX root = ../paper.tex -\chapter{State of the art} +\chapter{Related work} \label{cha:state-art} Slicing was proposed \cite{Wei81} and improved until the proposal of the current system (the SDG) \carlos{(citation)}. Specifically in the context of exceptions, multiple approaches have been attempted, with varying degrees of success. There exist commercial solutions for various programming languages: \carlos{name them and link}. diff --git a/img/breakpdg.dot b/img/breakpdg.dot index c02a97c..635d227 100644 --- a/img/breakpdg.dot +++ b/img/breakpdg.dot @@ -1,22 +1,29 @@ digraph g { - "f()" [shape=box, rank=min]; + "f()" [shape=box, rank=min, style = filled]; // Rank adjustment + { node [style=filled] { rank = same; "int a = 1"; "while (a > 0)"; } + "if (a > 10)"; break; + } { rank = same; "print(a)"; "a++"; } { rank = max; "a++"; "print(a)"; } + "a++" [style="filled,bold"]; // Control flow - "f()" -> "int a = 1" [style=bold]; - "f()" -> "while (a > 0)" [style=bold]; - "while (a > 0)" -> "if (a > 10)" [style=bold]; - "if (a > 10)" -> "break" [style=bold]; - "break" -> "print(a)" [style=bold]; - "break" -> "a++" [style=bold]; - "break" -> "while (a > 0)" [style=bold]; + "f()" -> "while (a > 0)"; + "f()" -> "int a = 1"; + "while (a > 0)" -> "if (a > 10)"; + "if (a > 10)" -> "break"; + "break" -> "print(a)"; + "break" -> "a++"; + "break" -> "while (a > 0)"; // Data flow - "int a = 1" -> "while (a > 0)" [color=red]; - "int a = 1" -> "if (a > 10)" [color=red]; - "int a = 1" -> "print(a)" [color=red]; - "a++" -> "a++" -> "while (a > 0)" [color=red]; - "a++" -> "if (a > 10)" [color=red]; - "a++" -> "print(a)" [color=red]; + { edge [color = red]; + "int a = 1" -> "while (a > 0)"; + "int a = 1" -> "if (a > 10)"; + "int a = 1" -> "print(a)"; + "a++" -> "a++"; + "a++" -> "while (a > 0)"; + "a++" -> "if (a > 10)"; + "a++" -> "print(a)" [constraint = true]; + } } \ No newline at end of file diff --git a/img/breakpdg.pdf b/img/breakpdg.pdf index 56966e8d5b9fe8bd6725ef5b1df7f56192141822..8c900ec19f57d1f958988db9dc7d4768b6afdbb5 100644 GIT binary patch delta 9783 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 = x_in>]; End [shape=box]; Start -> End [style=dashed]; Start -> "if (x < 0)" -> "throw" -> "Error exit" -> End; "throw" -> "return Math.sqrt(x)" [style=dashed]; "if (x < 0)" -> "return Math.sqrt(x)" -> "Normal exit" -> End; -} \ No newline at end of file + // pdg + f [label="f()",shape=rect]; + x_in [label = "x = x_in", style = dashed]; + if [label = "if (x < 0)"]; + t [label = "throw"]; + ret [label = "return Math.sqrt(x)"]; + ee [label = "error exit", style = dashed]; + ne [label = "normal exit", style = dashed]; + f -> x_in; + f -> if -> t -> {ret ee ne}; + { edge [color = red, constraint = false]; + x_in -> {if ret}; + } +} diff --git a/img/throw-example-cfg.pdf b/img/throw-example-cfg.pdf index 5c6459c9824bd8a906802fa14405a5bd8df13d02..a4bc7df4900ddfbd4165aa449d6f589f0d6345e7 100644 GIT binary patch delta 13075 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

5i^NL%#dk8R(I;; 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%0Adu2qAv`)oToI8%-+9SJJz zRkoixfar&>F(5r15PJk!j(+W_Gwp*xkLT5ZB?gO6`iC4~0uEpqio=Tu?Wk;(N6=GC zVEt4dzRRu`4rCvD^{DO67DLF~V!_y#u~oM&qr>4a_v)TNw*;%b`9?BuGj+JVw7+zw zg5Ggo{Z29lhS!^!Bo`)SN80BM*~Ad}GNgA@hEW-juvfL76s^0&rVuPC;!YWgjP(jp zvrV6UpBKpp0l9+-cd5;_^SEys&xR^PDOmJnEW2<17D>|J>cY;UBTBq{L&IlvkE#rI zp+!XgV#BMyOf}et4v=YLV_CT8`D>>sNc60)U)np}7__f^VQ8xK7d0OI>@jCY??s(L zliDgu{loIcx6%4Thu*0&ak%Qn9gn;BFX+Q&q{C=qfIE>M+@f}o=95ex$3)uD0HzUK z?wE`^jI}G9&x)LylZl1`$q3Kck`L{{%%)dbM z{_Z!&Z;ZhTJ*+K;1LzFW1?f?co8Vi%K)ER{P$&CGoM+by^a&cC?t47-c+tcuWJ|j< zOGwvANzmpgVAnR{mfEl8YN0knk#h8b+gVB;V{r0u+RTpJN7gj|6Z6i0OL@CBj4wO8 zoz%y2G<8sm-ZfAj@ANRCVV0c+4cZc=Y~j#USc4`{C?p25$9J(zpN(!VKk;8{l0}B+6 zsN_3w&r9&Rp${w@C&GRxeMdI?eExW_fh}M_Ke@|iG{pNFRNixxKKD0q?evpYvdeKK z9+EyCQ?=aoRSO4LDUw6+8G}fLl+U#$?_aV3oY6B z`0C)-9cDb4V*G;s`Sm_gUuT^|(rmFQw8()~z!mDpn1H<^B`Hd`3cf_%!hBcY{$J?; z-O^xBGfFQ~5|{`kWWi60RBCT&sZJstu&iqq@rdn+)`II_8;&Py;4PA+ct|K@n!Sg?V z#Ky(S@jZ@QR8XIt!-$*5fZc@kJFhVZFAonZtBDbZ35Ox8fiX9?k%56A!jJ#o2$?RK epdf;ivw@?to1=;8f9N}QZdL?pY6%5Ng#QQPT7|O! diff --git a/incremental_slicing.tex b/incremental_slicing.tex index 6147745..2015856 100644 --- a/incremental_slicing.tex +++ b/incremental_slicing.tex @@ -1,5 +1,5 @@ % !TEX encoding = UTF-8 -% !TEX spellcheck = en_US +% !TEX spellcheck = en_GB % !TEX root = paper.tex \chapter{Main explanation?} diff --git a/introduction.tex b/introduction.tex index 69905b2..3d0f0f7 100644 --- a/introduction.tex +++ b/introduction.tex @@ -1,5 +1,5 @@ % !TEX encoding = UTF-8 -% !TEX spellcheck = en_US +% !TEX spellcheck = en_GB % !TEX root = paper.tex \chapter{Introduction} diff --git a/listings-config.tex b/listings-config.tex index 6cac690..d5a7cf0 100644 --- a/listings-config.tex +++ b/listings-config.tex @@ -1,5 +1,5 @@ % !TEX encoding = UTF-8 -% !TEX spellcheck = en_US +% !TEX spellcheck = en_GB % !TEX root = paper.tex \lstset{ % Numbering diff --git a/motivation.tex b/motivation.tex index 0807ca8..3db63d8 100644 --- a/motivation.tex +++ b/motivation.tex @@ -1,5 +1,5 @@ % !TEX encoding = UTF-8 -% !TEX spellcheck = en_US +% !TEX spellcheck = en_GB % !TEX root = paper.tex \chapter{Introduction} diff --git a/paper.tex b/paper.tex index 67da02e..3f6d28d 100644 --- a/paper.tex +++ b/paper.tex @@ -1,5 +1,5 @@ % !TEX encoding = UTF-8 -% !TEX spellcheck = en_US +% !TEX spellcheck = en_GB % !TEX root = paper.tex \documentclass[a4paper,twoside]{report} @@ -88,18 +88,9 @@ \include{Secciones/motivation} \include{Secciones/background} \include{Secciones/incremental_slicing} +\include{Secciones/problem_solution} \include{Secciones/state_of_the_art} -\include{Secciones/solution} - -\chapter{TODO} -\begin{enumerate} - \item Averiguar si el código adicional que cogen los saltos incondicionales puede reducirse con algún tipo de arco. (menos breaks) - - Solución: ver - \item Averiguar si el arco 1 es imprescindible (buscar contraejemplo). - \item Solución alternativa para no tener que elegir entre el 1 y el 2. Sugerencia: sólo coger el catch por control si ambos arcos (1, 2) están activos. - \item Arco 3: el que va -\end{enumerate} +\include{Secciones/conclusion} \bibliographystyle{plain} \bibliography{../../../../../../Biblio/biblio.bib} diff --git a/solution.tex b/solution.tex index 44d23f3..477d7a7 100644 --- a/solution.tex +++ b/solution.tex @@ -1,5 +1,5 @@ % !TEX encoding = UTF-8 -% !TEX spellcheck = en_US +% !TEX spellcheck = en_GB % !TEX root = paper.tex \chapter{Proposed solution} diff --git a/state_of_the_art.tex b/state_of_the_art.tex index e5c9cc7..0ee89d8 100644 --- a/state_of_the_art.tex +++ b/state_of_the_art.tex @@ -1,5 +1,5 @@ % !TEX encoding = UTF-8 -% !TEX spellcheck = en_US +% !TEX spellcheck = en_GB % !TEX root = paper.tex \chapter{State of the art}