From 406dc08c5fe261f1e9f4f363a404723d9aff1572 Mon Sep 17 00:00:00 2001 From: Cole Faust Date: Wed, 1 Feb 2023 17:33:40 -0800 Subject: [PATCH] Fix crash in RequiresPermissionChecker.java Bug: 265320139 Test: atest --host error_prone_android_framework_test Change-Id: Ia46d5e7cab4d39888c4975ded18c59d5eb918ffa --- .../android/RequiresPermissionChecker.java | 4 ++-- .../RequiresPermissionCheckerTest.java | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java b/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java index fa1730728afb5..d39d4b4661435 100644 --- a/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java +++ b/errorprone/java/com/google/errorprone/bugpatterns/android/RequiresPermissionChecker.java @@ -412,11 +412,11 @@ public final class RequiresPermissionChecker extends BugChecker private static ParsedRequiresPermission parseRequiresPermissionRecursively( MethodInvocationTree tree, VisitorState state) { - if (ENFORCE_VIA_CONTEXT.matches(tree, state)) { + if (ENFORCE_VIA_CONTEXT.matches(tree, state) && tree.getArguments().size() > 0) { final ParsedRequiresPermission res = new ParsedRequiresPermission(); res.allOf.add(String.valueOf(ASTHelpers.constValue(tree.getArguments().get(0)))); return res; - } else if (ENFORCE_VIA_CHECKER.matches(tree, state)) { + } else if (ENFORCE_VIA_CHECKER.matches(tree, state) && tree.getArguments().size() > 1) { final ParsedRequiresPermission res = new ParsedRequiresPermission(); res.allOf.add(String.valueOf(ASTHelpers.constValue(tree.getArguments().get(1)))); return res; diff --git a/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java index 388988e5e9bd4..38831b1936103 100644 --- a/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java +++ b/errorprone/tests/java/com/google/errorprone/bugpatterns/android/RequiresPermissionCheckerTest.java @@ -415,4 +415,27 @@ public class RequiresPermissionCheckerTest { "}") .doTest(); } + + @Test + public void testInvalidFunctions() { + compilationHelper + .addSourceFile("/android/annotation/RequiresPermission.java") + .addSourceFile("/android/annotation/SuppressLint.java") + .addSourceFile("/android/content/Context.java") + .addSourceLines("Example.java", + "import android.annotation.RequiresPermission;", + "import android.annotation.SuppressLint;", + "import android.content.Context;", + "class Foo extends Context {", + " private static final String RED = \"red\";", + " public void checkPermission() {", + " }", + " @RequiresPermission(RED)", + " // BUG: Diagnostic contains:", + " public void exampleScoped(Context context) {", + " checkPermission();", + " }", + "}") + .doTest(); + } }