You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Lóránt Pintér (JIRA)" <ji...@apache.org> on 2018/08/06 12:27:00 UTC

[jira] [Created] (GROOVY-8732) @CompileStatic allows access to private

Lóránt Pintér created GROOVY-8732:
-------------------------------------

             Summary: @CompileStatic allows access to private 
                 Key: GROOVY-8732
                 URL: https://issues.apache.org/jira/browse/GROOVY-8732
             Project: Groovy
          Issue Type: Bug
          Components: Static compilation
    Affects Versions: 2.5.1, 3.0.0-alpha-3, 2.6.0-alpha-4, 2.4.15
            Reporter: Lóránt Pintér


{code}
import groovy.transform.CompileStatic

@CompileStatic
interface Thing {
    void call()
}

@CompileStatic
class ThingImpl implements Thing {
    void call() {}
}

@CompileStatic
class Parent {
    private final ThingImpl thing

    public Thing getThing() { null }
}

@CompileStatic
class Child extends Parent {
    public void doSomething() {
        thing.call()
    }
}
{code}

Compile via: {{groovyc Example.groovy}}.

The line {{thing.call}} in {{Child.doSomething()}} calls {{getThing()}}, but then ends up referring to the returned value according to the private field's type from {{Parent}} ({{ThingImpl}}) instead of the actual returned type ({{Thing}}). The private field from {{Parent}} (or its type) should not be visible to {{Child}} at all.

{code}
  public void doSomething();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokevirtual #20                 // Method Parent.getThing:()LThing;
         4: checkcast     #22                 // class ThingImpl
         7: invokevirtual #25                 // Method ThingImpl.call:()V
        10: aconst_null
        11: pop
        12: return
{code}

This is causing now problems for Gradle plugins compiled against Grade 4.9 or before trying to run on Gradle 4.9, because we've made a change to an internal type (`ProjectInternal`) that ended up being referred to via this bug in compiled and released code. See https://github.com/gradle/gradle/issues/6027



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)