java - 约束 Wala 的类层次结构?
问题描述
我想为一些 java 字节码生成 IR。我正在使用的项目出于其他原因使用Wala作为静态分析工具。我需要做的其中一个步骤是为给定的兴趣范围创建类层次结构。现在看来,类层次结构的创建是一个昂贵的过程,因此如果我需要重复调用它,则特别希望将其最小化。
我试图通过使用AnalysisScopeReader.readJavaScope(...)
where 我指定一个仅包含单个条目的范围文件来缩小类层次结构的范围,主要是我要分析的类,它是使用Application
加载器加载的。但是,这似乎不起作用,因为我收到一个错误com.ibm.wala.ipa.cha.ClassHierarchyException: failed to load root <Primordial,Ljava/lang/Object> of class hierarchy
。似乎 Wala 也希望jre.jar
在范围文件中包含 ,因此它可以找到Ljava/lang/Object
. 然而这是有问题的,因为如果我在范围文件中添加行,类层次结构的创建将包含很多我不会使用的类,我不想在这些类上花费时间或内存。
似乎人们在这里也一直在努力解决这个问题,但从未得到解决。
具体来说,这就是我所做的
scope2 = AnalysisScopeReader.readJavaScope(somePath, null, urlcl);
cha = ClassHierarchyFactory.makeWithRoot(scope2);
我真的不想/不需要在我的分析中创建类层次结构,我没有使用任何调用图分析。我只需要为我正在分析的单个类创建 IR,而无需为创建我不会使用的类的层次结构付费。或者至少,我希望类层次结构包含我当前正在分析的单个文件。
似乎ClassHierarchyFactor.makeWithRoot()
几乎可以工作,只是它仍然需要Object
类来用于缺少的超类,这意味着我需要将 java lang 类层次结构添加到分析中。
这里的解决方案(How to get rid of the unrelated classes when using WALA to analyze Java bytecode?)似乎是一个hack而不是修复。
我不确定是否有办法做到这一点,有人可以帮忙吗?无论如何,在 Wala 中,我可以为单个类获取 ssa IR,而无需构建一个如此大的 java lang 类层次结构的类层次结构?
非常感谢!
解决方案
以下应该为您提供单个的最小类层次结构targetClass
private ClassHierarchy getClassHierarchy(Class<?> targetClass) {
AnalysisScope scope = getAnalysisScope(targetClass);
return ClassHierarchyFactory.makeWithRoot(scope);
}
在哪里
private AnalysisScope getAnalysisScope(Class<?> targetClass) {
String targetFile = targetClass.getResource(targetClass.getSimpleName() + ".class").getFile();
FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
byte[] bytes = Files.readAllBytes(fs.getPath("modules", "java.base", "java/lang/Object.class"));
Path path = Path.of(System.getProperty("user.dir"), "target", "test-classes", "Object.class");
Files.write(path, bytes);
AnalysisScope scope = AnalysisScope.createJavaAnalysisScope();
scope.addClassFileToScope(ClassLoaderReference.Primordial, path.toFile());
scope.addClassFileToScope(ClassLoaderReference.Application, new File(targetFile));
return scope;
}
推荐阅读
- django - drf-yasg 提供了错误的 URI 路径
- python - 如何使用 sklearn 的 GraphicalLasso 和 NetworkX 从(加权)邻接矩阵估计网络结构?
- javascript - Tradingview如何获取数据来刷新价格?
- node.js - 无法在使用 react 构建的简单博客中添加新文章
- sql - 如何使用 SQL 和通配符搜索 %?
- hash - 如何用盐创建 sha256 哈希
- javascript - 如何让两个 div 屏幕显示和隐藏在相同的高度
- ios - 如何创建一个带有可选辅助 View 参数的 SwiftUI 视图?
- python - 如何用 unittest 覆盖我的 Python 代码
- sql - 根据 jsonb 数组中的嵌套键查找行