gpt4 book ai didi

java - 确定传递给 Java 方法的所有字符串(动态构建和文字)

转载 作者:行者123 更新时间:2023-11-30 02:44:25 25 4
gpt4 key购买 nike

我正在尝试构建一个静态代码分析,它允许收集传递给函数的所有字符串而不运行代码。我正在使用 Eclipse JDT (3.10.0) 来解析代码。

假设/预设条件:

  • 每个传递的参数都可以解析为字符串文字
  • 该值不会保存到任何(非静态)字段,然后在另一个调用中传递
  • 解析器可以识别和访问所有调用者
  • 所检查方法的 MethodInspiration 已被识别

我拥有的:

目前,我能够识别该特定方法上的所有方法调用,因此能够收集作为 StringLiterals 传递的所有参数。我可以看到所有参数类型,但当然无法确定参数、字段、对象等的值,因为值绑定(bind)仅在运行时可用。

问题

假设每个传递的参数(无论类型)有时都可以解析为 StringLiteral 或 StringLiterals 的串联,我应该能够确定传递给此方法的所有值的不同集合通过程序。有没有一种方法可以递归地确定所有方法调用的字符串值,而无需跟踪每个堆栈跟踪并手动实现每次发生的逻辑?

想象以下示例:

public class IAmAnalysed{
public void analysedMethod(String argument){
//do something useful
}
}

//Values in a map
hashMap.put("test", "TestString");
hashMap.put("test2", "TestString2");
for (Map.Entry<String, String> e : hashMap.entrySet()) {
iAmAnalysed.analysedMethod(e.getValue);
}

//util method
public void util(String argument){
iAmAnalysed.analysedMethod(argument + "utilCalled");
}
util("TestString3")

这应该给我以下一组值:

TestString
TestString2
TestString3utilCalled

我能想到的唯一方法(使用 Eclipse JDT)是将每个不是 StringLiteral 的参数添加到工作集中,并使用 ASTParser 开始另一次迭代,以确定传递的值设置在哪里,或者它来自哪里。然后我将此位置添加到工作集中并再次迭代。最后这应该引导我提出所有可能的论点。不幸的是,使用这种方法,我必须为每一种可能的值传递方式实现逻辑(想象一下上面两种方法旁边的所有其他可能性)

最佳答案

通过静态分析检查所有可能的数据流到给定方法通常是不可行的。您概述的方法可以适用于一小部分程序,直到您遇到(例如递归)时,事情就会崩溃。

也许综合测试套件会比静态分析提供更好的结果。

关于java - 确定传递给 Java 方法的所有字符串(动态构建和文字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40628925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com