From 14880983314a5fcc9263c9aa7e1d3dee6cc744cd Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Sun, 30 Jun 2024 05:48:46 +0200 Subject: [PATCH] JSpecify: fix crashes where declared parameter / return types were raw (#989) We were lacking bailouts for these cases --- .../nullaway/generics/GenericsChecks.java | 8 +++++ .../uber/nullaway/jspecify/GenericsTests.java | 30 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java b/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java index 52d54fabc9..cac2ac7bfc 100644 --- a/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java +++ b/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java @@ -356,6 +356,10 @@ public static void checkTypeParameterNullnessForFunctionReturnType( } Type formalReturnType = methodSymbol.getReturnType(); + if (formalReturnType.isRaw()) { + // bail out of any checking involving raw types for now + return; + } Type returnExpressionType = getTreeType(retExpr, state); if (formalReturnType != null && returnExpressionType != null) { boolean isReturnTypeValid = @@ -511,6 +515,10 @@ public static void compareGenericTypeParameterNullabilityForCall( } for (int i = 0; i < n; i++) { Type formalParameter = formalParams.get(i).type; + if (formalParameter.isRaw()) { + // bail out of any checking involving raw types for now + return; + } Type actualParameter = getTreeType(actualParams.get(i), state); if (actualParameter != null) { if (!subtypeParameterNullability(formalParameter, actualParameter, state)) { diff --git a/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java b/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java index 9afa80b0bf..10736da214 100644 --- a/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java +++ b/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java @@ -1756,6 +1756,36 @@ public void testRawTypeReceiverCast() { .doTest(); } + @Test + public void pseudoAssignmentWithRawDeclaredTypes() { + makeHelper() + .addSourceLines( + "Test.java", + "package com.uber;", + "import org.jspecify.annotations.Nullable;", + "class Test {", + " static class A {", + " void foo(T n) {}", + " }", + " static class B {", + " static void bar(A a) {}", + " static void m1(A a) {", + " bar(a);", + " }", + " static A m2(A a) {", + " return a;", + " }", + " @Nullable A field;", + " void m3(A a) {", + " field = a;", + " A local = a;", + " local = a;", + " }", + " }", + "}") + .doTest(); + } + @Test public void testUseOfUnannotatedCode() { makeHelper()