From 9ef61bd43ccb4eceaea35d9a9408f43c2e897c35 Mon Sep 17 00:00:00 2001 From: Cornelius Riemenschneider Date: Mon, 30 Sep 2019 17:00:07 +0200 Subject: [PATCH] Address more parts of Anders review. --- .../java/dataflow/internal/DataFlowImpl.qll | 2 +- .../java/dataflow/internal/DataFlowImpl2.qll | 2 +- .../java/dataflow/internal/DataFlowImpl3.qll | 2 +- .../java/dataflow/internal/DataFlowImpl4.qll | 2 +- .../java/dataflow/internal/DataFlowImpl5.qll | 2 +- .../dataflow/internal/DataFlowImplCommon.qll | 28 +-- .../dataflow/call-sensitivity/A.java | 12 ++ .../dataflow/call-sensitivity/A2.java | 42 +++++ .../dataflow/call-sensitivity/InterfaceB.java | 3 + .../dataflow/call-sensitivity/flow.expected | 161 ++++++++++-------- .../call-sensitivity/log/javac-errors.log | 8 + .../log/javac-extractor-6836.log | 3 + .../dataflow/call-sensitivity/log/log.log | 8 + 13 files changed, 185 insertions(+), 90 deletions(-) create mode 100644 java/ql/test/library-tests/dataflow/call-sensitivity/A2.java create mode 100644 java/ql/test/library-tests/dataflow/call-sensitivity/InterfaceB.java create mode 100644 java/ql/test/library-tests/dataflow/call-sensitivity/log/javac-errors.log create mode 100644 java/ql/test/library-tests/dataflow/call-sensitivity/log/javac-extractor-6836.log create mode 100644 java/ql/test/library-tests/dataflow/call-sensitivity/log/log.log diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl.qll b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl.qll index acdcd4dfe6d..2f541e46160 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl.qll @@ -1734,7 +1734,7 @@ private class PathNodeSink extends PathNode, TPathNodeSink { * a callable is recorded by `cc`. */ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) { - exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc) | + exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) | localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and cc = mid.getCallContext() and ap = mid.getAp() diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl2.qll b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl2.qll index acdcd4dfe6d..2f541e46160 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl2.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl2.qll @@ -1734,7 +1734,7 @@ private class PathNodeSink extends PathNode, TPathNodeSink { * a callable is recorded by `cc`. */ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) { - exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc) | + exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) | localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and cc = mid.getCallContext() and ap = mid.getAp() diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl3.qll b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl3.qll index acdcd4dfe6d..2f541e46160 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl3.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl3.qll @@ -1734,7 +1734,7 @@ private class PathNodeSink extends PathNode, TPathNodeSink { * a callable is recorded by `cc`. */ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) { - exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc) | + exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) | localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and cc = mid.getCallContext() and ap = mid.getAp() diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl4.qll b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl4.qll index acdcd4dfe6d..2f541e46160 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl4.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl4.qll @@ -1734,7 +1734,7 @@ private class PathNodeSink extends PathNode, TPathNodeSink { * a callable is recorded by `cc`. */ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) { - exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc) | + exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) | localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and cc = mid.getCallContext() and ap = mid.getAp() diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl5.qll b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl5.qll index acdcd4dfe6d..2f541e46160 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl5.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImpl5.qll @@ -1734,7 +1734,7 @@ private class PathNodeSink extends PathNode, TPathNodeSink { * a callable is recorded by `cc`. */ private predicate pathStep(PathNodeMid mid, Node node, CallContext cc, AccessPath ap) { - exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc) | + exists(LocalCallContext localCC | localCC = getMatchingLocalCallContext(cc, node) | localFlowBigStep(mid.getNode(), node, true, mid.getConfiguration(), localCC) and cc = mid.getCallContext() and ap = mid.getAp() diff --git a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll index bca829ab395..b766ceade4b 100644 --- a/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll +++ b/java/ql/src/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll @@ -120,6 +120,7 @@ private module ImplCommon { int i, ArgumentNode arg, CallContext outercc, DataFlowCall call ) { exists(DataFlowCallable c | argumentOf(call, i, arg, c) | + ( outercc = TAnyCallContext() or outercc = TSomeCall(getAParameter(c), _) @@ -127,6 +128,8 @@ private module ImplCommon { exists(DataFlowCall other | outercc = TSpecificCall(other, _, _) | recordDataFlowCallSite(other, c) ) + ) and + not isUnreachableInCall(arg, outercc.(CallContextSpecificCall).getCall()) ) } @@ -180,14 +183,16 @@ private module ImplCommon { exists(Node mid | parameterValueFlow(p, mid, cc) and step(mid, node) and - compatibleTypes(p.getType(), node.getType()) + compatibleTypes(p.getType(), node.getType()) and + not isUnreachableInCall(node, cc.(CallContextSpecificCall).getCall()) ) or // flow through a callable exists(Node arg | parameterValueFlow(p, arg, cc) and argumentValueFlowsThrough(arg, node, cc) and - compatibleTypes(p.getType(), node.getType()) + compatibleTypes(p.getType(), node.getType()) and + not isUnreachableInCall(node, cc.(CallContextSpecificCall).getCall()) ) } @@ -220,6 +225,7 @@ private module ImplCommon { argumentValueFlowsThrough0(call, arg, kind, cc) | out = getAnOutNode(call, kind) and + not isUnreachableInCall(out, cc.(CallContextSpecificCall).getCall()) and compatibleTypes(arg.getType(), out.getType()) ) } @@ -675,16 +681,14 @@ private module ImplCommon { abstract predicate validFor(Node n); } - LocalCallContext getMatchingLocalCallContext(CallContext ctx) { - ( - not ctx instanceof CallContextSpecificCall or - not exists(TSpecificLocalCall(ctx.(CallContextSpecificCall).getCall())) - ) and - exists(LocalCallContextAny l | result = l) - or - exists(LocalCallContextSpecificCall l | - ctx.(CallContextSpecificCall).getCall() = l.getCall() and result = l - ) +/** + * Gets a matching local call context given the call context and a node which is in + * the callable the call is targeting. + */ +LocalCallContext getMatchingLocalCallContext(CallContext ctx, Node n) { + if hasUnreachableNode(ctx.(CallContextSpecificCall).getCall(), n.getEnclosingCallable()) + then result.(LocalCallContextSpecificCall).getCall() = ctx.(CallContextSpecificCall).getCall() + else result instanceof LocalCallContextAny } class LocalCallContextAny extends LocalCallContext, TAnyLocalCall { diff --git a/java/ql/test/library-tests/dataflow/call-sensitivity/A.java b/java/ql/test/library-tests/dataflow/call-sensitivity/A.java index fa077a6c190..affd10b2c00 100644 --- a/java/ql/test/library-tests/dataflow/call-sensitivity/A.java +++ b/java/ql/test/library-tests/dataflow/call-sensitivity/A.java @@ -3,6 +3,14 @@ public class A { public static void sink(Object o) { } + public Object flowThrough(Object o, boolean cond) { + if (cond) { + return o; + } else { + return null; + } + } + public void callSinkIfTrue(Object o, boolean cond) { if (cond) { sink(o); @@ -49,6 +57,7 @@ public class A { callSinkIfFalse(new Integer(2), true); callSinkFromLoop(new Integer(3), false); localCallSensitivity(new Integer(4), false); + sink(flowThrough(new Integer(4), false)); // should exhibit flow callSinkIfTrue(new Integer(1), true); callSinkIfFalse(new Integer(2), false); @@ -57,6 +66,7 @@ public class A { localCallSensitivity2(new Integer(4), true, true); localCallSensitivity2(new Integer(4), false, true); localCallSensitivity2(new Integer(4), true, false); + sink(flowThrough(new Integer(4), true)); // expected false positive localCallSensitivity2(new Integer(4), false, false); } @@ -69,11 +79,13 @@ public class A { callSinkIfFalse(new Integer(5), t); callSinkFromLoop(new Integer(6), f); localCallSensitivity(new Integer(4), f); + sink(flowThrough(new Integer(4), f)); // should exhibit flow callSinkIfTrue(new Integer(4), t); callSinkIfFalse(new Integer(5), f); callSinkFromLoop(new Integer(6), t); localCallSensitivity(new Integer(4), t); + sink(flowThrough(new Integer(4), t)); } public void f3(InterfaceA b) { diff --git a/java/ql/test/library-tests/dataflow/call-sensitivity/A2.java b/java/ql/test/library-tests/dataflow/call-sensitivity/A2.java new file mode 100644 index 00000000000..1f7e87b6ae1 --- /dev/null +++ b/java/ql/test/library-tests/dataflow/call-sensitivity/A2.java @@ -0,0 +1,42 @@ +public class A2 { + + public static void sink(Object o) { + } + + public void m() { + + } + + public void callsite(InterfaceB intF) { + B b = new B(); + // in both possible implementations of foo, this callsite is relevant + // in IntA, it improves virtual dispatch, + // and in IntB, it improves the dataflow analysis. + intF.foo(b, new Integer(5), false); + } + + private class B extends A2 { + @Override + public void m() { + + } + } + + private class IntA implements InterfaceB { + @Override + public void foo(A2 obj, Object o, boolean cond) { + obj.m(); + sink(o); + } + } + + private class IntB implements InterfaceB { + @Override + public void foo(A2 obj, Object o, boolean cond) { + if (cond) { + sink(o); + } + } + } + +} diff --git a/java/ql/test/library-tests/dataflow/call-sensitivity/InterfaceB.java b/java/ql/test/library-tests/dataflow/call-sensitivity/InterfaceB.java new file mode 100644 index 00000000000..28cb1dc54a1 --- /dev/null +++ b/java/ql/test/library-tests/dataflow/call-sensitivity/InterfaceB.java @@ -0,0 +1,3 @@ +public interface InterfaceB { + public void foo(A2 a, Object o, boolean cond); +} diff --git a/java/ql/test/library-tests/dataflow/call-sensitivity/flow.expected b/java/ql/test/library-tests/dataflow/call-sensitivity/flow.expected index 1aa4d87d655..4acd3cddd84 100644 --- a/java/ql/test/library-tests/dataflow/call-sensitivity/flow.expected +++ b/java/ql/test/library-tests/dataflow/call-sensitivity/flow.expected @@ -1,76 +1,91 @@ edges -| A.java:6:29:6:36 | o [ : Number] | A.java:8:9:8:9 | o | -| A.java:12:30:12:37 | o [ : Number] | A.java:14:9:14:9 | o | -| A.java:18:31:18:38 | o [ : Number] | A.java:20:9:20:9 | o | -| A.java:24:35:24:42 | o [ : Number] | A.java:32:8:32:9 | o3 | -| A.java:35:36:35:43 | o [ : Number] | A.java:43:8:43:9 | o3 | -| A.java:35:36:35:43 | o [ : Number] | A.java:43:8:43:9 | o3 | -| A.java:35:36:35:43 | o [ : Number] | A.java:43:8:43:9 | o3 | -| A.java:53:18:53:31 | new Integer(...) [ : Number] | A.java:6:29:6:36 | o [ : Number] | -| A.java:54:19:54:32 | new Integer(...) [ : Number] | A.java:12:30:12:37 | o [ : Number] | -| A.java:55:20:55:33 | new Integer(...) [ : Number] | A.java:18:31:18:38 | o [ : Number] | -| A.java:56:24:56:37 | new Integer(...) [ : Number] | A.java:24:35:24:42 | o [ : Number] | -| A.java:57:25:57:38 | new Integer(...) [ : Number] | A.java:35:36:35:43 | o [ : Number] | -| A.java:58:25:58:38 | new Integer(...) [ : Number] | A.java:35:36:35:43 | o [ : Number] | -| A.java:59:25:59:38 | new Integer(...) [ : Number] | A.java:35:36:35:43 | o [ : Number] | -| A.java:61:25:61:38 | new Integer(...) [ : Number] | A.java:35:36:35:43 | o [ : Number] | -| A.java:73:18:73:31 | new Integer(...) [ : Number] | A.java:6:29:6:36 | o [ : Number] | -| A.java:74:19:74:32 | new Integer(...) [ : Number] | A.java:12:30:12:37 | o [ : Number] | -| A.java:75:20:75:33 | new Integer(...) [ : Number] | A.java:18:31:18:38 | o [ : Number] | -| A.java:76:24:76:37 | new Integer(...) [ : Number] | A.java:24:35:24:42 | o [ : Number] | -| A.java:87:20:87:33 | new Integer(...) [ : Number] | A.java:94:30:94:37 | o [ : Number] | -| A.java:88:21:88:34 | new Integer(...) [ : Number] | A.java:101:31:101:38 | o [ : Number] | -| A.java:89:26:89:39 | new Integer(...) [ : Number] | A.java:108:36:108:43 | o [ : Number] | -| A.java:94:30:94:37 | o [ : Number] | A.java:96:10:96:10 | o | -| A.java:101:31:101:38 | o [ : Number] | A.java:103:10:103:10 | o | -| A.java:108:36:108:43 | o [ : Number] | A.java:116:9:116:10 | o3 | +| A2.java:15:15:15:28 | new Integer(...) [ : Number] | A2.java:27:27:27:34 | o [ : Number] | +| A2.java:27:27:27:34 | o [ : Number] | A2.java:29:9:29:9 | o | +| A.java:14:29:14:36 | o [ : Number] | A.java:16:9:16:9 | o | +| A.java:20:30:20:37 | o [ : Number] | A.java:22:9:22:9 | o | +| A.java:26:31:26:38 | o [ : Number] | A.java:28:9:28:9 | o | +| A.java:32:35:32:42 | o [ : Number] | A.java:40:8:40:9 | o3 | +| A.java:43:36:43:43 | o [ : Number] | A.java:51:8:51:9 | o3 | +| A.java:43:36:43:43 | o [ : Number] | A.java:51:8:51:9 | o3 | +| A.java:43:36:43:43 | o [ : Number] | A.java:51:8:51:9 | o3 | +| A.java:62:18:62:31 | new Integer(...) [ : Number] | A.java:14:29:14:36 | o [ : Number] | +| A.java:63:19:63:32 | new Integer(...) [ : Number] | A.java:20:30:20:37 | o [ : Number] | +| A.java:64:20:64:33 | new Integer(...) [ : Number] | A.java:26:31:26:38 | o [ : Number] | +| A.java:65:24:65:37 | new Integer(...) [ : Number] | A.java:32:35:32:42 | o [ : Number] | +| A.java:66:25:66:38 | new Integer(...) [ : Number] | A.java:43:36:43:43 | o [ : Number] | +| A.java:67:25:67:38 | new Integer(...) [ : Number] | A.java:43:36:43:43 | o [ : Number] | +| A.java:68:25:68:38 | new Integer(...) [ : Number] | A.java:43:36:43:43 | o [ : Number] | +| A.java:69:20:69:33 | new Integer(...) [ : Number] | A.java:69:8:69:40 | flowThrough(...) | +| A.java:71:25:71:38 | new Integer(...) [ : Number] | A.java:43:36:43:43 | o [ : Number] | +| A.java:84:18:84:31 | new Integer(...) [ : Number] | A.java:14:29:14:36 | o [ : Number] | +| A.java:85:19:85:32 | new Integer(...) [ : Number] | A.java:20:30:20:37 | o [ : Number] | +| A.java:86:20:86:33 | new Integer(...) [ : Number] | A.java:26:31:26:38 | o [ : Number] | +| A.java:87:24:87:37 | new Integer(...) [ : Number] | A.java:32:35:32:42 | o [ : Number] | +| A.java:88:20:88:33 | new Integer(...) [ : Number] | A.java:88:8:88:37 | flowThrough(...) | +| A.java:99:20:99:33 | new Integer(...) [ : Number] | A.java:106:30:106:37 | o [ : Number] | +| A.java:100:21:100:34 | new Integer(...) [ : Number] | A.java:113:31:113:38 | o [ : Number] | +| A.java:101:26:101:39 | new Integer(...) [ : Number] | A.java:120:36:120:43 | o [ : Number] | +| A.java:106:30:106:37 | o [ : Number] | A.java:108:10:108:10 | o | +| A.java:113:31:113:38 | o [ : Number] | A.java:115:10:115:10 | o | +| A.java:120:36:120:43 | o [ : Number] | A.java:128:9:128:10 | o3 | nodes -| A.java:6:29:6:36 | o [ : Number] | semmle.label | o [ : Number] | -| A.java:8:9:8:9 | o | semmle.label | o | -| A.java:12:30:12:37 | o [ : Number] | semmle.label | o [ : Number] | -| A.java:14:9:14:9 | o | semmle.label | o | -| A.java:18:31:18:38 | o [ : Number] | semmle.label | o [ : Number] | -| A.java:20:9:20:9 | o | semmle.label | o | -| A.java:24:35:24:42 | o [ : Number] | semmle.label | o [ : Number] | -| A.java:32:8:32:9 | o3 | semmle.label | o3 | -| A.java:35:36:35:43 | o [ : Number] | semmle.label | o [ : Number] | -| A.java:35:36:35:43 | o [ : Number] | semmle.label | o [ : Number] | -| A.java:35:36:35:43 | o [ : Number] | semmle.label | o [ : Number] | -| A.java:43:8:43:9 | o3 | semmle.label | o3 | -| A.java:53:18:53:31 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:54:19:54:32 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:55:20:55:33 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:56:24:56:37 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:57:25:57:38 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:58:25:58:38 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:59:25:59:38 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:61:25:61:38 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:73:18:73:31 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:74:19:74:32 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:75:20:75:33 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:76:24:76:37 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:87:20:87:33 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:88:21:88:34 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:89:26:89:39 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | -| A.java:94:30:94:37 | o [ : Number] | semmle.label | o [ : Number] | -| A.java:96:10:96:10 | o | semmle.label | o | -| A.java:101:31:101:38 | o [ : Number] | semmle.label | o [ : Number] | -| A.java:103:10:103:10 | o | semmle.label | o | -| A.java:108:36:108:43 | o [ : Number] | semmle.label | o [ : Number] | -| A.java:116:9:116:10 | o3 | semmle.label | o3 | +| A2.java:15:15:15:28 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A2.java:27:27:27:34 | o [ : Number] | semmle.label | o [ : Number] | +| A2.java:29:9:29:9 | o | semmle.label | o | +| A2.java:37:10:37:10 | o | semmle.label | o | +| A.java:14:29:14:36 | o [ : Number] | semmle.label | o [ : Number] | +| A.java:16:9:16:9 | o | semmle.label | o | +| A.java:20:30:20:37 | o [ : Number] | semmle.label | o [ : Number] | +| A.java:22:9:22:9 | o | semmle.label | o | +| A.java:26:31:26:38 | o [ : Number] | semmle.label | o [ : Number] | +| A.java:28:9:28:9 | o | semmle.label | o | +| A.java:32:35:32:42 | o [ : Number] | semmle.label | o [ : Number] | +| A.java:40:8:40:9 | o3 | semmle.label | o3 | +| A.java:43:36:43:43 | o [ : Number] | semmle.label | o [ : Number] | +| A.java:43:36:43:43 | o [ : Number] | semmle.label | o [ : Number] | +| A.java:43:36:43:43 | o [ : Number] | semmle.label | o [ : Number] | +| A.java:51:8:51:9 | o3 | semmle.label | o3 | +| A.java:62:18:62:31 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:63:19:63:32 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:64:20:64:33 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:65:24:65:37 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:66:25:66:38 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:67:25:67:38 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:68:25:68:38 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:69:8:69:40 | flowThrough(...) | semmle.label | flowThrough(...) | +| A.java:69:20:69:33 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:71:25:71:38 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:84:18:84:31 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:85:19:85:32 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:86:20:86:33 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:87:24:87:37 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:88:8:88:37 | flowThrough(...) | semmle.label | flowThrough(...) | +| A.java:88:20:88:33 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:99:20:99:33 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:100:21:100:34 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:101:26:101:39 | new Integer(...) [ : Number] | semmle.label | new Integer(...) [ : Number] | +| A.java:106:30:106:37 | o [ : Number] | semmle.label | o [ : Number] | +| A.java:108:10:108:10 | o | semmle.label | o | +| A.java:113:31:113:38 | o [ : Number] | semmle.label | o [ : Number] | +| A.java:115:10:115:10 | o | semmle.label | o | +| A.java:120:36:120:43 | o [ : Number] | semmle.label | o [ : Number] | +| A.java:128:9:128:10 | o3 | semmle.label | o3 | #select -| A.java:53:18:53:31 | new Integer(...) [ : Number] | A.java:53:18:53:31 | new Integer(...) [ : Number] | A.java:8:9:8:9 | o | $@ | A.java:8:9:8:9 | o | o | -| A.java:54:19:54:32 | new Integer(...) [ : Number] | A.java:54:19:54:32 | new Integer(...) [ : Number] | A.java:14:9:14:9 | o | $@ | A.java:14:9:14:9 | o | o | -| A.java:55:20:55:33 | new Integer(...) [ : Number] | A.java:55:20:55:33 | new Integer(...) [ : Number] | A.java:20:9:20:9 | o | $@ | A.java:20:9:20:9 | o | o | -| A.java:56:24:56:37 | new Integer(...) [ : Number] | A.java:56:24:56:37 | new Integer(...) [ : Number] | A.java:32:8:32:9 | o3 | $@ | A.java:32:8:32:9 | o3 | o3 | -| A.java:57:25:57:38 | new Integer(...) [ : Number] | A.java:57:25:57:38 | new Integer(...) [ : Number] | A.java:43:8:43:9 | o3 | $@ | A.java:43:8:43:9 | o3 | o3 | -| A.java:58:25:58:38 | new Integer(...) [ : Number] | A.java:58:25:58:38 | new Integer(...) [ : Number] | A.java:43:8:43:9 | o3 | $@ | A.java:43:8:43:9 | o3 | o3 | -| A.java:59:25:59:38 | new Integer(...) [ : Number] | A.java:59:25:59:38 | new Integer(...) [ : Number] | A.java:43:8:43:9 | o3 | $@ | A.java:43:8:43:9 | o3 | o3 | -| A.java:61:25:61:38 | new Integer(...) [ : Number] | A.java:61:25:61:38 | new Integer(...) [ : Number] | A.java:43:8:43:9 | o3 | $@ | A.java:43:8:43:9 | o3 | o3 | -| A.java:73:18:73:31 | new Integer(...) [ : Number] | A.java:73:18:73:31 | new Integer(...) [ : Number] | A.java:8:9:8:9 | o | $@ | A.java:8:9:8:9 | o | o | -| A.java:74:19:74:32 | new Integer(...) [ : Number] | A.java:74:19:74:32 | new Integer(...) [ : Number] | A.java:14:9:14:9 | o | $@ | A.java:14:9:14:9 | o | o | -| A.java:75:20:75:33 | new Integer(...) [ : Number] | A.java:75:20:75:33 | new Integer(...) [ : Number] | A.java:20:9:20:9 | o | $@ | A.java:20:9:20:9 | o | o | -| A.java:76:24:76:37 | new Integer(...) [ : Number] | A.java:76:24:76:37 | new Integer(...) [ : Number] | A.java:32:8:32:9 | o3 | $@ | A.java:32:8:32:9 | o3 | o3 | -| A.java:87:20:87:33 | new Integer(...) [ : Number] | A.java:87:20:87:33 | new Integer(...) [ : Number] | A.java:96:10:96:10 | o | $@ | A.java:96:10:96:10 | o | o | -| A.java:88:21:88:34 | new Integer(...) [ : Number] | A.java:88:21:88:34 | new Integer(...) [ : Number] | A.java:103:10:103:10 | o | $@ | A.java:103:10:103:10 | o | o | -| A.java:89:26:89:39 | new Integer(...) [ : Number] | A.java:89:26:89:39 | new Integer(...) [ : Number] | A.java:116:9:116:10 | o3 | $@ | A.java:116:9:116:10 | o3 | o3 | +| A2.java:15:15:15:28 | new Integer(...) [ : Number] | A2.java:15:15:15:28 | new Integer(...) [ : Number] | A2.java:29:9:29:9 | o | $@ | A2.java:29:9:29:9 | o | o | +| A.java:62:18:62:31 | new Integer(...) [ : Number] | A.java:62:18:62:31 | new Integer(...) [ : Number] | A.java:16:9:16:9 | o | $@ | A.java:16:9:16:9 | o | o | +| A.java:63:19:63:32 | new Integer(...) [ : Number] | A.java:63:19:63:32 | new Integer(...) [ : Number] | A.java:22:9:22:9 | o | $@ | A.java:22:9:22:9 | o | o | +| A.java:64:20:64:33 | new Integer(...) [ : Number] | A.java:64:20:64:33 | new Integer(...) [ : Number] | A.java:28:9:28:9 | o | $@ | A.java:28:9:28:9 | o | o | +| A.java:65:24:65:37 | new Integer(...) [ : Number] | A.java:65:24:65:37 | new Integer(...) [ : Number] | A.java:40:8:40:9 | o3 | $@ | A.java:40:8:40:9 | o3 | o3 | +| A.java:66:25:66:38 | new Integer(...) [ : Number] | A.java:66:25:66:38 | new Integer(...) [ : Number] | A.java:51:8:51:9 | o3 | $@ | A.java:51:8:51:9 | o3 | o3 | +| A.java:67:25:67:38 | new Integer(...) [ : Number] | A.java:67:25:67:38 | new Integer(...) [ : Number] | A.java:51:8:51:9 | o3 | $@ | A.java:51:8:51:9 | o3 | o3 | +| A.java:68:25:68:38 | new Integer(...) [ : Number] | A.java:68:25:68:38 | new Integer(...) [ : Number] | A.java:51:8:51:9 | o3 | $@ | A.java:51:8:51:9 | o3 | o3 | +| A.java:69:20:69:33 | new Integer(...) [ : Number] | A.java:69:20:69:33 | new Integer(...) [ : Number] | A.java:69:8:69:40 | flowThrough(...) | $@ | A.java:69:8:69:40 | flowThrough(...) | flowThrough(...) | +| A.java:71:25:71:38 | new Integer(...) [ : Number] | A.java:71:25:71:38 | new Integer(...) [ : Number] | A.java:51:8:51:9 | o3 | $@ | A.java:51:8:51:9 | o3 | o3 | +| A.java:84:18:84:31 | new Integer(...) [ : Number] | A.java:84:18:84:31 | new Integer(...) [ : Number] | A.java:16:9:16:9 | o | $@ | A.java:16:9:16:9 | o | o | +| A.java:85:19:85:32 | new Integer(...) [ : Number] | A.java:85:19:85:32 | new Integer(...) [ : Number] | A.java:22:9:22:9 | o | $@ | A.java:22:9:22:9 | o | o | +| A.java:86:20:86:33 | new Integer(...) [ : Number] | A.java:86:20:86:33 | new Integer(...) [ : Number] | A.java:28:9:28:9 | o | $@ | A.java:28:9:28:9 | o | o | +| A.java:87:24:87:37 | new Integer(...) [ : Number] | A.java:87:24:87:37 | new Integer(...) [ : Number] | A.java:40:8:40:9 | o3 | $@ | A.java:40:8:40:9 | o3 | o3 | +| A.java:88:20:88:33 | new Integer(...) [ : Number] | A.java:88:20:88:33 | new Integer(...) [ : Number] | A.java:88:8:88:37 | flowThrough(...) | $@ | A.java:88:8:88:37 | flowThrough(...) | flowThrough(...) | +| A.java:99:20:99:33 | new Integer(...) [ : Number] | A.java:99:20:99:33 | new Integer(...) [ : Number] | A.java:108:10:108:10 | o | $@ | A.java:108:10:108:10 | o | o | +| A.java:100:21:100:34 | new Integer(...) [ : Number] | A.java:100:21:100:34 | new Integer(...) [ : Number] | A.java:115:10:115:10 | o | $@ | A.java:115:10:115:10 | o | o | +| A.java:101:26:101:39 | new Integer(...) [ : Number] | A.java:101:26:101:39 | new Integer(...) [ : Number] | A.java:128:9:128:10 | o3 | $@ | A.java:128:9:128:10 | o3 | o3 | diff --git a/java/ql/test/library-tests/dataflow/call-sensitivity/log/javac-errors.log b/java/ql/test/library-tests/dataflow/call-sensitivity/log/javac-errors.log new file mode 100644 index 00000000000..7c34e62eead --- /dev/null +++ b/java/ql/test/library-tests/dataflow/call-sensitivity/log/javac-errors.log @@ -0,0 +1,8 @@ +[2019-09-30 16:01:44] [ERROR] Exception running the extractor with arguments: --javacOptions -source 8 --strict-javac-errors --encoding UTF-8 --files A.java A2.java InterfaceA.java +[2019-09-30 16:01:44] [ERROR] Exception: + com.semmle.util.exception.ResourceError: Neither TRAP_FOLDER nor ODASA_JAVA_LAYOUT was set + at com.semmle.extractor.java.OdasaOutput.(OdasaOutput.java:95) + at com.semmle.extractor.java.JavaExtractor.createOutput(JavaExtractor.java:443) + at com.semmle.extractor.java.JavaExtractor.runExtractor(JavaExtractor.java:234) + at com.semmle.extractor.java.JavaExtractor.runExtractor(JavaExtractor.java:222) + at com.semmle.extractor.java.JavaExtractor.main(JavaExtractor.java:475) diff --git a/java/ql/test/library-tests/dataflow/call-sensitivity/log/javac-extractor-6836.log b/java/ql/test/library-tests/dataflow/call-sensitivity/log/javac-extractor-6836.log new file mode 100644 index 00000000000..e3876bc70d2 --- /dev/null +++ b/java/ql/test/library-tests/dataflow/call-sensitivity/log/javac-extractor-6836.log @@ -0,0 +1,3 @@ +[2019-09-30 16:01:44] [javac-extractor-6836] Starting extraction for: + sun.java.command=com.semmle.extractor.java.JavaExtractor --javacOptions -source 8 --strict-javac-errors --encoding UTF-8 --files A.java A2.java InterfaceA.java + user.dir=/home/corni/build/ql/java/ql/test/library-tests/dataflow/call-sensitivity diff --git a/java/ql/test/library-tests/dataflow/call-sensitivity/log/log.log b/java/ql/test/library-tests/dataflow/call-sensitivity/log/log.log new file mode 100644 index 00000000000..7c34e62eead --- /dev/null +++ b/java/ql/test/library-tests/dataflow/call-sensitivity/log/log.log @@ -0,0 +1,8 @@ +[2019-09-30 16:01:44] [ERROR] Exception running the extractor with arguments: --javacOptions -source 8 --strict-javac-errors --encoding UTF-8 --files A.java A2.java InterfaceA.java +[2019-09-30 16:01:44] [ERROR] Exception: + com.semmle.util.exception.ResourceError: Neither TRAP_FOLDER nor ODASA_JAVA_LAYOUT was set + at com.semmle.extractor.java.OdasaOutput.(OdasaOutput.java:95) + at com.semmle.extractor.java.JavaExtractor.createOutput(JavaExtractor.java:443) + at com.semmle.extractor.java.JavaExtractor.runExtractor(JavaExtractor.java:234) + at com.semmle.extractor.java.JavaExtractor.runExtractor(JavaExtractor.java:222) + at com.semmle.extractor.java.JavaExtractor.main(JavaExtractor.java:475)