用于完整字符串正则表达式的Java String Analysis
我正在寻找像
Java字符串分析(JSA)这样的工具,它可以将字符串作为正则表达式进行总结.我试图用JSA做到这一点,但我需要搜索一个特定的方法,如StringBuffer.append或其他字符串操作.
我有这样的字符串: StringBuilder test=new StringBuilder("hello "); boolean codition=false; if(codition){ test.append("world"); } else{ test.append("other world"); } test.append(" so far"); for(int i=0;i<args.length;i++){ test.append(" again hello"); } // regularExpression = "hello (world| other world) so far( again hello)*" 到目前为止,我的JSA实现看起来像这样: public static void main(String[] args) { StringAnalysis.addDirectoryToClassPath("bootstrap.jar"); StringAnalysis.loadClass("org.apache.catalina.loader.Extension"); List<ValueBox> list = StringAnalysis.getArgumentExpressions("<java.lang.StringBuffer: java.lang.StringBuffer append(java.lang.String)>",0); StringAnalysis sa = new StringAnalysis(list); for (ValueBox e : list) { Automaton a = sa.getAutomaton(e); if (a.isFinite()) { Iterator<String> si = a.getFiniteStrings().iterator(); StringBuilder sb = new StringBuilder(); while (si.hasNext()) { sb.append((String) si.next()); } System.out.println(sb.toString()); } else if (a.complement().isEmpty()) { System.out.println(e.getValue()); } else { System.out.println("common prefix:" + a.getCommonPrefix()); } } } 对于JSA工具的任何帮助或者对其他工具的提示,我将非常感激.我最大的问题是正则表达式围绕字符串常量的控制流结构.
我不知道一个工具可以让你开箱即用的正则表达式.
但是,由于您对CFG存在问题,我建议您编写针对您的问题量身定制的静态分析.您可以使用静态分析/字节码框架,如OPAL(Scala)或Soot(Java).您将在每个项目页面上找到教程. 设置完成后,您可以加载目标jar.您应该能够利用程序的控制流程,如下例所示: 1 public static void example(String unknown) { 2 String source = "hello"; 3 if(Math.random() * 20 > 5){ 4 source += "world"; 5 } else { 6 source += "unknown"; 7 } 8 source += unknown; } 如果您的分析找到初始化的String或StringBuilder,您可以开始构建正则表达式.例如,第二行会使你的正则表达式为“你好”.如果您在程序的控制流程中遇到条件,您可以分析每个路径并通过“|”组合它们稍后的. 然后分支:“世界”(第4行) 这可以在第7行汇总到(世界)|(未知)并在条件之前附加到正则表达式. 如果遇到变量,如果进行过程间分析,或者必须使用通配符“.*”,则可以追溯它. 最终的正则表达式:“你好((世界)|(未知)).*” 我希望这能引导您达到您想要实现的解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |