Dynamic slicing techniques compute program dependencies to find all statements that affect the value of a variable at a program point for a specific execution. Despite their many potential uses, applicability is limited by the fact that they typically cannot scale beyond small-sized applications. We believe that at the heart of this limitation is the use of memory references to identify data-dependencies. Particularly, working with memory references hinders distinct treatment of the code-to-be-sliced (e.g., classes the user has an interest in) from the rest of the code (including libraries and frameworks). The ability to perform a coarser-grained analysis for the code that is not under focus may provide performance gains and could become one avenue toward scalability. In this paper, we propose a novel approach that completely replaces memory reference registering and processing with a memory analysis model that works with program symbols (i.e., terms). In fact, this approach enables the alternative of not instrumenting -- thus, not generating any trace -- for code that is not part of the code-to-be-sliced. We report on an implementation of an abstract dynamic slicer for C\#, \textit{DynAbs}, and an evaluation that shows how large and relevant parts of Roslyn and Powershell -- two of the largest and modern C\# applications that can be found in GitHub -- can be sliced for their test cases assertions in at most a few minutes. We also show how reducing the code-to-be-sliced focus can bring important speedups with marginal relative precision loss.
翻译:动态剪切技术计算程序依赖性, 以找到所有在特定执行的某个程序点上影响变量值的语句。 尽管这些语句有许多潜在用途, 其适用性因以下事实而受到限制: 它们通常不能超越小型应用程序。 我们认为, 此项限制的核心是使用内存参考来识别数据依赖性。 特别是, 与内存参考合作, 妨碍对代码( 即用户感兴趣的类别) 进行与代码其余部分( 包括图书馆和框架) 不同的处理。 对非焦点的代码进行粗化的精细分析的能力, 可能会带来绩效增益, 并可能成为伸缩的一个途径。 在本文中, 我们提出了一个新颖的方法, 完全取代内存参考的注册和处理模式, 与程序符号( e. 术语) 有关。 事实上, 这种方法可以使非代码- 重点部分( 包括图书馆和框架) 的代码( 无法产生任何踪迹) 进行粗略分析。 我们报告, 如何在系统切缩缩缩略图中, C- 和 Crevil 显示最相关的缩缩略图部分, 和 Creval- devlexx 的缩缩缩缩缩缩图, 。