diff --git a/java/ql/lib/change-notes/2023-04-03-UnsupportedOperationException-summary.md b/java/ql/lib/change-notes/2023-04-03-UnsupportedOperationException-summary.md new file mode 100644 index 00000000000..178e05b818b --- /dev/null +++ b/java/ql/lib/change-notes/2023-04-03-UnsupportedOperationException-summary.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added a summary model for the `java.lang.UnsupportedOperationException(String)` constructor. diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index 4295225f092..2a5e6be07e3 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -132,6 +132,8 @@ extensions: - ["java.lang", "Throwable", True, "getMessage", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] - ["java.lang", "Throwable", True, "getLocalizedMessage", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] - ["java.lang", "Throwable", True, "toString", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "taint", "manual"] + - ["java.lang", "UnsupportedOperationException", False, "UnsupportedOperationException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] + - addsTo: pack: codeql/java-all extensible: neutralModel diff --git a/java/ql/src/Metrics/Summaries/TopJdkApis.qll b/java/ql/src/Metrics/Summaries/TopJdkApis.qll index b0a8902b12b..5358cf425b0 100644 --- a/java/ql/src/Metrics/Summaries/TopJdkApis.qll +++ b/java/ql/src/Metrics/Summaries/TopJdkApis.qll @@ -56,7 +56,8 @@ predicate topJdkApiName(string apiName) { "java.lang.StringBuilder#append(int)", "java.util.Objects#requireNonNull(Object,String)", "java.nio.file.Path#resolve(String)", "java.lang.Enum#toString()", "java.lang.RuntimeException#RuntimeException(Throwable)", "java.util.Collection#size()", - "java.lang.String#charAt(int)", "java.util.stream.Stream#forEach(Consumer)", + "java.lang.String#charAt(int)", + "java.lang.UnsupportedOperationException#UnsupportedOperationException(String)", "java.util.Map#isEmpty()", "java.lang.String#valueOf(int)", // top 200 JDK APIs "java.lang.Integer#intValue()", "java.util.ArrayList#size()", diff --git a/java/ql/test/ext/TestModels/Test.java b/java/ql/test/ext/TestModels/Test.java index 0f52da636e6..021047bb5e2 100644 --- a/java/ql/test/ext/TestModels/Test.java +++ b/java/ql/test/ext/TestModels/Test.java @@ -44,6 +44,9 @@ public class Test { Exception e4 = new IllegalStateException((String)source()); sink((String)e4.getMessage()); // $hasValueFlow + Exception e5 = new UnsupportedOperationException((String)source()); + sink((String)e5.getMessage()); // $hasValueFlow + Throwable t = new Throwable((Throwable)source()); sink((Throwable)t.getCause()); // $hasValueFlow diff --git a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/UnsupportedOperationException.java b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/UnsupportedOperationException.java new file mode 100644 index 00000000000..1d24a9f9247 --- /dev/null +++ b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApis/java/lang/UnsupportedOperationException.java @@ -0,0 +1,9 @@ +// Manually created from java.lang.UnsupportedOperationException for testing purposes + +package java.lang; + + +public class UnsupportedOperationException +{ + public UnsupportedOperationException(String p0){} // manual summary +} 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 aa7d0fbd4e0..d32407f4ddf 100644 --- a/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected +++ b/java/ql/test/query-tests/Metrics/GeneratedVsManualCoverage/TopJdkApisTest/TopJdkApisTest.expected @@ -1,5 +1,5 @@ | java.io | 0 | 0 | 22 | 9 | 31 | 0.7096774193548387 | 0.0 | 0.7096774193548387 | 0.0 | NaN | 0.2903225806451613 | -| java.lang | 0 | 0 | 59 | 89 | 148 | 0.39864864864864863 | 0.0 | 0.39864864864864863 | 0.0 | NaN | 0.6013513513513513 | +| java.lang | 0 | 0 | 60 | 89 | 149 | 0.40268456375838924 | 0.0 | 0.40268456375838924 | 0.0 | NaN | 0.5973154362416108 | | 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 |