From aa9dc3a764da5920e8887f9139e5bc946723eb1f Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Wed, 12 Oct 2022 12:42:27 +0200 Subject: [PATCH 1/3] Kotlin: Add test case for useless parameter FP --- java/ql/test/kotlin/query-tests/UselessParameter/Test.kt | 2 ++ .../query-tests/UselessParameter/UselessParameter.expected | 2 ++ 2 files changed, 4 insertions(+) diff --git a/java/ql/test/kotlin/query-tests/UselessParameter/Test.kt b/java/ql/test/kotlin/query-tests/UselessParameter/Test.kt index f476eba616c..8675f01bf58 100644 --- a/java/ql/test/kotlin/query-tests/UselessParameter/Test.kt +++ b/java/ql/test/kotlin/query-tests/UselessParameter/Test.kt @@ -7,3 +7,5 @@ class B : A { println("a") } } + +fun fn(a: Int = 10) {} diff --git a/java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.expected b/java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.expected index e69de29bb2d..e53f04ec1c9 100644 --- a/java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.expected +++ b/java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.expected @@ -0,0 +1,2 @@ +| Test.kt:11:1:11:22 | p2 | The parameter 'p2' is never used. | +| Test.kt:11:8:11:18 | a | The parameter 'a' is never used. | From 955336fb222f8ccd626b7d0ce69b5f731ec0b494 Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Wed, 12 Oct 2022 12:42:56 +0200 Subject: [PATCH 2/3] Kotlin: exclude generated code from useless parameter check --- java/ql/lib/semmle/code/java/deadcode/DeadCode.qll | 3 +++ .../query-tests/UselessParameter/UselessParameter.expected | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll b/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll index 8dbb9bb530e..c9d77a17115 100644 --- a/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll +++ b/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll @@ -304,6 +304,9 @@ class RootdefCallable extends Callable { this.getAnAnnotation() instanceof OverrideAnnotation or this.hasModifier("override") + or + // Exclude generated callables, such as `...$default` ones extracted from Kotlin code. + this.isCompilerGenerated() } } diff --git a/java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.expected b/java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.expected index e53f04ec1c9..106448e7ed7 100644 --- a/java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.expected +++ b/java/ql/test/kotlin/query-tests/UselessParameter/UselessParameter.expected @@ -1,2 +1 @@ -| Test.kt:11:1:11:22 | p2 | The parameter 'p2' is never used. | | Test.kt:11:8:11:18 | a | The parameter 'a' is never used. | From 0d6da9ca7fca916d909257e68deea19e64bdf5f5 Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Wed, 12 Oct 2022 12:58:28 +0200 Subject: [PATCH 3/3] Exclude serialization constructors from useless parameters check --- java/ql/lib/semmle/code/java/deadcode/DeadCode.qll | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll b/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll index c9d77a17115..edeb9e9dccf 100644 --- a/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll +++ b/java/ql/lib/semmle/code/java/deadcode/DeadCode.qll @@ -307,6 +307,12 @@ class RootdefCallable extends Callable { or // Exclude generated callables, such as `...$default` ones extracted from Kotlin code. this.isCompilerGenerated() + or + // Exclude Kotlin serialization constructors. + this.(Constructor) + .getParameterType(this.getNumberOfParameters() - 1) + .(RefType) + .hasQualifiedName("kotlinx.serialization.internal", "SerializationConstructorMarker") } }