private static List<String> contCGtaintsearch(CallGraph cg, CGNode taintNode, String source, List<String> sinks) {
    	List<String> out= new ArrayList<String>();

        IR tIR =taintNode.getIR();
        List<Integer> inTaintvns=new ArrayList<Integer>();
        
        if (source==null){
        	for (int i = 0; i < tIR.getNumberOfParameters(); i++) 
        	     	inTaintvns.addAll(intraIRTaint(i, tIR));
        }
        else
        	inTaintvns =intraIRTaint(Taintvn(source, tIR), tIR);
        
        if (isReturnTaint(inTaintvns, tIR )){
        	Iterator<CGNode> up=cg.getPredNodes(taintNode);
        	while(up.hasNext()){
        		CGNode tCGN = up.next();
        		if(isTaintSink( taintNode.getMethod().getName().toString(), IRvns(tCGN.getIR()), tCGN.getIR() ))
        		out.addAll(contCGtaintsearch( cg, tCGN, taintNode.getMethod().getName().toString(), sinks));
        	}
        }

    	Iterator<CGNode> down=cg.getSuccNodes(taintNode);
    	while(down.hasNext()){
    		CGNode tCGN = down.next();
    		if(isTaintSink( tCGN.getMethod().getName().toString(), inTaintvns, tIR ))
    			out.addAll(contCGtaintsearch( cg, tCGN, null, sinks));
    	}
        
        Iterator<String> sinkIter = sinks.iterator();
        while(sinkIter.hasNext()){
        	String tString = sinkIter.next();
        if (isTaintSink(tString, inTaintvns, tIR)){
        	out.add(tString);
        }
        }
        return out;
    }