On my last slides I want to explain two distinctive features of our program slicing tool.
First, the polymorphic call sites.
Dynamic binding (or late binding) means that we cannot decide at compile-time which procedure will be called at run-time. This means that static analysis cannot predict which branches of the program will actually be executed under future conditions. But this means also that static analysis must be performed in a conservative way, which results in program slices that are not as precise as they could be if we would perform dynamic analysis.
Theoretical results proved that static analysis is arbitrarily complex for languages with dynamic binding. Therefore we first perform conservative static analysis (including alias analysis) over all possible call destinations of polymorphic call sites.
Then the user can disable some of the destinations of dynamically bound calls and initiate further exact static analysis over the enabled call destinations only.
So to say, the user can specialize the program to one possible use case and then view which parts of the program are part of the slice with respect to some criterion.
We call our technique of analysis "semi-dynamic" because it is based on static analysis with feedback from the user.