Fix bug with method lookup (#276)

The previous lookup logic would erroneously look in superclasses for a constructor with parameters.

Bug reported on [the mailing list](https://groups.google.com/forum/#!msg/wala-sourceforge-net/6m_VmDF-lZ0/erZIYQ68BwAJ;context-place=topic/wala-sourceforge-net/TjRzdDyljjY)
This commit is contained in:
Manu Sridharan 2017-12-23 16:38:26 -08:00 committed by GitHub
parent a19507312a
commit 76faa4df2d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 1 deletions

View File

@ -0,0 +1,15 @@
package methodLookup;
public class MethodLookupStuff {
static class A {
A(int foo) {
}
A() {}
}
static class B extends A {
}
}

View File

@ -19,6 +19,7 @@ import org.junit.Test;
import com.ibm.wala.classLoader.ClassLoaderFactory;
import com.ibm.wala.classLoader.ClassLoaderFactoryImpl;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.core.tests.util.TestConstants;
import com.ibm.wala.core.tests.util.WalaTestCase;
@ -28,6 +29,7 @@ import com.ibm.wala.ipa.cha.ClassHierarchyException;
import com.ibm.wala.ipa.cha.ClassHierarchyFactory;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.types.MethodReference;
import com.ibm.wala.types.Selector;
import com.ibm.wala.types.TypeReference;
import com.ibm.wala.util.config.AnalysisScopeReader;
import com.ibm.wala.util.io.FileProvider;
@ -96,4 +98,12 @@ public class GetTargetsTest extends WalaTestCase {
}
Assert.assertEquals(1, c.size());
}
@Test
public void testConstructorLookup() {
IClass testKlass = cha.lookupClass(TypeReference.findOrCreate(ClassLoaderReference.Application,
"LmethodLookup/MethodLookupStuff$B"));
IMethod m = testKlass.getMethod(Selector.make("<init>(I)V"));
Assert.assertNull(m);
}
}

View File

@ -453,7 +453,8 @@ public abstract class BytecodeClass<T extends IClassLoader> implements IClass {
}
// check parent, caching if found
if (!selector.equals(MethodReference.clinitSelector) && !selector.equals(MethodReference.initSelector)) {
if (!selector.equals(MethodReference.clinitSelector)
&& !selector.getName().equals(MethodReference.initAtom)) {
IClass superclass = getSuperclass();
if (superclass != null) {
IMethod inherit = superclass.getMethod(selector);