From 10c529fa0eb186c15292af5967b654316547d25d Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 12 Nov 2024 08:28:53 -0800 Subject: [PATCH 01/10] WIP --- .../com/uber/nullaway/jarinfer/JarInferIntegrationTest.java | 2 ++ .../com/uber/nullaway/jarinfer/toys/unannotated/Toys.java | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/jar-infer/nullaway-integration-test/src/test/java/com/uber/nullaway/jarinfer/JarInferIntegrationTest.java b/jar-infer/nullaway-integration-test/src/test/java/com/uber/nullaway/jarinfer/JarInferIntegrationTest.java index e7f2c07e98..45d7487f6d 100644 --- a/jar-infer/nullaway-integration-test/src/test/java/com/uber/nullaway/jarinfer/JarInferIntegrationTest.java +++ b/jar-infer/nullaway-integration-test/src/test/java/com/uber/nullaway/jarinfer/JarInferIntegrationTest.java @@ -88,6 +88,8 @@ public void genericsTest() { " Toys.Generic g = new Toys.Generic<>();", " // BUG: Diagnostic contains: passing @Nullable parameter 'null'", " g.getString(null);", + " // BUG: Diagnostic contains: passing @Nullable parameter 'null'", + " Toys.genericParam(null);", " }", "}") .doTest(); diff --git a/jar-infer/test-java-lib-jarinfer/src/main/java/com/uber/nullaway/jarinfer/toys/unannotated/Toys.java b/jar-infer/test-java-lib-jarinfer/src/main/java/com/uber/nullaway/jarinfer/toys/unannotated/Toys.java index 1c781faa52..47600f2735 100644 --- a/jar-infer/test-java-lib-jarinfer/src/main/java/com/uber/nullaway/jarinfer/toys/unannotated/Toys.java +++ b/jar-infer/test-java-lib-jarinfer/src/main/java/com/uber/nullaway/jarinfer/toys/unannotated/Toys.java @@ -43,6 +43,11 @@ public String getString(T t) { } } + public static void genericParam(Generic g) { + g.getString("hello"); + } + ; + public static void main(String arg[]) throws java.io.IOException { String s = "test string..."; Foo f = new Foo("let's"); From 118ce10de4ce83fff602faf525da3aa044592201 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 19 Nov 2024 19:10:37 -0800 Subject: [PATCH 02/10] WIP --- .../DefinitelyDerefedParamsDriver.java | 64 +++++++++++++++---- .../uber/nullaway/jarinfer/JarInferTest.java | 21 ++++++ 2 files changed, 71 insertions(+), 14 deletions(-) diff --git a/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java b/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java index ea06ebd4a1..659ab93498 100644 --- a/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java +++ b/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java @@ -42,6 +42,8 @@ import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.types.ClassLoaderReference; import com.ibm.wala.types.TypeReference; +import com.ibm.wala.types.generics.MethodTypeSignature; +import com.ibm.wala.types.generics.TypeSignature; import com.ibm.wala.util.collections.Iterator2Iterable; import com.ibm.wala.util.config.FileOfClasses; import com.uber.nullaway.libmodel.MethodAnnotationsRecord; @@ -507,16 +509,32 @@ private String getSignature(IMethod mtd) { */ // TODO: handle generics and inner classes private static String getAstubxSignature(IMethod mtd) { - String classType = - mtd.getDeclaringClass().getName().toString().replaceAll("/", "\\.").substring(1); - classType = classType.replaceAll("\\$", "\\."); // handle inner class - String returnType = mtd.isInit() ? null : getSimpleTypeName(mtd.getReturnType()); - String strArgTypes = ""; - int argi = mtd.isStatic() ? 0 : 1; // Skip 'this' parameter - for (; argi < mtd.getNumberOfParameters(); argi++) { - strArgTypes += getSimpleTypeName(mtd.getParameterType(argi)); - if (argi < mtd.getNumberOfParameters() - 1) { - strArgTypes += ", "; + Preconditions.checkArgument( + mtd instanceof ShrikeCTMethod, "Method is not a ShrikeCTMethod from bytecodes"); + // mtd.getDeclaringClass().getName().toString().replaceAll("/", "\\.").substring(1); + String classType = getQualifiedTypeName(mtd.getDeclaringClass().getReference()); + MethodTypeSignature sig = null; + try { + sig = ((ShrikeCTMethod) mtd).getMethodTypeSignature(); + } catch (InvalidClassFileException e) { + // TODO log something + } + String returnType; + int numParams = mtd.isStatic() ? mtd.getNumberOfParameters() : mtd.getNumberOfParameters() - 1; + String[] argTypes = new String[numParams]; + if (sig != null) { + // generics involved + returnType = getQualifiedTypeName(sig.getReturnType().toString()); + TypeSignature[] argTypeSigs = sig.getArguments(); + for (int i = 0; i < argTypeSigs.length; i++) { + argTypes[i] = getQualifiedTypeName(argTypeSigs[i].toString()); + } + } else { + // classType = classType.replaceAll("\\$", "\\."); // handle inner class + returnType = mtd.isInit() ? null : getQualifiedTypeName(mtd.getReturnType()); + int argi = mtd.isStatic() ? 0 : 1; // Skip 'this' parameter + for (int i = 0; i < numParams; i++) { + argTypes[i] = getQualifiedTypeName(mtd.getParameterType(argi++)); } } return classType @@ -524,17 +542,35 @@ private static String getAstubxSignature(IMethod mtd) { + (returnType == null ? "void " : returnType + " ") + mtd.getName().toString() + "(" - + strArgTypes + + String.join(", ", argTypes) + ")"; } /** - * Get simple unqualified type name. + * Get qualified type name. * * @param typ Type Reference. * @return String Unqualified type name. */ - private static String getSimpleTypeName(TypeReference typ) { - return StringStuff.jvmToBinaryName(typ.getName().toString()); + private static String getQualifiedTypeName(TypeReference typ) { + String typeName = typ.getName().toString(); + return getQualifiedTypeName(typeName); + } + + private static String getQualifiedTypeName(String typeName) { + if (typeName.endsWith(";")) { + typeName = typeName.substring(0, typeName.length() - 1); + } + boolean isGeneric = typeName.contains("<"); + if (!isGeneric) { + return StringStuff.jvmToReadableType(typeName); + } + int idx = typeName.indexOf("<"); + String baseType = typeName.substring(0, idx); + String[] genericTypeArgs = typeName.substring(idx + 1, typeName.length() - 1).split(";"); + for (int i = 0; i < genericTypeArgs.length; i++) { + genericTypeArgs[i] = getQualifiedTypeName(genericTypeArgs[i]); + } + return getQualifiedTypeName(baseType) + "<" + String.join(",", genericTypeArgs) + ">"; } } diff --git a/jar-infer/jar-infer-lib/src/test/java/com/uber/nullaway/jarinfer/JarInferTest.java b/jar-infer/jar-infer-lib/src/test/java/com/uber/nullaway/jarinfer/JarInferTest.java index 10345ac7d5..b0ac5d2459 100644 --- a/jar-infer/jar-infer-lib/src/test/java/com/uber/nullaway/jarinfer/JarInferTest.java +++ b/jar-infer/jar-infer-lib/src/test/java/com/uber/nullaway/jarinfer/JarInferTest.java @@ -461,6 +461,27 @@ public void testGenericMethod() throws Exception { "}"); } + @Test + public void testMethodWithGenericParameter() throws Exception { + testTemplate( + "testMethodWithGenericParameter", + "generic", + "TestGeneric", + ImmutableMap.of( + "generic.TestGeneric:java.lang.String getString(generic.TestGeneric.Generic)", + Set.of(0)), + "public class TestGeneric {", + " static class Generic {", + " public String foo(T t) {", + " return \"hi\";", + " }", + " }", + " public String getString(Generic g) {", + " return g.foo(\"test\");", + " }", + "}"); + } + @Test public void toyJARAnnotatingClasses() throws Exception { testAnnotationInJarTemplate( From de8d1381632d182bafec3b51d36c6e28e833ec61 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 19 Nov 2024 20:51:52 -0800 Subject: [PATCH 03/10] fix for type variables --- build.gradle | 1 + gradle/dependencies.gradle | 2 +- .../jarinfer/DefinitelyDerefedParamsDriver.java | 14 +++++++++++--- .../com/uber/nullaway/jarinfer/JarInferTest.java | 5 ++--- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index c3cb4c0c0d..5be643856e 100644 --- a/build.gradle +++ b/build.gradle @@ -105,6 +105,7 @@ subprojects { project -> repositories { mavenCentral() google() + mavenLocal() } // Spotless complains when applied to the folders containing projects diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 81af7d7b6f..9b64c8fb80 100755 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -48,7 +48,7 @@ def versions = [ // The version of Error Prone that NullAway is compiled and tested against errorProneApi : errorProneVersionToCompileAgainst, support : "27.1.1", - wala : "1.6.7", + wala : "1.6.8-SNAPSHOT", commonscli : "1.4", autoValue : "1.10.2", autoService : "1.1.1", diff --git a/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java b/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java index 659ab93498..305e4ef5f7 100644 --- a/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java +++ b/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java @@ -44,6 +44,7 @@ import com.ibm.wala.types.TypeReference; import com.ibm.wala.types.generics.MethodTypeSignature; import com.ibm.wala.types.generics.TypeSignature; +import com.ibm.wala.types.generics.TypeVariableSignature; import com.ibm.wala.util.collections.Iterator2Iterable; import com.ibm.wala.util.config.FileOfClasses; import com.uber.nullaway.libmodel.MethodAnnotationsRecord; @@ -558,12 +559,19 @@ private static String getQualifiedTypeName(TypeReference typ) { } private static String getQualifiedTypeName(String typeName) { - if (typeName.endsWith(";")) { - typeName = typeName.substring(0, typeName.length() - 1); + if (!typeName.endsWith(";")) { + typeName = typeName + ";"; + // typeName = typeName.substring(0, typeName.length() - 1); } boolean isGeneric = typeName.contains("<"); if (!isGeneric) { - return StringStuff.jvmToReadableType(typeName); + TypeSignature ts = TypeSignature.make(typeName); + if (ts.isTypeVariable()) { + return ((TypeVariableSignature) ts).getIdentifier(); + } else { + String tsStr = ts.toString(); + return StringStuff.jvmToReadableType(tsStr.substring(0, tsStr.length() - 1)); + } } int idx = typeName.indexOf("<"); String baseType = typeName.substring(0, idx); diff --git a/jar-infer/jar-infer-lib/src/test/java/com/uber/nullaway/jarinfer/JarInferTest.java b/jar-infer/jar-infer-lib/src/test/java/com/uber/nullaway/jarinfer/JarInferTest.java index b0ac5d2459..a98ffa4100 100644 --- a/jar-infer/jar-infer-lib/src/test/java/com/uber/nullaway/jarinfer/JarInferTest.java +++ b/jar-infer/jar-infer-lib/src/test/java/com/uber/nullaway/jarinfer/JarInferTest.java @@ -448,8 +448,7 @@ public void testGenericMethod() throws Exception { "testGenericMethod", "generic", "TestGeneric", - ImmutableMap.of( - "generic.TestGeneric:java.lang.String foo(java.lang.Object)", Sets.newHashSet(0)), + ImmutableMap.of("generic.TestGeneric:java.lang.String foo(T)", Sets.newHashSet(0)), "public class TestGeneric {", " public String foo(T t) {", " return t.toString();", @@ -469,7 +468,7 @@ public void testMethodWithGenericParameter() throws Exception { "TestGeneric", ImmutableMap.of( "generic.TestGeneric:java.lang.String getString(generic.TestGeneric.Generic)", - Set.of(0)), + Sets.newHashSet(0)), "public class TestGeneric {", " static class Generic {", " public String foo(T t) {", From 04731daa339107438ce4cb7f48fc7b867ba32e7f Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 19 Nov 2024 21:02:30 -0800 Subject: [PATCH 04/10] more --- .../nullaway/jarinfer/DefinitelyDerefedParamsDriver.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java b/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java index 305e4ef5f7..eb46676553 100644 --- a/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java +++ b/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java @@ -570,12 +570,15 @@ private static String getQualifiedTypeName(String typeName) { return ((TypeVariableSignature) ts).getIdentifier(); } else { String tsStr = ts.toString(); - return StringStuff.jvmToReadableType(tsStr.substring(0, tsStr.length() - 1)); + if (tsStr.endsWith(";")) { + tsStr = tsStr.substring(0, tsStr.length() - 1); + } + return StringStuff.jvmToReadableType(tsStr); } } int idx = typeName.indexOf("<"); String baseType = typeName.substring(0, idx); - String[] genericTypeArgs = typeName.substring(idx + 1, typeName.length() - 1).split(";"); + String[] genericTypeArgs = typeName.substring(idx + 1, typeName.length() - 2).split(";"); for (int i = 0; i < genericTypeArgs.length; i++) { genericTypeArgs[i] = getQualifiedTypeName(genericTypeArgs[i]); } From 84caaa5ebfeeda02dcd90ea33654785ab37a49ee Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Tue, 19 Nov 2024 22:14:31 -0800 Subject: [PATCH 05/10] another fix --- .../uber/nullaway/handlers/InferredJARModelsHandler.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/nullaway/src/main/java/com/uber/nullaway/handlers/InferredJARModelsHandler.java b/nullaway/src/main/java/com/uber/nullaway/handlers/InferredJARModelsHandler.java index edaaf9d83b..4c95cf8a5d 100644 --- a/nullaway/src/main/java/com/uber/nullaway/handlers/InferredJARModelsHandler.java +++ b/nullaway/src/main/java/com/uber/nullaway/handlers/InferredJARModelsHandler.java @@ -38,7 +38,6 @@ import java.util.Map; import java.util.Set; import javax.lang.model.element.Modifier; -import javax.lang.model.type.TypeKind; import org.checkerframework.nullaway.dataflow.cfg.node.MethodInvocationNode; import org.jspecify.annotations.Nullable; @@ -247,10 +246,6 @@ private String getMethodSignature(Symbol.MethodSymbol method) { } private String getSimpleTypeName(Type typ) { - if (typ.getKind() == TypeKind.TYPEVAR) { - return typ.getUpperBound().tsym.getQualifiedName().toString(); - } else { - return typ.toString(); - } + return typ.toString(); } } From 938f2076e4e395f1626d762733163cf0ec6b95b8 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 21 Nov 2024 17:08:03 -0800 Subject: [PATCH 06/10] Update to WALA 1.6.8 release --- build.gradle | 1 - gradle/dependencies.gradle | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 5be643856e..c3cb4c0c0d 100644 --- a/build.gradle +++ b/build.gradle @@ -105,7 +105,6 @@ subprojects { project -> repositories { mavenCentral() google() - mavenLocal() } // Spotless complains when applied to the folders containing projects diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 9b64c8fb80..08bb8bf672 100755 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -48,7 +48,7 @@ def versions = [ // The version of Error Prone that NullAway is compiled and tested against errorProneApi : errorProneVersionToCompileAgainst, support : "27.1.1", - wala : "1.6.8-SNAPSHOT", + wala : "1.6.8", commonscli : "1.4", autoValue : "1.10.2", autoService : "1.1.1", From 663077bdb60bab3244aa2fa677249f3336fe8228 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 21 Nov 2024 17:26:05 -0800 Subject: [PATCH 07/10] improve documentation --- .../DefinitelyDerefedParamsDriver.java | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java b/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java index eb46676553..9c6905503b 100644 --- a/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java +++ b/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java @@ -508,12 +508,10 @@ private String getSignature(IMethod mtd) { * @param mtd Method reference. * @return String Method signature. */ - // TODO: handle generics and inner classes private static String getAstubxSignature(IMethod mtd) { Preconditions.checkArgument( mtd instanceof ShrikeCTMethod, "Method is not a ShrikeCTMethod from bytecodes"); - // mtd.getDeclaringClass().getName().toString().replaceAll("/", "\\.").substring(1); - String classType = getQualifiedTypeName(mtd.getDeclaringClass().getReference()); + String classType = getSourceLevelQualifiedTypeName(mtd.getDeclaringClass().getReference()); MethodTypeSignature sig = null; try { sig = ((ShrikeCTMethod) mtd).getMethodTypeSignature(); @@ -525,17 +523,17 @@ private static String getAstubxSignature(IMethod mtd) { String[] argTypes = new String[numParams]; if (sig != null) { // generics involved - returnType = getQualifiedTypeName(sig.getReturnType().toString()); + returnType = getSourceLevelQualifiedTypeName(sig.getReturnType().toString()); TypeSignature[] argTypeSigs = sig.getArguments(); for (int i = 0; i < argTypeSigs.length; i++) { - argTypes[i] = getQualifiedTypeName(argTypeSigs[i].toString()); + argTypes[i] = getSourceLevelQualifiedTypeName(argTypeSigs[i].toString()); } } else { // classType = classType.replaceAll("\\$", "\\."); // handle inner class - returnType = mtd.isInit() ? null : getQualifiedTypeName(mtd.getReturnType()); + returnType = mtd.isInit() ? null : getSourceLevelQualifiedTypeName(mtd.getReturnType()); int argi = mtd.isStatic() ? 0 : 1; // Skip 'this' parameter for (int i = 0; i < numParams; i++) { - argTypes[i] = getQualifiedTypeName(mtd.getParameterType(argi++)); + argTypes[i] = getSourceLevelQualifiedTypeName(mtd.getParameterType(argi++)); } } return classType @@ -548,40 +546,56 @@ private static String getAstubxSignature(IMethod mtd) { } /** - * Get qualified type name. + * Get the source-level qualified type name for a TypeReference. * * @param typ Type Reference. - * @return String Unqualified type name. + * @return source-level qualified type name. + * @see #getSourceLevelQualifiedTypeName(String) */ - private static String getQualifiedTypeName(TypeReference typ) { + private static String getSourceLevelQualifiedTypeName(TypeReference typ) { String typeName = typ.getName().toString(); - return getQualifiedTypeName(typeName); + return getSourceLevelQualifiedTypeName(typeName); } - private static String getQualifiedTypeName(String typeName) { + /** + * Converts a JVM-level qualified type (e.g., {@code Lcom/example/Foo$Baz;}) to a source-level + * qualified type (e.g., {@code com.example.Foo.Baz}). Nested types like generic type arguments + * are converted recursively. + * + * @param typeName JVM-level qualified type name. + * @return source-level qualified type name. + */ + private static String getSourceLevelQualifiedTypeName(String typeName) { if (!typeName.endsWith(";")) { + // we need the semicolon since some of WALA's TypeSignature APIs expect it typeName = typeName + ";"; - // typeName = typeName.substring(0, typeName.length() - 1); } boolean isGeneric = typeName.contains("<"); - if (!isGeneric) { + if (!isGeneric) { // base case TypeSignature ts = TypeSignature.make(typeName); if (ts.isTypeVariable()) { + // TypeVariableSignature's toString() returns more than just the identifier return ((TypeVariableSignature) ts).getIdentifier(); } else { String tsStr = ts.toString(); if (tsStr.endsWith(";")) { + // remove trailing semicolon tsStr = tsStr.substring(0, tsStr.length() - 1); } return StringStuff.jvmToReadableType(tsStr); } + } else { // generic type + int idx = typeName.indexOf("<"); + String baseType = typeName.substring(0, idx); + // generic type args are separated by semicolons in signature stored in bytecodes + String[] genericTypeArgs = typeName.substring(idx + 1, typeName.length() - 2).split(";"); + for (int i = 0; i < genericTypeArgs.length; i++) { + genericTypeArgs[i] = getSourceLevelQualifiedTypeName(genericTypeArgs[i]); + } + return getSourceLevelQualifiedTypeName(baseType) + + "<" + + String.join(",", genericTypeArgs) + + ">"; } - int idx = typeName.indexOf("<"); - String baseType = typeName.substring(0, idx); - String[] genericTypeArgs = typeName.substring(idx + 1, typeName.length() - 2).split(";"); - for (int i = 0; i < genericTypeArgs.length; i++) { - genericTypeArgs[i] = getQualifiedTypeName(genericTypeArgs[i]); - } - return getQualifiedTypeName(baseType) + "<" + String.join(",", genericTypeArgs) + ">"; } } From e5ba353dde12ee68ccdd070b1da66d07c853fb00 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 21 Nov 2024 17:34:13 -0800 Subject: [PATCH 08/10] cleanup --- .../DefinitelyDerefedParamsDriver.java | 18 +++++++++--------- .../handlers/InferredJARModelsHandler.java | 17 +++++------------ 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java b/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java index 9c6905503b..1cd4c79ade 100644 --- a/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java +++ b/jar-infer/jar-infer-lib/src/main/java/com/uber/nullaway/jarinfer/DefinitelyDerefedParamsDriver.java @@ -512,24 +512,24 @@ private static String getAstubxSignature(IMethod mtd) { Preconditions.checkArgument( mtd instanceof ShrikeCTMethod, "Method is not a ShrikeCTMethod from bytecodes"); String classType = getSourceLevelQualifiedTypeName(mtd.getDeclaringClass().getReference()); - MethodTypeSignature sig = null; + MethodTypeSignature genericSignature = null; try { - sig = ((ShrikeCTMethod) mtd).getMethodTypeSignature(); + genericSignature = ((ShrikeCTMethod) mtd).getMethodTypeSignature(); } catch (InvalidClassFileException e) { - // TODO log something + // don't fail, just proceed without the generic signature + LOG(DEBUG, "DEBUG", "Invalid class file exception: " + e.getMessage()); } String returnType; int numParams = mtd.isStatic() ? mtd.getNumberOfParameters() : mtd.getNumberOfParameters() - 1; String[] argTypes = new String[numParams]; - if (sig != null) { - // generics involved - returnType = getSourceLevelQualifiedTypeName(sig.getReturnType().toString()); - TypeSignature[] argTypeSigs = sig.getArguments(); + if (genericSignature != null) { + // get types that include generic type arguments + returnType = getSourceLevelQualifiedTypeName(genericSignature.getReturnType().toString()); + TypeSignature[] argTypeSigs = genericSignature.getArguments(); for (int i = 0; i < argTypeSigs.length; i++) { argTypes[i] = getSourceLevelQualifiedTypeName(argTypeSigs[i].toString()); } - } else { - // classType = classType.replaceAll("\\$", "\\."); // handle inner class + } else { // no generics returnType = mtd.isInit() ? null : getSourceLevelQualifiedTypeName(mtd.getReturnType()); int argi = mtd.isStatic() ? 0 : 1; // Skip 'this' parameter for (int i = 0; i < numParams; i++) { diff --git a/nullaway/src/main/java/com/uber/nullaway/handlers/InferredJARModelsHandler.java b/nullaway/src/main/java/com/uber/nullaway/handlers/InferredJARModelsHandler.java index 4c95cf8a5d..aec47b9db9 100644 --- a/nullaway/src/main/java/com/uber/nullaway/handlers/InferredJARModelsHandler.java +++ b/nullaway/src/main/java/com/uber/nullaway/handlers/InferredJARModelsHandler.java @@ -27,7 +27,6 @@ import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.Tree; import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.code.Type; import com.sun.tools.javac.util.Context; import com.uber.nullaway.NullAway; import com.uber.nullaway.Nullness; @@ -229,23 +228,17 @@ private String getMethodSignature(Symbol.MethodSymbol method) { String methodSign = method.enclClass().getQualifiedName().toString() + ":" - + (method.isStaticOrInstanceInit() - ? "" - : getSimpleTypeName(method.getReturnType()) + " ") + + (method.isStaticOrInstanceInit() ? "" : method.getReturnType() + " ") + method.getSimpleName() + "("; if (!method.getParameters().isEmpty()) { - for (Symbol.VarSymbol var : method.getParameters()) { - methodSign += getSimpleTypeName(var.type) + ", "; - } - methodSign = methodSign.substring(0, methodSign.lastIndexOf(',')); + methodSign += + String.join( + ", ", + method.getParameters().stream().map(p -> p.type.toString()).toArray(String[]::new)); } methodSign += ")"; LOG(DEBUG, "DEBUG", "@ method sign: " + methodSign); return methodSign; } - - private String getSimpleTypeName(Type typ) { - return typ.toString(); - } } From 33adba1f36ff169d8af3bffa01cd2053f38abba7 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 21 Nov 2024 17:37:07 -0800 Subject: [PATCH 09/10] remove errant semicolon --- .../java/com/uber/nullaway/jarinfer/toys/unannotated/Toys.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jar-infer/test-java-lib-jarinfer/src/main/java/com/uber/nullaway/jarinfer/toys/unannotated/Toys.java b/jar-infer/test-java-lib-jarinfer/src/main/java/com/uber/nullaway/jarinfer/toys/unannotated/Toys.java index 47600f2735..f397a14942 100644 --- a/jar-infer/test-java-lib-jarinfer/src/main/java/com/uber/nullaway/jarinfer/toys/unannotated/Toys.java +++ b/jar-infer/test-java-lib-jarinfer/src/main/java/com/uber/nullaway/jarinfer/toys/unannotated/Toys.java @@ -46,7 +46,6 @@ public String getString(T t) { public static void genericParam(Generic g) { g.getString("hello"); } - ; public static void main(String arg[]) throws java.io.IOException { String s = "test string..."; From 0ec20a2d19536ac03e368e9793a536afffd077e4 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Mon, 9 Dec 2024 08:28:42 -0800 Subject: [PATCH 10/10] latest WALA --- gradle/dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 08bb8bf672..417be1dde9 100755 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -48,7 +48,7 @@ def versions = [ // The version of Error Prone that NullAway is compiled and tested against errorProneApi : errorProneVersionToCompileAgainst, support : "27.1.1", - wala : "1.6.8", + wala : "1.6.9", commonscli : "1.4", autoValue : "1.10.2", autoService : "1.1.1",