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.ClassLoaderFactory;
import com.ibm.wala.classLoader.ClassLoaderFactoryImpl; import com.ibm.wala.classLoader.ClassLoaderFactoryImpl;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.core.tests.util.TestConstants; import com.ibm.wala.core.tests.util.TestConstants;
import com.ibm.wala.core.tests.util.WalaTestCase; 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.ipa.cha.ClassHierarchyFactory;
import com.ibm.wala.types.ClassLoaderReference; import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.types.MethodReference; import com.ibm.wala.types.MethodReference;
import com.ibm.wala.types.Selector;
import com.ibm.wala.types.TypeReference; import com.ibm.wala.types.TypeReference;
import com.ibm.wala.util.config.AnalysisScopeReader; import com.ibm.wala.util.config.AnalysisScopeReader;
import com.ibm.wala.util.io.FileProvider; import com.ibm.wala.util.io.FileProvider;
@ -96,4 +98,12 @@ public class GetTargetsTest extends WalaTestCase {
} }
Assert.assertEquals(1, c.size()); 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 // 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(); IClass superclass = getSuperclass();
if (superclass != null) { if (superclass != null) {
IMethod inherit = superclass.getMethod(selector); IMethod inherit = superclass.getMethod(selector);