wala / WALA

T.J. Watson Libraries for Analysis, with frontends for Java, Android, and JavaScript, and may common static program analyses
http://github.com/wala/WALA
Eclipse Public License 2.0
748 stars 221 forks source link

CHA missed an invocation about interface #1391

Open kitty-1998 opened 4 months ago

kitty-1998 commented 4 months ago

Hi, I found a code example which may help improve Wala. See the minimized code example below:

package edu.kitty;
public class Main {
    public static void main(String[] args) {
        Inner i = (a) -> a%7;
        System.out.println(i.bar(1));
    }
    interface Inner {
        int bar(int a);
    }
}

The method main called bar and call graph should have this edge, but I used CHA algorithm to construct the call graph and found no callee target of main.

My Wala version: 1.6.4

msridhar commented 4 months ago

Thanks, yes, this is a known issue. The CHA call graph only includes edges to concrete methods, not abstract methods like Inner.bar. Here, the bar implementation that gets invoked is not immediately evident in the bytecode; the class containing the bar implementation is generated at runtime using invokedynamic (see details here). We do handle such cases with other call graph algorithms, but it's not obviously to me how to handle it in CHA without a good amount of additional complexity.