|
7 | 7 | import org.slf4j.Logger; |
8 | 8 | import org.slf4j.LoggerFactory; |
9 | 9 |
|
10 | | -import soot.ArrayType; |
11 | | -import soot.Local; |
12 | | -import soot.Scene; |
13 | | -import soot.SootMethod; |
14 | | -import soot.Value; |
| 10 | +import soot.*; |
15 | 11 | import soot.jimple.InstanceInvokeExpr; |
16 | 12 | import soot.jimple.ReturnStmt; |
17 | 13 | import soot.jimple.Stmt; |
|
32 | 28 | import soot.jimple.infoflow.methodSummary.postProcessor.SummaryPathBuilder.SummarySourceInfo; |
33 | 29 | import soot.jimple.infoflow.methodSummary.taintWrappers.AccessPathFragment; |
34 | 30 | import soot.jimple.infoflow.methodSummary.util.AliasUtils; |
| 31 | +import soot.jimple.infoflow.typing.TypeUtils; |
35 | 32 | import soot.jimple.infoflow.util.SootMethodRepresentationParser; |
36 | 33 | import soot.util.MultiMap; |
37 | 34 |
|
@@ -331,15 +328,21 @@ protected void processAbstractionAtReturn(MethodSummaries flows, AccessPath apAt |
331 | 328 |
|
332 | 329 | // The sink may be a parameter |
333 | 330 | if (!isInCallee) { |
334 | | - if (!apAtReturn.isLocal() || apAtReturn.getTaintSubFields() |
335 | | - || apAtReturn.getBaseType() instanceof ArrayType) |
336 | | - for (int i = 0; i < m.getParameterCount(); i++) { |
337 | | - Local p = m.getActiveBody().getParameterLocal(i); |
338 | | - if (apAtReturn.getPlainValue() == p) { |
339 | | - FlowSink sink = sourceSinkFactory.createParameterSink(i, apAtReturn); |
340 | | - addFlow(source, sink, isAlias, flows); |
| 331 | + if (apAtReturn.getPlainValue() != null |
| 332 | + && (apAtReturn.getTaintSubFields() || apAtReturn.getFragmentCount() > 0)) { |
| 333 | + boolean isString = TypeUtils.isStringType(apAtReturn.getBaseType()) |
| 334 | + && !apAtReturn.getCanHaveImmutableAliases(); |
| 335 | + if (apAtReturn.getBaseType() instanceof ArrayType |
| 336 | + || (apAtReturn.getBaseType() instanceof RefType && !isString)) { |
| 337 | + for (int i = 0; i < m.getParameterCount(); i++) { |
| 338 | + Local p = m.getActiveBody().getParameterLocal(i); |
| 339 | + if (apAtReturn.getPlainValue() == p) { |
| 340 | + FlowSink sink = sourceSinkFactory.createParameterSink(i, apAtReturn); |
| 341 | + addFlow(source, sink, isAlias, flows); |
| 342 | + } |
341 | 343 | } |
342 | 344 | } |
| 345 | + } |
343 | 346 | } |
344 | 347 |
|
345 | 348 | // The sink may be a local field |
|
0 commit comments