Revert "Fix inadequate detection of package private accesses"
This reverts commit 65be8bcf65bac299cf8d84d600c65119ff0a2258.
Reason for revert: Failures on internal bot
Change-Id: I08e1f0e7fa5dead0a4a273600002f3a69a9b2110
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 68700e4..8760fb8 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -24,7 +24,6 @@
import com.android.tools.r8.graph.DefaultInstanceInitializerCode;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexClassAndField;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMember;
@@ -2107,8 +2106,8 @@
}
}
- // Searches for a reference to a non-private, non-public class, field or method declared in the
- // same package as [source].
+ // Searches for a reference to a non-public class, field or method declared in the same package
+ // as [source].
public static class IllegalAccessDetector extends UseRegistryWithResult<Boolean, ProgramMethod> {
private final AppView<? extends AppInfoWithClassHierarchy> appView;
@@ -2119,143 +2118,106 @@
this.appView = appView;
}
- private boolean checkFoundPackagePrivateAccess() {
- assert getResult();
- return true;
- }
+ private boolean checkFieldReference(DexField field) {
+ DexType baseType =
+ appView.graphLens().lookupType(field.holder.toBaseType(appView.dexItemFactory()));
+ if (baseType.isClassType() && baseType.isSamePackage(getContext().getHolderType())) {
+ if (checkTypeReference(field.holder) || checkTypeReference(field.type)) {
+ return true;
+ }
- private boolean setFoundPackagePrivateAccess() {
- setResult(true);
- return true;
- }
-
- private static boolean continueSearchForPackagePrivateAccess() {
+ DexEncodedField definition = appView.appInfo().resolveField(field).getResolvedField();
+ if (definition == null || !definition.accessFlags.isPublic()) {
+ setResult(true);
+ return true;
+ }
+ }
return false;
}
- private boolean checkFieldReference(DexField field) {
- return internalCheckFieldReference(field, appView.graphLens());
- }
-
- private boolean checkRewrittenFieldReference(DexField field) {
- return internalCheckFieldReference(field, GraphLens.getIdentityLens());
- }
-
- private boolean internalCheckFieldReference(DexField field, GraphLens graphLens) {
- DexField rewrittenField = graphLens.lookupField(field);
- assert rewrittenField.getHolderType().isClassType();
- DexType rewrittenFieldHolder = rewrittenField.getHolderType();
- if (rewrittenFieldHolder.isSamePackage(getContext().getHolderType())) {
- if (checkRewrittenTypeReference(rewrittenFieldHolder)) {
- return checkFoundPackagePrivateAccess();
- }
- DexClassAndField resolvedField =
- appView.appInfo().resolveField(rewrittenField).getResolutionPair();
- if (resolvedField == null) {
- return setFoundPackagePrivateAccess();
- }
- if (resolvedField.getHolder() != getContext().getHolder()
- && !resolvedField.getAccessFlags().isPublic()) {
- return setFoundPackagePrivateAccess();
- }
- }
- return continueSearchForPackagePrivateAccess();
- }
-
- private boolean checkRewrittenMethodReference(
- DexMethod rewrittenMethod, OptionalBool isInterface) {
- DexType baseType = rewrittenMethod.getHolderType().toBaseType(appView.dexItemFactory());
+ private boolean checkMethodReference(DexMethod method, OptionalBool isInterface) {
+ DexType baseType =
+ appView.graphLens().lookupType(method.holder.toBaseType(appView.dexItemFactory()));
if (baseType.isClassType() && baseType.isSamePackage(getContext().getHolderType())) {
- if (checkTypeReference(rewrittenMethod.getHolderType())) {
- return checkFoundPackagePrivateAccess();
+ if (checkTypeReference(method.holder)
+ || checkTypeReference(method.proto.returnType)
+ || Iterables.any(method.getParameters(), this::checkTypeReference)) {
+ return true;
}
+
MethodResolutionResult resolutionResult =
isInterface.isUnknown()
- ? appView.appInfo().unsafeResolveMethodDueToDexFormat(rewrittenMethod)
- : appView.appInfo().resolveMethod(rewrittenMethod, isInterface.isTrue());
- if (!resolutionResult.isSingleResolution()) {
- return setFoundPackagePrivateAccess();
- }
- DexClassAndMethod resolvedMethod =
- resolutionResult.asSingleResolution().getResolutionPair();
- if (resolvedMethod.getHolder() != getContext().getHolder()
- && !resolvedMethod.getAccessFlags().isPublic()) {
- return setFoundPackagePrivateAccess();
+ ? appView.appInfo().unsafeResolveMethodDueToDexFormatLegacy(method)
+ : appView.appInfo().resolveMethodLegacy(method, isInterface.isTrue());
+ if (!resolutionResult.isSingleResolution()
+ || !resolutionResult.asSingleResolution().getResolvedMethod().isPublic()) {
+ setResult(true);
+ return true;
}
}
- return continueSearchForPackagePrivateAccess();
+ return false;
}
private boolean checkTypeReference(DexType type) {
- return internalCheckTypeReference(type, appView.graphLens());
- }
-
- private boolean checkRewrittenTypeReference(DexType type) {
- return internalCheckTypeReference(type, GraphLens.getIdentityLens());
- }
-
- private boolean internalCheckTypeReference(DexType type, GraphLens graphLens) {
- DexType baseType = graphLens.lookupType(type.toBaseType(appView.dexItemFactory()));
+ DexType baseType = appView.graphLens().lookupType(type.toBaseType(appView.dexItemFactory()));
if (baseType.isClassType() && baseType.isSamePackage(getContext().getHolderType())) {
DexClass clazz = appView.definitionFor(baseType);
- if (clazz == null || !clazz.isPublic()) {
- return setFoundPackagePrivateAccess();
+ if (clazz == null || !clazz.accessFlags.isPublic()) {
+ setResult(true);
+ return true;
}
}
- return continueSearchForPackagePrivateAccess();
+ return false;
}
@Override
public void registerInitClass(DexType clazz) {
- if (appView.initClassLens().isFinal()) {
- // The InitClass lens is always rewritten up until the most recent graph lens, so first map
- // the class type to the most recent graph lens.
- DexType rewrittenType = appView.graphLens().lookupType(clazz);
- DexField initClassField = appView.initClassLens().getInitClassField(rewrittenType);
- checkRewrittenFieldReference(initClassField);
- } else {
- checkTypeReference(clazz);
- }
+ checkTypeReference(clazz);
}
@Override
public void registerInvokeVirtual(DexMethod method) {
- MethodLookupResult lookup = appView.graphLens().lookupInvokeVirtual(method, getContext());
- checkRewrittenMethodReference(lookup.getReference(), OptionalBool.FALSE);
+ MethodLookupResult lookup =
+ appView.graphLens().lookupMethod(method, getContext().getReference(), VIRTUAL);
+ checkMethodReference(lookup.getReference(), OptionalBool.FALSE);
}
@Override
public void registerInvokeDirect(DexMethod method) {
- MethodLookupResult lookup = appView.graphLens().lookupInvokeDirect(method, getContext());
- checkRewrittenMethodReference(lookup.getReference(), OptionalBool.UNKNOWN);
+ MethodLookupResult lookup =
+ appView.graphLens().lookupMethod(method, getContext().getReference(), DIRECT);
+ checkMethodReference(lookup.getReference(), OptionalBool.UNKNOWN);
}
@Override
public void registerInvokeStatic(DexMethod method) {
- MethodLookupResult lookup = appView.graphLens().lookupInvokeStatic(method, getContext());
- checkRewrittenMethodReference(lookup.getReference(), OptionalBool.UNKNOWN);
+ MethodLookupResult lookup =
+ appView.graphLens().lookupMethod(method, getContext().getReference(), Type.STATIC);
+ checkMethodReference(lookup.getReference(), OptionalBool.UNKNOWN);
}
@Override
public void registerInvokeInterface(DexMethod method) {
- MethodLookupResult lookup = appView.graphLens().lookupInvokeInterface(method, getContext());
- checkRewrittenMethodReference(lookup.getReference(), OptionalBool.TRUE);
+ MethodLookupResult lookup =
+ appView.graphLens().lookupMethod(method, getContext().getReference(), Type.INTERFACE);
+ checkMethodReference(lookup.getReference(), OptionalBool.TRUE);
}
@Override
public void registerInvokeSuper(DexMethod method) {
- MethodLookupResult lookup = appView.graphLens().lookupInvokeSuper(method, getContext());
- checkRewrittenMethodReference(lookup.getReference(), OptionalBool.UNKNOWN);
+ MethodLookupResult lookup =
+ appView.graphLens().lookupMethod(method, getContext().getReference(), Type.SUPER);
+ checkMethodReference(lookup.getReference(), OptionalBool.UNKNOWN);
}
@Override
public void registerInstanceFieldWrite(DexField field) {
- checkFieldReference(field);
+ checkFieldReference(appView.graphLens().lookupField(field));
}
@Override
public void registerInstanceFieldRead(DexField field) {
- checkFieldReference(field);
+ checkFieldReference(appView.graphLens().lookupField(field));
}
@Override
@@ -2265,12 +2227,12 @@
@Override
public void registerStaticFieldRead(DexField field) {
- checkFieldReference(field);
+ checkFieldReference(appView.graphLens().lookupField(field));
}
@Override
public void registerStaticFieldWrite(DexField field) {
- checkFieldReference(field);
+ checkFieldReference(appView.graphLens().lookupField(field));
}
@Override
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/InitClassToPackagePrivateFieldWithCrossPackageMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/InitClassToPackagePrivateFieldWithCrossPackageMergingTest.java
index af9f880..ed2130d 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/InitClassToPackagePrivateFieldWithCrossPackageMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/InitClassToPackagePrivateFieldWithCrossPackageMergingTest.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.utils.codeinspector.HorizontallyMergedClassesInspector;
+import com.android.tools.r8.references.Reference;
import com.google.common.collect.ImmutableList;
import java.util.List;
import org.junit.Test;
@@ -47,13 +47,16 @@
.addProgramClassFileData(getProgramClassFileData())
.addKeepMainRule(Main.class)
.addHorizontallyMergedClassesInspector(
- HorizontallyMergedClassesInspector::assertNoClassesMerged)
+ inspector ->
+ inspector.assertMergedInto(
+ Reference.classFromClass(A.class),
+ Reference.classFromDescriptor(NEW_B_DESCRIPTOR)))
.enableInliningAnnotations()
.enableNoHorizontalClassMergingAnnotations()
.setMinApi(parameters.getApiLevel())
.compile()
.run(parameters.getRuntime(), Main.class)
- .assertSuccessWithOutputLines("Hello, world!");
+ .assertFailureWithErrorThatThrows(IllegalAccessError.class);
}
private List<byte[]> getProgramClassFileData() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/internal/YouTubeV1719Test.java b/src/test/java/com/android/tools/r8/internal/YouTubeV1719Test.java
index c78212b..dbeb66b 100644
--- a/src/test/java/com/android/tools/r8/internal/YouTubeV1719Test.java
+++ b/src/test/java/com/android/tools/r8/internal/YouTubeV1719Test.java
@@ -40,7 +40,6 @@
import java.nio.file.Paths;
import java.util.concurrent.ExecutionException;
import org.junit.After;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -192,7 +191,6 @@
* Validates that when all protos are kept and the proto optmization is enabled, the generated
* proto schemas are identical to the proto schemas in the input.
*/
- @Ignore
@Test
public void testProtoRewriting() throws Exception {
assumeTrue(shouldRunSlowTests());
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
index 483f18b..907ca27 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
@@ -19,7 +19,6 @@
import com.android.tools.r8.kotlin.TestKotlinClass.AccessorKind;
import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
import com.android.tools.r8.naming.MemberNaming;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -220,9 +219,7 @@
runTest(PROPERTIES_PACKAGE_NAME, mainClass)
.inspect(
inspector -> {
- if (allowAccessModification
- || (testParameters.isDexRuntime()
- && testParameters.getApiLevel().isGreaterThan(AndroidApiLevel.B))) {
+ if (allowAccessModification) {
checkClassIsRemoved(inspector, testedClass.getOuterClassName());
return;
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
index 527e568..59ba99b 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
@@ -11,7 +11,6 @@
import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
import com.android.tools.r8.naming.MemberNaming;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -510,9 +509,7 @@
inspector -> {
checkClassIsRemoved(inspector, testedClass.getClassName());
- if (allowAccessModification
- || (testParameters.isDexRuntime()
- && testParameters.getApiLevel().isGreaterThan(AndroidApiLevel.B))) {
+ if (allowAccessModification) {
checkClassIsRemoved(inspector, testedClass.getOuterClassName());
return;
}