diff --git a/src/main/java/edu/ucr/cs/riple/taint/ucrtainting/serialization/visitors/FixComputer.java b/src/main/java/edu/ucr/cs/riple/taint/ucrtainting/serialization/visitors/FixComputer.java index 7eced55b..f5923d4a 100644 --- a/src/main/java/edu/ucr/cs/riple/taint/ucrtainting/serialization/visitors/FixComputer.java +++ b/src/main/java/edu/ucr/cs/riple/taint/ucrtainting/serialization/visitors/FixComputer.java @@ -149,7 +149,8 @@ public Set visitMethodInvocation(MethodInvocationTree node, FoundRequired p return answer(polyFixes); } } - if (CollectionHandler.isGenericToArrayMethod(calledMethod, types) || CollectionHandler.isToArrayMethod(calledMethod, types)) { + if (CollectionHandler.isGenericToArrayMethod(calledMethod, types) + || CollectionHandler.isToArrayMethod(calledMethod, types)) { return answer(node.accept(collectionFixVisitor, pair)); } if (isGenericMethod) { diff --git a/src/main/java/edu/ucr/cs/riple/taint/ucrtainting/serialization/visitors/GenericMethodFixVisitor.java b/src/main/java/edu/ucr/cs/riple/taint/ucrtainting/serialization/visitors/GenericMethodFixVisitor.java index 8cd44599..73552c16 100644 --- a/src/main/java/edu/ucr/cs/riple/taint/ucrtainting/serialization/visitors/GenericMethodFixVisitor.java +++ b/src/main/java/edu/ucr/cs/riple/taint/ucrtainting/serialization/visitors/GenericMethodFixVisitor.java @@ -72,8 +72,12 @@ public Set visitMethodInvocation(MethodInvocationTree node, FoundRequired p for (Type.TypeVar typeVar : effectiveTypes) { for (int i = 0; i < node.getArguments().size(); i++) { AnnotatedTypeMirror requiredParam = paramsAnnotatedTypeMirrors.get(i).deepCopy(true); + requiredParam = + (requiredParam instanceof AnnotatedTypeMirror.AnnotatedArrayType) + ? ((AnnotatedTypeMirror.AnnotatedArrayType) requiredParam).getComponentType() + : requiredParam; Type paramType = - calledMethod.isVarArgs() + (calledMethod.isVarArgs() && i == node.getArguments().size() - 1) ? ((Type.ArrayType) calledMethod.getParameters().get(0).type).getComponentType() : calledMethod.getParameters().get(i).type; boolean changed = updateAnnotatedTypeMirror(requiredParam, paramType, typeVar); diff --git a/tests/collectionhandling/expected-output.json b/tests/collectionhandling/expected-output.json index 7be98e74..55425952 100644 --- a/tests/collectionhandling/expected-output.json +++ b/tests/collectionhandling/expected-output.json @@ -27,6 +27,49 @@ } } ] + }, + { + "path": "/home/nima/Developer/git/UCRTaintingChecker/tests/collectionhandling/foo/bar/Foo.java", + "messageKey": "assignment", + "offset": 937, + "index": 2, + "region": { + "symbol": "arraysAsListGenericTest()", + "class": "foo.bar.Foo" + }, + "fixes": [ + { + "annotation": "untainted", + "location": { + "path": "/home/nima/Developer/git/UCRTaintingChecker/tests/collectionhandling/foo/bar/Foo.java", + "varName": "array", + "type-variable-position": [ + [ + 0 + ] + ], + "method": "arraysAsListGenericTest()", + "kind": "LOCAL_VARIABLE", + "class": "foo.bar.Foo" + } + }, + { + "annotation": "untainted", + "location": { + "path": "/home/nima/Developer/git/UCRTaintingChecker/tests/collectionhandling/foo/bar/Foo.java", + "varName": "c1", + "type-variable-position": [ + [ + 1, + 0 + ] + ], + "method": "arraysAsListGenericTest()", + "kind": "LOCAL_VARIABLE", + "class": "foo.bar.Foo" + } + } + ] } ] } diff --git a/tests/collectionhandling/foo/bar/Foo.java b/tests/collectionhandling/foo/bar/Foo.java index 4ef148b7..7f1a99f2 100644 --- a/tests/collectionhandling/foo/bar/Foo.java +++ b/tests/collectionhandling/foo/bar/Foo.java @@ -2,9 +2,9 @@ import edu.ucr.cs.riple.taint.ucrtainting.qual.*; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.LinkedList; public class Foo { @@ -24,4 +24,12 @@ void refraingFromApplyingUnannotatedCodeHandlerForToArrayMethod() { // :: error: assignment @RUntainted Object[] array = c1.toArray(); } + + void arraysAsListGenericTest() { + LinkedList c1 = new LinkedList<>(); + c1.addFirst("x"); + Object[] array = c1.toArray(); + // :: error: assignment + List<@RUntainted Object> c2 = java.util.Arrays.asList(array); + } } diff --git a/tests/templatetest/foo/bar/Test.java b/tests/templatetest/foo/bar/Test.java index 4e4e1f38..88b522c6 100644 --- a/tests/templatetest/foo/bar/Test.java +++ b/tests/templatetest/foo/bar/Test.java @@ -1,6 +1,7 @@ package foo.bar; import edu.ucr.cs.riple.taint.ucrtainting.qual.*; +import java.io.*; import java.lang.annotation.*; import java.util.*; import javax.servlet.http.*; diff --git a/thirdparty/bin/main/org/thirdparty/Foo.class b/thirdparty/bin/main/org/thirdparty/Foo.class new file mode 100644 index 00000000..38181310 Binary files /dev/null and b/thirdparty/bin/main/org/thirdparty/Foo.class differ diff --git a/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/README b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/README new file mode 100644 index 00000000..2785863f --- /dev/null +++ b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/README @@ -0,0 +1,2 @@ +The "qual" directory contains a typechecker's type qualifiers, which are +represented by Java annotations. diff --git a/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RPolyTainted.class b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RPolyTainted.class new file mode 100644 index 00000000..b5672b0e Binary files /dev/null and b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RPolyTainted.class differ diff --git a/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RPossiblyValidated.class b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RPossiblyValidated.class new file mode 100644 index 00000000..e1f79320 Binary files /dev/null and b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RPossiblyValidated.class differ diff --git a/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RTainted.class b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RTainted.class new file mode 100644 index 00000000..a7e961ed Binary files /dev/null and b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RTainted.class differ diff --git a/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RThis.class b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RThis.class new file mode 100644 index 00000000..b5208f1b Binary files /dev/null and b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RThis.class differ diff --git a/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RUntainted.class b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RUntainted.class new file mode 100644 index 00000000..fa862569 Binary files /dev/null and b/ucrtainting-checker-qual/bin/main/edu/ucr/cs/riple/taint/ucrtainting/qual/RUntainted.class differ