Adrninistrator / java-callgraph2

Programs for producing static call graphs for Java programs.
Apache License 2.0
194 stars 69 forks source link

方法调用关系问题 #47

Open 0Xenc opened 4 months ago

0Xenc commented 4 months ago

EG代码:

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;

public class TestObject extends ObjectInputStream {
    public TestObject(InputStream in) throws IOException {
        super(in);
    }
}

public class Test{
    public void test() throws Exception{
        TestObject testObject = new TestObject(null);
        testObject.readObject();
    }
}
Test:test() (SPE)TestObject:<init>(java.io.InputStream) 5   void    v   void        1   1
Test:test() (VIR)TestObject:readObject()    6   void    v   java.lang.Object        1   1
TestObject:<init>(java.io.InputStream)  (SPE)java.io.ObjectInputStream:<init>(java.io.InputStream)  9   void    t   void        1   -

从结果中只能得出调用了父类方法,method_call里面能否加入一个TestObject:readObject() 调用java.io.ObjectInputStream:readObject()

再比如:

net.sf.jasperreports.engine.util.JRLoader:loadObject(java.io.File)  (_ACT_C)net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream:readObject()   90  java.lang.Object    v   java.lang.Object        1   1

image

image

net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream:readObject() 在method_call中查不到调用了java.io.ObjectInputStream:readObject()

Adrninistrator commented 4 months ago

这个问题是因为JDK中的java.io.ObjectInputStream在rt.jar中,没有添加到需要分析的jar包列表中 需要解决的话,可以在生成的文件里增加 ObjectInputStream 子类调用 ObjectInputStream.readObject() 的调用关系 也可以在数据库表中增加 看需要使用哪种方式,我优化一下

0Xenc commented 4 months ago

我尝试将rt.jar 放入需要分析的目录中,但是依然没有看到method_call中增加了net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream:readObject()到java.io.ObjectInputStream:readObject()的调用,希望能在method_call中增加,这样就能更清楚的了解实际上调用的是哪一个类,比如增加了net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream:readObject()到java.io.ObjectInputStream:readObject(),进行数据分析就能识别出实际上调用的是ObjectInputStream

Adrninistrator commented 4 months ago

这个问题可以解决,这段时间事情比较多,有空了我优化下

0Xenc commented 4 months ago

好的,感谢。优化好了关闭这个issue即可。

Adrninistrator commented 3 months ago

提交了2.0.1版本,应该解决了这个问题

将rt.jar拷贝到有写权限的目录处理

copy "C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar" D:\desktop\test\ cd D:\desktop\test\

解压 java.io 包中的所有类

jar -xvf rt.jar java/io/

或者只解压 ObjectInputStream 类

jar -xvf rt.jar java/io/ObjectInputStream.class

需要将 D:\desktop\test\java\io 目录添加到 jar_dir.properties 配置文件中,以及其他需要分析的jar包