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:
parent
a19507312a
commit
76faa4df2d
|
@ -0,0 +1,15 @@
|
|||
package methodLookup;
|
||||
|
||||
public class MethodLookupStuff {
|
||||
|
||||
static class A {
|
||||
A(int foo) {
|
||||
}
|
||||
|
||||
A() {}
|
||||
}
|
||||
|
||||
static class B extends A {
|
||||
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue