AspectJ程序中无限递归的自动检测
1 引言
当前主流的面向切面语言(如 AspectJ)存在一个重大问题,即面向切面程序很容易包含导致意外无限递归的代码。这种意外的无限递归是由于通知(advice)调用其他通知或调用它们所调用的方法而引起的。尽管程序员可能会在面向切面程序中有意使用递归来解决递归问题,但在实践中,大多数情况下递归是无意的,因此属于编程错误。
为避免无限递归,程序员通常采用一种特定的解决方法,即对于每个切面 A,将其切入点(pointcut)与 !cflow(within(A)) 切入点进行连接。这种方法可以防止切面自我调用导致的无限递归,但由于 cflow 切入点无法静态匹配,会带来相当大的运行时开销。即使运行时开销不是问题,这种方法也要求程序员遵循特定的约定,将每个切入点与 !cflow(within(A)) 进行连接。
测试是揭示所有编程范式中故障的常见解决方案,包括面向切面程序中的无限递归。然而,大多数情况下,测试之后还需要进一步分析才能揭示故障的原因。
还有一些其他的解决方案,如有人提出了 AspectJ 语言扩展,通过对切面进行分层,防止切面调用更高层或同一层的切面,从而完全避免了切面中的无限递归问题。但该解决方案限制了程序员只能使用 AspectJ 进行编程,并且对现有程序进行重构可能会很繁琐。另外,XFindBugs 会检查特定 AspectJ 编译器生成的字节码,以检测导致 AspectJ 程序故障的几种特殊模式,其中之一就是导致无限递归的模式。但它依赖于特定的 AspectJ 编译器(ajc)生成的代码,无法检
超级会员免费看
订阅专栏 解锁全文
52

被折叠的 条评论
为什么被折叠?



