@Override public void visitPut(SSAPutInstruction instruction) { IField f = pa.getClassHierarchy().resolveField(instruction.getDeclaredField()); if (f != null) { if (instruction.isStatic()) { result.add(h.getPointerKeyForStaticField(f)); } else { PointerKey ref = h.getPointerKeyForLocal(n, instruction.getRef()); if (ref != null) { for (InstanceKey i : pa.getPointsToSet(ref)) { result.add(h.getPointerKeyForInstanceField(i, f)); } } } } } }
@Override public void visitGet(SSAGetInstruction instruction) { IField f = pa.getClassHierarchy().resolveField(instruction.getDeclaredField()); if (f != null) { if (instruction.isStatic()) { result.add(h.getPointerKeyForStaticField(f)); } else { PointerKey ref = h.getPointerKeyForLocal(n, instruction.getRef()); for (InstanceKey i : pa.getPointsToSet(ref)) { PointerKey x = h.getPointerKeyForInstanceField(i, f); if (x != null) { result.add(x); } } } } } }
@Override public void visitPut(SSAPutInstruction instruction) { IField f = pa.getClassHierarchy().resolveField(instruction.getDeclaredField()); if (f != null) { if (instruction.isStatic()) { result.add(h.getPointerKeyForStaticField(f)); } else { PointerKey ref = h.getPointerKeyForLocal(n, instruction.getRef()); if (ref != null) { for (InstanceKey i : pa.getPointsToSet(ref)) { result.add(h.getPointerKeyForInstanceField(i, f)); } } } } } }
@Override public void visitGet(SSAGetInstruction instruction) { IField f = pa.getClassHierarchy().resolveField(instruction.getDeclaredField()); if (f != null) { if (instruction.isStatic()) { result.add(h.getPointerKeyForStaticField(f)); } else { PointerKey ref = h.getPointerKeyForLocal(n, instruction.getRef()); for (InstanceKey i : pa.getPointsToSet(ref)) { PointerKey x = h.getPointerKeyForInstanceField(i, f); if (x != null) { result.add(x); } } } } } }
public IUnaryFlowFunction makeStaticFieldTaints( BasicBlockInContext<E> dest, SSAInstruction inst, final PairBasedFlowFunction<E> flowFunction) { final Set<DomainElement> elts = HashSetFactory.make(); for (CodeElement ce : getStaticFieldAccessCodeElts((SSAGetInstruction) inst)) { StaticFieldElement sfe = (StaticFieldElement) ce; IField field = pa.getClassHierarchy().resolveField(sfe.getRef()); if (field.isFinal()) { continue; } final StaticFieldFlow<E> taintSource = new StaticFieldFlow<>(dest, field, true); elts.add(new DomainElement(ce, taintSource)); } IUnaryFlowFunction newTaints = new ConstantFlowFunction<>(domain, elts); return compose(flowFunction, newTaints); }
private Set<CodeElement> getArrayRefCodeElts(CGNode node, SSAArrayReferenceInstruction inst) { Set<CodeElement> elts = HashSetFactory.make(); final PointerKey pk = pa.getHeapModel().getPointerKeyForLocal(node, inst.getArrayRef()); final OrdinalSet<InstanceKey> pointsToSet = pa.getPointsToSet(pk); if (pointsToSet.isEmpty()) { TypeReference arrayType = TypeReference.findOrCreateArrayOf(inst .getElementType()); InstanceKey ik = new ConcreteTypeKey(pa.getClassHierarchy() .lookupClass(arrayType)); elts.add(new InstanceKeyElement(ik)); } else { for (InstanceKey ik : pointsToSet) { elts.add(new InstanceKeyElement(ik)); } } return elts; }
if (pointsToSet.isEmpty()) { final IClass contentsClass = pa.getClassHierarchy().lookupClass(typeRef.getArrayElementType()); if (contentsClass.isInterface()) { for (IClass implementor : analysisContext.concreteClassesForInterface(contentsClass)) { if (pointsToSet.isEmpty()) { InstanceKey fieldIK = new ConcreteTypeKey(pa.getClassHierarchy().lookupClass(fieldTypeRef)); final InstanceKeyElement elt = new InstanceKeyElement(fieldIK); if (elts.add(elt)) {
for (IClass impl : pa.getClassHierarchy().getImplementors(typeRef)) {