加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用于完整字符串正则表达式的Java String Analysis

发布时间:2020-12-13 21:53:34 所属栏目:百科 来源:网络整理
导读:我正在寻找像 Java字符串分析(JSA)这样的工具,它可以将字符串作为正则表达式进行总结.我试图用JSA做到这一点,但我需要搜索一个特定的方法,如StringBuffer.append或其他字符串操作. 我有这样的字符串: StringBuilder test=new StringBuilder("hello "); bool
我正在寻找像 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行)
其他分支:“未知”(第6行)

这可以在第7行汇总到(世界)|(未知)并在条件之前附加到正则表达式.

如果遇到变量,如果进行过程间分析,或者必须使用通配符“.*”,则可以追溯它.

最终的正则表达式:“你好((世界)|(未知)).*”

我希望这能引导您达到您想要实现的解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读