private boolean hasDefClearPath(DefUse targetDU,BytecodeInstruction currentVertex,Set<String> handle){
  if (!graph.containsVertex(currentVertex))   throw new IllegalArgumentException("vertex not in graph");
  handle.add(methodName);
  String targetVariable=targetDU.getVariableName();
  if (currentVertex.isDefinitionForVariable(targetVariable))   return false;
  Set<ControlFlowEdge> outgoingEdges=graph.outgoingEdgesOf(currentVertex);
  if (outgoingEdges.size() == 0)   return true;
  for (  ControlFlowEdge e : outgoingEdges) {
    BytecodeInstruction edgeTarget=graph.getEdgeTarget(e);
    if (canBeOverwritingMethod(targetDU,edgeTarget) && !handle.contains(edgeTarget.getCalledMethod()) && canOverwriteDU(targetDU,edgeTarget,handle))     continue;
    if (hasDefClearPath(targetDU,edgeTarget,handle))     return true;
  }
  return false;
}

private boolean hasDefClearPath ( DefUse targetDU , BytecodeInstruction currentVertex , Set < String > handle ) { if ( ! graph . containsVertex ( currentVertex ) ) throw new IllegalArgumentException ( "vertex not in graph" ) ; handle . add ( methodName ) ; String targetVariable = targetDU . getVariableName ( ) ; if ( currentVertex . isDefinitionForVariable ( targetVariable ) ) return false ; Set < ControlFlowEdge > outgoingEdges = graph . outgoingEdgesOf ( currentVertex ) ; if ( outgoingEdges . size ( ) == 0 ) return true ; for ( ControlFlowEdge e : outgoingEdges ) { BytecodeInstruction edgeTarget = graph . getEdgeTarget ( e ) ; if ( canBeOverwritingMethod ( targetDU , edgeTarget ) && ! handle . contains ( edgeTarget . getCalledMethod ( ) ) && canOverwriteDU ( targetDU , edgeTarget , handle ) ) continue ; if ( hasDefClearPath ( targetDU , edgeTarget , handle ) ) return true ; } return false ; }
auxiliary method for hasdefclearpath ( defuse , set )
