/// <summary> /// Checks whether there is a definition from the beginning to the use node /// </summary> /// <param name="fdef"></param> /// <param name="otherDefinedOffsets"></param> /// <returns></returns> private bool HasDefinitionFromRootToUseNode(DUCoverStore dcs, FieldDefUseStore fuse, HashSet <int> otherDefinedOffsets) { DEFUSE_FEASIBILITY_TYPE feasibilityVal; if (this.feasibilityDicCache.TryGetValue(fuse, out feasibilityVal)) { if (feasibilityVal == DEFUSE_FEASIBILITY_TYPE.USE_FEASIBLE) { return(false); } else { return(true); } } InstructionGraph ig = dcs.GetInstructionGraph(fuse.Method); DepthFirstTraversal dft = new DepthFirstTraversal(ig); InstructionVertex iv = ig.GetVertex(fuse.Offset); var result = dft.HasDefClearPathFromBeginning(iv, otherDefinedOffsets); if (result) { this.feasibilityDicCache[fuse] = DEFUSE_FEASIBILITY_TYPE.USE_FEASIBLE; } else { this.feasibilityDicCache[fuse] = DEFUSE_FEASIBILITY_TYPE.USE_INFEASIBLE; } return(!result); }
/// <summary> /// Checks whether a definition and use are in different methods /// </summary> /// <param name="dcse"></param> /// <returns></returns> private bool IsFeasibleDUCoverEntry(DUCoverStore dcs, FieldDefUseStore fdef, FieldDefUseStore fuse) { //if (fdef.Method.FullName.Contains("AddVertex") && fuse.Method.FullName.Contains("AddVertex") && fdef.Field.FullName.Contains("m_VertexOutEdges") // && fdef.Offset == 13 && fuse.Offset == 2) //{ // int i = 0; //} //check whether the def and use are in the same method if (fdef.Method.Equals(fuse.Method)) { var otherFDefOffsets = this.GetOtherDefOffsetsInMethod(fdef.Method, fdef); InstructionGraph ig = dcs.GetInstructionGraph(fdef.Method); DepthFirstTraversal dft = new DepthFirstTraversal(ig); var source = ig.GetVertex(fdef.Offset); var target = ig.GetVertex(fuse.Offset); return(dft.HasDefClearPathBetweenNodes(source, target, otherFDefOffsets)); } else { var otherFDefOffsets = this.GetOtherDefOffsetsInMethod(fdef.Method, fdef); if (otherFDefOffsets.Count > 0) { if (this.HasRedefinition(dcs, fdef, otherFDefOffsets)) { return(false); } } otherFDefOffsets = this.GetOtherDefOffsetsInMethod(fuse.Method, fdef); if (otherFDefOffsets.Count > 0) { if (this.HasDefinitionFromRootToUseNode(dcs, fuse, otherFDefOffsets)) { return(false); } } return(true); } }
/// <summary> /// Checks whether a definition and use are in different methods /// </summary> /// <param name="dcse"></param> /// <returns></returns> private bool IsFeasibleDUCoverEntry(DUCoverStore dcs, FieldDefUseStore fdef, FieldDefUseStore fuse) { //if (fdef.Method.FullName.Contains("AddVertex") && fuse.Method.FullName.Contains("AddVertex") && fdef.Field.FullName.Contains("m_VertexOutEdges") // && fdef.Offset == 13 && fuse.Offset == 2) //{ // int i = 0; //} //check whether the def and use are in the same method if (fdef.Method.Equals(fuse.Method)) { var otherFDefOffsets = this.GetOtherDefOffsetsInMethod(fdef.Method, fdef); InstructionGraph ig = dcs.GetInstructionGraph(fdef.Method); DepthFirstTraversal dft = new DepthFirstTraversal(ig); var source = ig.GetVertex(fdef.Offset); var target = ig.GetVertex(fuse.Offset); return dft.HasDefClearPathBetweenNodes(source, target, otherFDefOffsets); } else { var otherFDefOffsets = this.GetOtherDefOffsetsInMethod(fdef.Method, fdef); if (otherFDefOffsets.Count > 0) { if (this.HasRedefinition(dcs, fdef, otherFDefOffsets)) return false; } otherFDefOffsets = this.GetOtherDefOffsetsInMethod(fuse.Method, fdef); if (otherFDefOffsets.Count > 0) { if (this.HasDefinitionFromRootToUseNode(dcs, fuse, otherFDefOffsets)) return false; } return true; } }
/// <summary> /// Checks whether the fdef has a redefinition from the current not to the end of the method /// </summary> /// <param name="fdef"></param> /// <param name="otherDefinedOffsets"></param> /// <returns></returns> private bool HasRedefinition(DUCoverStore dcs, FieldDefUseStore fdef, HashSet<int> otherDefinedOffsets) { DEFUSE_FEASIBILITY_TYPE feasibilityVal; if (this.feasibilityDicCache.TryGetValue(fdef, out feasibilityVal)) { if (feasibilityVal == DEFUSE_FEASIBILITY_TYPE.DEF_FEASIBLE) return false; else return true; } InstructionGraph ig = dcs.GetInstructionGraph(fdef.Method); DepthFirstTraversal dft = new DepthFirstTraversal(ig); InstructionVertex iv = ig.GetVertex(fdef.Offset); var result = dft.HasDefClearPathToEnd(iv, otherDefinedOffsets); if (result) this.feasibilityDicCache[fdef] = DEFUSE_FEASIBILITY_TYPE.DEF_FEASIBLE; else this.feasibilityDicCache[fdef] = DEFUSE_FEASIBILITY_TYPE.DEF_INFEASIBLE; return !result; }