Access static fields directly via the classes that declare them

Previously some of these were accessing such fields through a subclass
of the declaring class.  That creates an unnecessary extra inter-class
dependency lower in the type hierarchy than necessary.

Also, suppress this warning in an automated test input where the
indirect static accesses are explicitly intentional.
This commit is contained in:
Ben Liblit 2017-05-11 18:23:27 +02:00 committed by Manu Sridharan
parent 38c11f0fa6
commit 8cc4daf6a0
17 changed files with 38 additions and 34 deletions

View File

@ -51,6 +51,7 @@ public class MethodMadness {
public static void staticTest() { public static void staticTest() {
System.out.println("staticTest"); System.out.println("staticTest");
} }
@SuppressWarnings("static-access")
protected int protectedInteger() { protected int protectedInteger() {
this.s = 5; this.s = 5;
new MethodMadness("thrownaway").staticTest(); // MethodMadness object evaluated but thrown away new MethodMadness("thrownaway").staticTest(); // MethodMadness object evaluated but thrown away

View File

@ -24,8 +24,8 @@ import org.json.JSONObject;
import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil; import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil;
import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoader;
import com.ibm.wala.cast.js.ssa.JavaScriptInvoke; import com.ibm.wala.cast.js.ssa.JavaScriptInvoke;
import com.ibm.wala.cast.js.types.JavaScriptMethods;
import com.ibm.wala.cast.js.types.JavaScriptTypes; import com.ibm.wala.cast.js.types.JavaScriptTypes;
import com.ibm.wala.cast.types.AstMethodReference;
import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.CallSiteReference;
import com.ibm.wala.classLoader.IClass; import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.IMethod;
@ -118,7 +118,7 @@ public class NodejsRequireTargetSelector implements MethodTargetSelector {
System.err.println(builder.getClassHierarchy()); System.err.println(builder.getClassHierarchy());
IMethod method = script.getMethod(JavaScriptMethods.fnSelector); IMethod method = script.getMethod(AstMethodReference.fnSelector);
previouslyRequired.put(sourceModule.getClassName(), method); previouslyRequired.put(sourceModule.getClassName(), method);
return method; return method;

View File

@ -12,7 +12,6 @@ import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil;
import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptConstructTargetSelector; import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptConstructTargetSelector;
import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptEntryPoints; import com.ibm.wala.cast.js.ipa.callgraph.JavaScriptEntryPoints;
import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoader;
import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil;
import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory;
import com.ibm.wala.classLoader.IMethod; import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.classLoader.Language; import com.ibm.wala.classLoader.Language;
@ -57,7 +56,7 @@ public class Driver {
scope.addToScope( scope.addToScope(
scope.getJavaScriptLoader(), scope.getJavaScriptLoader(),
JSCallGraphBuilderUtil.getPrologueFile("prologue.js")); JSCallGraphUtil.getPrologueFile("prologue.js"));
for(int i = 1; i < args.length; i++) { for(int i = 1; i < args.length; i++) {
URL script = Driver.class.getClassLoader().getResource(args[i]); URL script = Driver.class.getClassLoader().getResource(args[i]);
scope.addToScope( scope.addToScope(

View File

@ -25,6 +25,7 @@ import com.ibm.wala.cast.js.html.WebPageLoaderFactory;
import com.ibm.wala.cast.js.html.WebUtil; import com.ibm.wala.cast.js.html.WebUtil;
import com.ibm.wala.cast.js.html.jericho.JerichoHtmlParser; import com.ibm.wala.cast.js.html.jericho.JerichoHtmlParser;
import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder; import com.ibm.wala.cast.js.ipa.callgraph.JSCFABuilder;
import com.ibm.wala.cast.js.ipa.callgraph.JSCallGraphUtil;
import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoader;
import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil; import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil;
import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory; import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory;
@ -49,7 +50,7 @@ public class JsViewerDriver extends JSCallGraphBuilderUtil {
URL url = new URL(args[0]); URL url = new URL(args[0]);
// computing CG + PA // computing CG + PA
JSCallGraphBuilderUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory()); JSCallGraphUtil.setTranslatorFactory(new CAstRhinoTranslatorFactory());
JavaScriptLoader.addBootstrapFile(WebUtil.preamble); JavaScriptLoader.addBootstrapFile(WebUtil.preamble);
SourceModule[] sources = getSources(domless, url); SourceModule[] sources = getSources(domless, url);

View File

@ -78,7 +78,7 @@ public class FieldBasedCGUtil {
JavaScriptLoaderFactory loaders = new JavaScriptLoaderFactory(translatorFactory); JavaScriptLoaderFactory loaders = new JavaScriptLoaderFactory(translatorFactory);
Module[] scripts = new Module[]{ Module[] scripts = new Module[]{
new SourceURLModule(url), new SourceURLModule(url),
JSCallGraphBuilderUtil.getPrologueFile("prologue.js") JSCallGraphUtil.getPrologueFile("prologue.js")
}; };
return buildCG(loaders, scripts, builderType, monitor, supportFullPointerAnalysis); return buildCG(loaders, scripts, builderType, monitor, supportFullPointerAnalysis);
} }

View File

@ -12,6 +12,7 @@ package com.ibm.wala.cast.js.ipa.callgraph;
import java.util.Map; import java.util.Map;
import com.ibm.wala.cast.ipa.callgraph.CAstCallGraphUtil;
import com.ibm.wala.cast.js.ipa.summaries.JavaScriptSummarizedFunction; import com.ibm.wala.cast.js.ipa.summaries.JavaScriptSummarizedFunction;
import com.ibm.wala.cast.js.ipa.summaries.JavaScriptSummary; import com.ibm.wala.cast.js.ipa.summaries.JavaScriptSummary;
import com.ibm.wala.cast.js.loader.JSCallSiteReference; import com.ibm.wala.cast.js.loader.JSCallSiteReference;
@ -183,7 +184,7 @@ public class JavaScriptFunctionDotCallTargetSelector implements MethodTargetSele
private static String getKey(int nargs, CGNode caller, CallSiteReference site) { private static String getKey(int nargs, CGNode caller, CallSiteReference site) {
if (SEPARATE_SYNTHETIC_METHOD_PER_SITE) { if (SEPARATE_SYNTHETIC_METHOD_PER_SITE) {
return JSCallGraphUtil.getShortName(caller) + "_" + caller.getGraphNodeId() + "_" + site.getProgramCounter(); return CAstCallGraphUtil.getShortName(caller) + "_" + caller.getGraphNodeId() + "_" + site.getProgramCounter();
} else { } else {
return ""+nargs; return ""+nargs;
} }

View File

@ -18,7 +18,6 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import com.ibm.wala.cast.js.loader.JavaScriptLoader; import com.ibm.wala.cast.js.loader.JavaScriptLoader;
import com.ibm.wala.cast.js.types.JavaScriptMethods;
import com.ibm.wala.cast.js.types.JavaScriptTypes; import com.ibm.wala.cast.js.types.JavaScriptTypes;
import com.ibm.wala.cast.types.AstMethodReference; import com.ibm.wala.cast.types.AstMethodReference;
import com.ibm.wala.classLoader.CallSiteReference; import com.ibm.wala.classLoader.CallSiteReference;
@ -79,7 +78,7 @@ public class LoadFileTargetSelector implements MethodTargetSelector {
JSCallGraphUtil.loadAdditionalFile(builder.getClassHierarchy() , cl, url); JSCallGraphUtil.loadAdditionalFile(builder.getClassHierarchy() , cl, url);
loadedFiles.add(url); loadedFiles.add(url);
IClass script = builder.getClassHierarchy().lookupClass(TypeReference.findOrCreate(cl.getReference(), "L" + url.getFile())); IClass script = builder.getClassHierarchy().lookupClass(TypeReference.findOrCreate(cl.getReference(), "L" + url.getFile()));
return script.getMethod(JavaScriptMethods.fnSelector); return script.getMethod(AstMethodReference.fnSelector);
} }
} catch (MalformedURLException e1) { } catch (MalformedURLException e1) {
// do nothing, fall through and return 'target' // do nothing, fall through and return 'target'

View File

@ -189,7 +189,7 @@ public class CAstPrinter {
} }
public static void xmlTo(CAstNode top, CAstSourcePositionMap pos, Writer w) { public static void xmlTo(CAstNode top, CAstSourcePositionMap pos, Writer w) {
instance.doXmlTo(top, pos, w); doXmlTo(top, pos, w);
} }
private static void doXmlTo(CAstNode top, CAstSourcePositionMap pos, Writer w) { private static void doXmlTo(CAstNode top, CAstSourcePositionMap pos, Writer w) {

View File

@ -127,7 +127,7 @@ public final /* singleton */ class AndroidModelClass extends SyntheticClass {
clinit.setStatic(true); clinit.setStatic(true);
final TypeSafeInstructionFactory instructionFactory = new TypeSafeInstructionFactory(cha); final TypeSafeInstructionFactory instructionFactory = new TypeSafeInstructionFactory(cha);
final Set<TypeReference> components = AndroidEntryPointManager.MANAGER.getComponents(); final Set<TypeReference> components = AndroidEntryPointManager.getComponents();
int ssaNo = 1; int ssaNo = 1;
if (AndroidEntryPointManager.MANAGER.doFlatComponents()) { if (AndroidEntryPointManager.MANAGER.doFlatComponents()) {

View File

@ -161,7 +161,7 @@ public class FlatInstantiator implements IInstantiator {
{ // Special type? { // Special type?
final SpecializedInstantiator sInst = new SpecializedInstantiator(body, instructionFactory, pm, final SpecializedInstantiator sInst = new SpecializedInstantiator(body, instructionFactory, pm,
cha, scope, analysisScope, this); cha, scope, analysisScope, this);
if (sInst.understands(T)) { if (SpecializedInstantiator.understands(T)) {
return sInst.createInstance(T, asManaged, key, seen, currentDepth); return sInst.createInstance(T, asManaged, key, seen, currentDepth);
} }
} }

View File

@ -197,7 +197,7 @@ public class SpecializedInstantiator extends FlatInstantiator {
appComponents.add(instance); appComponents.add(instance);
} }
} else { } else {
for (TypeReference component : AndroidEntryPointManager.MANAGER.getComponents()) { for (TypeReference component : AndroidEntryPointManager.getComponents()) {
final VariableKey iKey = new SSAValue.TypeKey(component.getName()); final VariableKey iKey = new SSAValue.TypeKey(component.getName());
if (this.pm.isSeen(iKey)) { if (this.pm.isSeen(iKey)) {

View File

@ -204,7 +204,7 @@ public class Overrides {
{ // Make Mini-Models to override to { // Make Mini-Models to override to
for (final AndroidComponent target: AndroidComponent.values()) { for (final AndroidComponent target: AndroidComponent.values()) {
if (AndroidEntryPointManager.MANAGER.EPContainAny(target)) { if (AndroidEntryPointManager.EPContainAny(target)) {
final AndroidModel targetModel = new UnknownTargetModel(this.cha, this.options, this.cache, target); final AndroidModel targetModel = new UnknownTargetModel(this.cha, this.options, this.cache, target);
callTo.put(target, targetModel); callTo.put(target, targetModel);
} else { } else {

View File

@ -32,7 +32,7 @@ import com.ibm.wala.shrikeBT.analysis.Verifier;
import com.ibm.wala.shrikeBT.shrikeCT.CTDecoder; import com.ibm.wala.shrikeBT.shrikeCT.CTDecoder;
import com.ibm.wala.shrikeBT.shrikeCT.ClassInstrumenter; import com.ibm.wala.shrikeBT.shrikeCT.ClassInstrumenter;
import com.ibm.wala.shrikeBT.shrikeCT.OfflineInstrumenter; import com.ibm.wala.shrikeBT.shrikeCT.OfflineInstrumenter;
import com.ibm.wala.shrikeCT.ClassReader; import com.ibm.wala.shrikeCT.ClassConstants;
import com.ibm.wala.shrikeCT.ClassWriter; import com.ibm.wala.shrikeCT.ClassWriter;
/** /**
@ -190,7 +190,7 @@ public class Bench {
if (ci.isChanged()) { if (ci.isChanged()) {
ClassWriter cw = ci.emitClass(); ClassWriter cw = ci.emitClass();
cw.addField(ClassReader.ACC_PUBLIC | ClassReader.ACC_STATIC, fieldName, Constants.TYPE_boolean, new ClassWriter.Element[0]); cw.addField(ClassConstants.ACC_PUBLIC | ClassConstants.ACC_STATIC, fieldName, Constants.TYPE_boolean, new ClassWriter.Element[0]);
instrumenter.outputModifiedClass(ci, cw); instrumenter.outputModifiedClass(ci, cw);
} }
} }

View File

@ -23,6 +23,7 @@ import com.ibm.wala.shrikeBT.shrikeCT.CTCompiler;
import com.ibm.wala.shrikeBT.shrikeCT.CTDecoder; import com.ibm.wala.shrikeBT.shrikeCT.CTDecoder;
import com.ibm.wala.shrikeBT.shrikeCT.ClassInstrumenter; import com.ibm.wala.shrikeBT.shrikeCT.ClassInstrumenter;
import com.ibm.wala.shrikeBT.shrikeCT.OfflineInstrumenter; import com.ibm.wala.shrikeBT.shrikeCT.OfflineInstrumenter;
import com.ibm.wala.shrikeCT.ClassConstants;
import com.ibm.wala.shrikeCT.ClassReader; import com.ibm.wala.shrikeCT.ClassReader;
import com.ibm.wala.shrikeCT.ClassReader.AttrIterator; import com.ibm.wala.shrikeCT.ClassReader.AttrIterator;
import com.ibm.wala.shrikeCT.ClassWriter; import com.ibm.wala.shrikeCT.ClassWriter;
@ -239,27 +240,27 @@ public class CopyWriter {
private static int copyEntry(ConstantPoolParser cp, ClassWriter w, int i) throws InvalidClassFileException { private static int copyEntry(ConstantPoolParser cp, ClassWriter w, int i) throws InvalidClassFileException {
byte t = cp.getItemType(i); byte t = cp.getItemType(i);
switch (t) { switch (t) {
case ClassReader.CONSTANT_String: case ClassConstants.CONSTANT_String:
return w.addCPString(cp.getCPString(i)); return w.addCPString(cp.getCPString(i));
case ClassReader.CONSTANT_Class: case ClassConstants.CONSTANT_Class:
return w.addCPClass(cp.getCPClass(i)); return w.addCPClass(cp.getCPClass(i));
case ClassReader.CONSTANT_FieldRef: case ClassConstants.CONSTANT_FieldRef:
return w.addCPFieldRef(cp.getCPRefClass(i), cp.getCPRefName(i), cp.getCPRefType(i)); return w.addCPFieldRef(cp.getCPRefClass(i), cp.getCPRefName(i), cp.getCPRefType(i));
case ClassReader.CONSTANT_InterfaceMethodRef: case ClassConstants.CONSTANT_InterfaceMethodRef:
return w.addCPInterfaceMethodRef(cp.getCPRefClass(i), cp.getCPRefName(i), cp.getCPRefType(i)); return w.addCPInterfaceMethodRef(cp.getCPRefClass(i), cp.getCPRefName(i), cp.getCPRefType(i));
case ClassReader.CONSTANT_MethodRef: case ClassConstants.CONSTANT_MethodRef:
return w.addCPMethodRef(cp.getCPRefClass(i), cp.getCPRefName(i), cp.getCPRefType(i)); return w.addCPMethodRef(cp.getCPRefClass(i), cp.getCPRefName(i), cp.getCPRefType(i));
case ClassReader.CONSTANT_NameAndType: case ClassConstants.CONSTANT_NameAndType:
return w.addCPNAT(cp.getCPNATName(i), cp.getCPNATType(i)); return w.addCPNAT(cp.getCPNATName(i), cp.getCPNATType(i));
case ClassReader.CONSTANT_Integer: case ClassConstants.CONSTANT_Integer:
return w.addCPInt(cp.getCPInt(i)); return w.addCPInt(cp.getCPInt(i));
case ClassReader.CONSTANT_Float: case ClassConstants.CONSTANT_Float:
return w.addCPFloat(cp.getCPFloat(i)); return w.addCPFloat(cp.getCPFloat(i));
case ClassReader.CONSTANT_Long: case ClassConstants.CONSTANT_Long:
return w.addCPLong(cp.getCPLong(i)); return w.addCPLong(cp.getCPLong(i));
case ClassReader.CONSTANT_Double: case ClassConstants.CONSTANT_Double:
return w.addCPDouble(cp.getCPDouble(i)); return w.addCPDouble(cp.getCPDouble(i));
case ClassReader.CONSTANT_Utf8: case ClassConstants.CONSTANT_Utf8:
return w.addCPUtf8(cp.getCPUtf8(i)); return w.addCPUtf8(cp.getCPUtf8(i));
} }
return -1; return -1;
@ -292,8 +293,8 @@ public class CopyWriter {
if (1 < CPCount) { if (1 < CPCount) {
switch (cp.getItemType(1)) { switch (cp.getItemType(1)) {
case ClassReader.CONSTANT_Long: case ClassConstants.CONSTANT_Long:
case ClassReader.CONSTANT_Double: case ClassConstants.CONSTANT_Double:
// item 1 is a double-word item, so the next real item is at 3 // item 1 is a double-word item, so the next real item is at 3
// to make sure item 3 is allocated at index 3, we'll need to // to make sure item 3 is allocated at index 3, we'll need to
// insert a dummy entry at index 2 // insert a dummy entry at index 2

View File

@ -59,7 +59,7 @@ final public class ArrayStoreInstruction extends Instruction implements IArraySt
@Override @Override
public String getType() { public String getType() {
return Decoder.indexedTypes[opcode - OP_iastore]; return Constants.indexedTypes[opcode - OP_iastore];
} }
@Override @Override

View File

@ -22,6 +22,7 @@ import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import com.ibm.wala.shrikeBT.Util; import com.ibm.wala.shrikeBT.Util;
import com.ibm.wala.shrikeCT.ClassConstants;
import com.ibm.wala.shrikeCT.ClassReader; import com.ibm.wala.shrikeCT.ClassReader;
import com.ibm.wala.shrikeCT.ClassWriter; import com.ibm.wala.shrikeCT.ClassWriter;
import com.ibm.wala.shrikeCT.ConstantValueWriter; import com.ibm.wala.shrikeCT.ConstantValueWriter;
@ -52,7 +53,7 @@ public class AddSerialVersion {
} }
long UID = computeSerialVersionUID(r); long UID = computeSerialVersionUID(r);
w.addField(ClassReader.ACC_PUBLIC | ClassReader.ACC_STATIC | ClassReader.ACC_FINAL, "serialVersionUID", "J", w.addField(ClassConstants.ACC_PUBLIC | ClassConstants.ACC_STATIC | ClassConstants.ACC_FINAL, "serialVersionUID", "J",
new ClassWriter.Element[] { new ConstantValueWriter(w, UID) }); new ClassWriter.Element[] { new ConstantValueWriter(w, UID) });
} }
@ -112,7 +113,7 @@ public class AddSerialVersion {
int fieldCount = 0; int fieldCount = 0;
for (int f = 0; f < fields.length; f++) { for (int f = 0; f < fields.length; f++) {
int flags = r.getFieldAccessFlags(f); int flags = r.getFieldAccessFlags(f);
if ((flags & ClassReader.ACC_PRIVATE) == 0 || (flags & (ClassReader.ACC_STATIC | ClassReader.ACC_TRANSIENT)) == 0) { if ((flags & ClassConstants.ACC_PRIVATE) == 0 || (flags & (ClassConstants.ACC_STATIC | ClassConstants.ACC_TRANSIENT)) == 0) {
fields[fieldCount] = new Integer(f); fields[fieldCount] = new Integer(f);
fieldNames[f] = r.getFieldName(f); fieldNames[f] = r.getFieldName(f);
fieldCount++; fieldCount++;
@ -141,7 +142,7 @@ public class AddSerialVersion {
for (int m = 0; m < methodSigs.length; m++) { for (int m = 0; m < methodSigs.length; m++) {
String name = r.getMethodName(m); String name = r.getMethodName(m);
int flags = r.getMethodAccessFlags(m); int flags = r.getMethodAccessFlags(m);
if (name.equals("<clinit>") || (flags & ClassReader.ACC_PRIVATE) == 0) { if (name.equals("<clinit>") || (flags & ClassConstants.ACC_PRIVATE) == 0) {
methods[methodCount] = new Integer(m); methods[methodCount] = new Integer(m);
methodSigs[m] = name + r.getMethodType(m); methodSigs[m] = name + r.getMethodType(m);
if (name.equals("<clinit>")) { if (name.equals("<clinit>")) {

View File

@ -16,6 +16,7 @@ import java.io.Writer;
import com.ibm.wala.shrikeBT.shrikeCT.ClassInstrumenter; import com.ibm.wala.shrikeBT.shrikeCT.ClassInstrumenter;
import com.ibm.wala.shrikeBT.shrikeCT.OfflineInstrumenter; import com.ibm.wala.shrikeBT.shrikeCT.OfflineInstrumenter;
import com.ibm.wala.shrikeCT.ClassConstants;
import com.ibm.wala.shrikeCT.ClassReader; import com.ibm.wala.shrikeCT.ClassReader;
import com.ibm.wala.shrikeCT.ConstantPoolParser; import com.ibm.wala.shrikeCT.ConstantPoolParser;
@ -60,7 +61,7 @@ public class ClassSearcher {
ClassReader r = ci.getReader(); ClassReader r = ci.getReader();
ConstantPoolParser cp = r.getCP(); ConstantPoolParser cp = r.getCP();
for (int i = 1; i < cp.getItemCount(); i++) { for (int i = 1; i < cp.getItemCount(); i++) {
if (cp.getItemType(i) == ConstantPoolParser.CONSTANT_Class && (cp.getCPClass(i).equals(cl1) || cp.getCPClass(i).equals(cl2))) { if (cp.getItemType(i) == ClassConstants.CONSTANT_Class && (cp.getCPClass(i).equals(cl1) || cp.getCPClass(i).equals(cl2))) {
w.write(cp.getCPClass(i) + " " + resource + " " + r.getName() + "\n"); w.write(cp.getCPClass(i) + " " + resource + " " + r.getName() + "\n");
} }
} }