Skip to content

Commit e11e78c

Browse files
committed
update to 1.4.3 and --application-regex parameter
1 parent b990f7f commit e11e78c

File tree

9 files changed

+44
-8
lines changed

9 files changed

+44
-8
lines changed

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@ generate facts from bytecode (source is https://github.com/plast-lab/doop-mirror
1313

1414
## usage
1515

16+
1.4.3
17+
1618
```
1719
Usage: soot-fact-generator [options] file...
1820
Options:
1921
--main <class> Specify the name of the main class.
2022
--ssa Generate SSA facts, enabling flow-sensitive analysis.
2123
--full Generate facts by full transitive resolution.
24+
--applicaiton-regex Application class glob expr default is **
2225
--allow-phantom Allow phantom classes.
2326
-d <directory> Specify where to generate output fact files.
2427
-i <archive> Find classes in <archive>.
@@ -52,7 +55,7 @@ Supported input archive formats: AAR, APK, JAR, ZIP
5255
```
5356
常见的用法是
5457
```
55-
java -jar soot-fact-generator.jar -i input.jar -l /usr/lib/jvm/java-8-oracle/jre/lib/rt.jar --generate-jimple --allow-phantom --full -d out
58+
java -jar soot-fact-generator-1.4.3.jar -i Benchmark.jar -l /usr/lib/jvm/java-8-oracle/jre/lib/rt.jar --generate-jimple --allow-phantom --full --ignore-factgen-errors --ignore-wrong-staticness --application-regex 'com.bytecodedl.benchmark.**' -d out
5659
```
5760
其中
5861
- `-i` 指定待分析的jar包
@@ -61,6 +64,9 @@ java -jar soot-fact-generator.jar -i input.jar -l /usr/lib/jvm/java-8-oracle/jr
6164
- `--allow-phantom` 大概是允许解析依赖不存在的类
6265
- `--full` 表示对所有class进行解析
6366
- `-d` 指定输出目录
67+
- `--ignore-factgen-errors --ignore-wrong-staticness` 忽略生成fact过程中的一些错误
68+
- `--application-regex 'com.bytecodedl.benchmark.**'` 表示只对`com.bytecodedl.benchmark.`开头的class解析method body,其他只解析函数签名
69+
- 如果存在多个开头,可以用`/`隔开,默认是`**`全部解析,如果只关注某些class中的逻辑建议加上该参数,能极大降低生成fact的时间
6470

6571
另外还额外增加了
6672
- `-i-dir` 指定待分析的jar目录

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version=1.4.2
1+
version=1.4.3

src/main/java/org/clyze/doop/common/BasicJavaSupport.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,10 @@ public ExecutorService getExecutor() {
4646
* Helper method to read classes and resources from input archives.
4747
*/
4848
public void preprocessInputs(Database db, Set<String> tmpDirs) throws IOException {
49+
Set<String> tmpClasses = ConcurrentHashMap.newKeySet();
4950
for (String filename : parameters.getInputs()) {
5051
logger.info("Preprocessing application: " + filename);
51-
preprocessInput(db, tmpDirs, classesInApplicationJars, filename);
52+
preprocessInput(db, tmpDirs, tmpClasses, filename);
5253
}
5354
for (String filename : parameters.getPlatformLibs()) {
5455
logger.info("Preprocessing platform library: " + filename);
@@ -58,6 +59,18 @@ public void preprocessInputs(Database db, Set<String> tmpDirs) throws IOExceptio
5859
logger.info("Preprocessing dependency: " + filename);
5960
preprocessInput(db, tmpDirs, classesInDependencyJars, filename);
6061
}
62+
63+
classifyClasses(tmpClasses);
64+
}
65+
66+
public void classifyClasses(Set<String> tmpClasses){
67+
for (String filename : tmpClasses) {
68+
if (parameters.isApplicationClass(filename)){
69+
classesInApplicationJars.add(filename);
70+
}else{
71+
classesInLibraryJars.add(filename);
72+
}
73+
}
6174
}
6275

6376
/**

src/main/java/org/clyze/doop/common/Parameters.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ public boolean isSpringBootJar(String jarFile){
360360
ZipEntry entry = null;
361361

362362
while((entry = in.getNextEntry()) != null){
363-
if (entry.isDirectory() && entry.getName().equals("org/springframework/boot/")){
363+
if (entry.isDirectory() && entry.getName().equals("BOOT-INF/")){
364364
return true;
365365
}
366366
}

src/main/java/org/clyze/doop/soot/BasicJavaSupport_Soot.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,27 @@
22

33
import java.util.Collection;
44
import java.util.Set;
5+
6+
import org.apache.logging.log4j.LogManager;
7+
import org.apache.logging.log4j.Logger;
58
import org.clyze.doop.common.ArtifactScanner;
69
import org.clyze.doop.common.BasicJavaSupport;
710
import soot.Scene;
811
import soot.SootClass;
912
import soot.SourceLocator;
1013

1114
public class BasicJavaSupport_Soot extends BasicJavaSupport implements ClassAdder {
15+
Logger logger = LogManager.getLogger(BasicJavaSupport_Soot.class);
1216

1317
public BasicJavaSupport_Soot(SootParameters parameters, ArtifactScanner artScanner) {
1418
super(parameters, artScanner);
1519
}
1620

1721
public void addSootClasses(Iterable<String> classesToLoad, Collection<SootClass> loadedClasses, Scene scene) {
22+
logger.info("start addSootClasses");
23+
if (classesToLoad instanceof Set){
24+
logger.info("addSootClasses size " + ((Set<String>) classesToLoad).size());
25+
}
1826
for (String className : classesToLoad) {
1927
if (className.contains("]") || className.contains("[") || className.contains(";")) {
2028
System.err.println("WARNING: class name '" + className + "' is not supported, class will not be loaded.");
@@ -28,6 +36,7 @@ public void addSootClasses(Iterable<String> classesToLoad, Collection<SootClass>
2836
throw ex;
2937
}
3038
}
39+
logger.info("end addSootClasses loadedClasses" + loadedClasses.size());
3140
}
3241

3342
@Override
@@ -49,7 +58,7 @@ public boolean isAppOrDepClass(String t) {
4958
public void addAppClasses(Set<SootClass> classes, Scene scene) {
5059
addSootClasses(classesInApplicationJars, classes, scene);
5160
addBasicClasses(scene);
52-
System.out.println("Classes in input (application) jar(s): " + classesInApplicationJars.size());
61+
logger.info("Classes in input (application) jar(s): " + classesInApplicationJars.size());
5362
}
5463

5564
@Override

src/main/java/org/clyze/doop/soot/ClassHeapFinder.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,13 @@ private void scan(Iterable<SootClass> classes) {
3535

3636
private void scan(SootMethod m) {
3737
if (!m.hasActiveBody()) {
38-
m.retrieveActiveBody();
3938
System.err.println("Preprocessing: found method without active body: " + m.getSignature());
39+
try{
40+
m.retrieveActiveBody();
41+
}catch (Exception e){
42+
e.printStackTrace();
43+
return;
44+
}
4045
}
4146
for (Unit u : m.getActiveBody().getUnits())
4247
if (u instanceof AssignStmt) {

src/main/java/org/clyze/doop/soot/FactGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ void generate(SootMethod m, SessionCounter session) {
236236
for(SootClass clazz: m.getExceptions())
237237
_writer.writeMethodDeclaresException(m, clazz);
238238

239-
if(!(m.isAbstract() || m.isNative())) {
239+
if(!(m.isAbstract() || m.isNative()) && this.sootParameters.isApplicationClass(m.getDeclaringClass())) {
240240
if(!m.hasActiveBody()) {
241241
// This instruction is the bottleneck of
242242
// soot-fact-generation.

src/main/java/org/clyze/doop/soot/Main.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.concurrent.ConcurrentHashMap;
99
import java.util.concurrent.atomic.AtomicInteger;
1010
import java.util.function.Predicate;
11+
import java.util.stream.Collectors;
1112

1213
import org.apache.logging.log4j.LogManager;
1314
import org.apache.logging.log4j.Logger;
@@ -292,7 +293,8 @@ private static void invokeSoot(SootParameters sootParameters, Database db, Set<S
292293

293294
if (!sootParameters._lowMem){
294295
logger.info("Checking class heaps for missing types...");
295-
Collection<String> unrecorded = new ClassHeapFinder().getUnrecordedTypes(classes);
296+
Set<SootClass> appClasses = classes.stream().filter(sootParameters::isApplicationClass).collect(Collectors.toSet());
297+
Collection<String> unrecorded = new ClassHeapFinder().getUnrecordedTypes(appClasses);
296298
if (unrecorded.size() > 0) {
297299
// If option is set, fail and notify caller that fact generation
298300
// must run again with these classes added.

src/main/java/org/clyze/doop/soot/SootParameters.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ static void showHelp() {
8787
System.err.println(" --main <class> Specify the name of the main class.");
8888
System.err.println(" --ssa Generate SSA facts, enabling flow-sensitive analysis.");
8989
System.err.println(" --full Generate facts by full transitive resolution.");
90+
System.err.println(" --applicaiton-regex Application class glob expr default is **");
9091
System.err.println(" --allow-phantom Allow phantom classes.");
9192
System.err.println(" -d <directory> Specify where to generate output fact files.");
9293
System.err.println(" -i <archive> Find classes in <archive>.");

0 commit comments

Comments
 (0)