Skip to content

Commit 12d6875

Browse files
committed
Java: Replace the MaD Object.clone() models with a non-aliasing value step.
1 parent 0fb27fb commit 12d6875

File tree

4 files changed

+16
-3
lines changed

4 files changed

+16
-3
lines changed

java/ql/lib/ext/java.lang.model.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,6 @@ extensions:
9191
- ["java.lang", "Iterable", True, "iterator", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"]
9292
- ["java.lang", "Iterable", True, "spliterator", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"]
9393
- ["java.lang", "NullPointerException", False, "NullPointerException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"]
94-
- ["java.lang", "Object", True, "clone", "", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"]
95-
- ["java.lang", "Object", True, "clone", "", "", "Argument[this].MapKey", "ReturnValue.MapKey", "value", "manual"]
96-
- ["java.lang", "Object", True, "clone", "", "", "Argument[this].MapValue", "ReturnValue.MapValue", "value", "manual"]
9794
- ["java.lang", "RuntimeException", False, "RuntimeException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"]
9895
- ["java.lang", "RuntimeException", False, "RuntimeException", "(String,Throwable)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"]
9996
- ["java.lang", "RuntimeException", False, "RuntimeException", "(String,Throwable)", "", "Argument[1]", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "value", "manual"]

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplSpecific.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ module JavaDataFlow implements InputSig<Location> {
2222

2323
predicate getSecondLevelScope = Private::getSecondLevelScope/1;
2424

25+
predicate validParameterAliasStep = Private::validParameterAliasStep/2;
26+
2527
predicate mayBenefitFromCallContext = Private::mayBenefitFromCallContext/1;
2628

2729
predicate viableImplInCallContext = Private::viableImplInCallContext/2;

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowPrivate.qll

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,18 @@ class CastNode extends ExprNode {
400400
}
401401
}
402402

403+
/** Holds if `n1` is the qualifier of a call to `clone()` and `n2` is the result. */
404+
predicate cloneStep(Node n1, Node n2) {
405+
exists(MethodCall mc |
406+
mc.getMethod() instanceof CloneMethod and
407+
n1 = getInstanceArgument(mc) and
408+
n2.asExpr() = mc
409+
)
410+
}
411+
412+
bindingset[node1, node2]
413+
predicate validParameterAliasStep(Node node1, Node node2) { not cloneStep(node1, node2) }
414+
403415
private newtype TDataFlowCallable =
404416
TSrcCallable(Callable c) or
405417
TSummarizedCallable(SummarizedCallable c) or

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,8 @@ private predicate simpleLocalFlowStep0(Node node1, Node node2, string model) {
258258
model = "ValuePreservingMethod"
259259
)
260260
or
261+
cloneStep(node1, node2) and model = "CloneStep"
262+
or
261263
FlowSummaryImpl::Private::Steps::summaryLocalStep(node1.(FlowSummaryNode).getSummaryNode(),
262264
node2.(FlowSummaryNode).getSummaryNode(), true, model)
263265
}

0 commit comments

Comments
 (0)