From bbf3fa750615f04e48eb6f0a55ef81c7abfc79bc Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 1 Mar 2024 09:59:27 +0000 Subject: [PATCH 1/5] do not generate models for toString --- .../lib/semmle/code/java/dataflow/internal/ModelExclusions.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll b/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll index b8c86badd4fa..22a372752449 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll @@ -64,6 +64,7 @@ predicate isUninterestingForModels(Callable c) { isInTestFile(c.getCompilationUnit().getFile()) or isInternal(c.getCompilationUnit()) or c instanceof MainMethod or + c instanceof ToStringMethod or c instanceof StaticInitializer or exists(FunctionalExpr funcExpr | c = funcExpr.asMethod()) or c.getDeclaringType() instanceof TestLibrary or From bb97df1d717de826fdad8827d6ddccc9f99c262c Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 1 Mar 2024 12:11:40 +0000 Subject: [PATCH 2/5] do not generate models for lambda flow methods --- .../java/dataflow/internal/ModelExclusions.qll | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll b/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll index 22a372752449..d1a6e47ecca3 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll @@ -59,12 +59,26 @@ private predicate isInternal(CompilationUnit cu) { cu.getPackage().getName().matches("%internal%") } +/** A method relating to lambda flow. */ +private class LambdaFlowMethod extends Method { + LambdaFlowMethod() { + this.hasQualifiedName("java.lang", "Runnable", "run") or + this.hasQualifiedName("java.util", "Comparator", "comparing") or + this.hasQualifiedName("java.util.function", "BiConsumer", "accept") or + this.hasQualifiedName("java.util.function", "BiFunction", "apply") or + this.hasQualifiedName("java.util.function", "Consumer", "accept") or + this.hasQualifiedName("java.util.function", "Function", "apply") or + this.hasQualifiedName("java.util.function", "Supplier", "get") + } +} + /** Holds if the given callable is not worth modeling. */ predicate isUninterestingForModels(Callable c) { isInTestFile(c.getCompilationUnit().getFile()) or isInternal(c.getCompilationUnit()) or c instanceof MainMethod or c instanceof ToStringMethod or + c instanceof LambdaFlowMethod or c instanceof StaticInitializer or exists(FunctionalExpr funcExpr | c = funcExpr.asMethod()) or c.getDeclaringType() instanceof TestLibrary or From 6e63df9e32c1fec53ccf654410fd2795964e2324 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 1 Mar 2024 14:16:14 +0000 Subject: [PATCH 3/5] Accept test change: toString method no longer generated --- .../utils/modelgenerator/dataflow/CaptureSummaryModels.expected | 1 - 1 file changed, 1 deletion(-) diff --git a/java/ql/test/utils/modelgenerator/dataflow/CaptureSummaryModels.expected b/java/ql/test/utils/modelgenerator/dataflow/CaptureSummaryModels.expected index 014d47f25dd3..2654c4d94d68 100644 --- a/java/ql/test/utils/modelgenerator/dataflow/CaptureSummaryModels.expected +++ b/java/ql/test/utils/modelgenerator/dataflow/CaptureSummaryModels.expected @@ -21,7 +21,6 @@ | p;Joiner;false;merge;(Joiner);;Argument[this];ReturnValue;value;df-generated | | p;Joiner;false;setEmptyValue;(CharSequence);;Argument[0];Argument[this];taint;df-generated | | p;Joiner;false;setEmptyValue;(CharSequence);;Argument[this];ReturnValue;value;df-generated | -| p;Joiner;false;toString;();;Argument[this];ReturnValue;taint;df-generated | | p;MultipleImpl2$IInterface;true;m;(Object);;Argument[0];ReturnValue;taint;df-generated | | p;MultipleImpls$Strat2;true;getValue;();;Argument[this];ReturnValue;taint;df-generated | | p;MultipleImpls$Strategy;true;doSomething;(String);;Argument[0];Argument[this];taint;df-generated | From 5399d88d15d9493c5e0bb2dd4e240221d6f26b7d Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Fri, 1 Mar 2024 14:22:00 +0000 Subject: [PATCH 4/5] Accept test change: slight change in gen vs man modelgen stats --- .../TopJdkApisTest/TopJdkApisTest.expected | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected index a092100b6a74..df21c086b2f8 100644 --- a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected +++ b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected @@ -1,23 +1,23 @@ | java.awt | 0 | 0 | 2 | 1 | 3 | 0.6666666666666666 | 0.0 | 0.6666666666666666 | 0.0 | NaN | 0.3333333333333333 | -| java.io | 0 | 0 | 22 | 15 | 37 | 0.5945945945945946 | 0.0 | 0.5945945945945946 | 0.0 | NaN | 0.40540540540540543 | -| java.lang | 0 | 0 | 62 | 94 | 156 | 0.3974358974358974 | 0.0 | 0.3974358974358974 | 0.0 | NaN | 0.6025641025641025 | +| java.io | 0 | 0 | 21 | 15 | 36 | 0.5833333333333334 | 0.0 | 0.5833333333333334 | 0.0 | NaN | 0.4166666666666667 | +| java.lang | 0 | 0 | 57 | 88 | 145 | 0.3931034482758621 | 0.0 | 0.3931034482758621 | 0.0 | NaN | 0.6068965517241379 | | java.lang.invoke | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.lang.reflect | 0 | 0 | 0 | 4 | 4 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.math | 0 | 0 | 0 | 16 | 16 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.net | 0 | 0 | 5 | 0 | 5 | 1.0 | 0.0 | 1.0 | 0.0 | NaN | 0.0 | +| java.math | 0 | 0 | 0 | 15 | 15 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | +| java.net | 0 | 0 | 4 | 0 | 4 | 1.0 | 0.0 | 1.0 | 0.0 | NaN | 0.0 | | java.nio | 0 | 0 | 2 | 3 | 5 | 0.4 | 0.0 | 0.4 | 0.0 | NaN | 0.6 | | java.nio.charset | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.nio.file | 0 | 0 | 7 | 1 | 8 | 0.875 | 0.0 | 0.875 | 0.0 | NaN | 0.125 | +| java.nio.file | 0 | 0 | 6 | 1 | 7 | 0.8571428571428571 | 0.0 | 0.8571428571428571 | 0.0 | NaN | 0.14285714285714285 | | java.sql | 0 | 0 | 1 | 15 | 16 | 0.0625 | 0.0 | 0.0625 | 0.0 | NaN | 0.9375 | | java.text | 0 | 0 | 0 | 5 | 5 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.time | 0 | 0 | 0 | 17 | 17 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.time.chrono | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.time.format | 0 | 0 | 0 | 2 | 2 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.util | 0 | 0 | 86 | 66 | 152 | 0.5657894736842105 | 0.0 | 0.5657894736842105 | 0.0 | NaN | 0.4342105263157895 | +| java.util | 0 | 0 | 86 | 64 | 150 | 0.5733333333333334 | 0.0 | 0.5733333333333334 | 0.0 | NaN | 0.4266666666666667 | | java.util.concurrent | 0 | 0 | 9 | 9 | 18 | 0.5 | 0.0 | 0.5 | 0.0 | NaN | 0.5 | | java.util.concurrent.atomic | 0 | 0 | 2 | 11 | 13 | 0.15384615384615385 | 0.0 | 0.15384615384615385 | 0.0 | NaN | 0.8461538461538461 | | java.util.concurrent.locks | 0 | 0 | 0 | 2 | 2 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | -| java.util.function | 0 | 0 | 0 | 6 | 6 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | +| java.util.function | 0 | 0 | 0 | 1 | 1 | 0.0 | 0.0 | 0.0 | NaN | NaN | 1.0 | | java.util.logging | 0 | 0 | 1 | 1 | 2 | 0.5 | 0.0 | 0.5 | 0.0 | NaN | 0.5 | | java.util.regex | 0 | 0 | 3 | 1 | 4 | 0.75 | 0.0 | 0.75 | 0.0 | NaN | 0.25 | | java.util.stream | 0 | 0 | 18 | 8 | 26 | 0.6923076923076923 | 0.0 | 0.6923076923076923 | 0.0 | NaN | 0.3076923076923077 | From 114c17ad57692bd5b4918738acd048d7338ec7a8 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Sat, 2 Mar 2024 20:55:30 +0000 Subject: [PATCH 5/5] Add more methods of `java.util.Comparator` --- .../lib/semmle/code/java/dataflow/internal/ModelExclusions.qll | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll b/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll index d1a6e47ecca3..12569b4f6c27 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/ModelExclusions.qll @@ -63,7 +63,8 @@ private predicate isInternal(CompilationUnit cu) { private class LambdaFlowMethod extends Method { LambdaFlowMethod() { this.hasQualifiedName("java.lang", "Runnable", "run") or - this.hasQualifiedName("java.util", "Comparator", "comparing") or + this.hasQualifiedName("java.util", "Comparator", + ["comparing", "comparingDouble", "comparingInt", "comparingLong"]) or this.hasQualifiedName("java.util.function", "BiConsumer", "accept") or this.hasQualifiedName("java.util.function", "BiFunction", "apply") or this.hasQualifiedName("java.util.function", "Consumer", "accept") or